久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7317|回復: 11
收起左側

TCS3200顏色識別-51單片機源碼 LCD1602液晶顯示

  [復制鏈接]
ID:192696 發表于 2017-4-23 15:29 | 顯示全部樓層 |閱讀模式
此款源碼,是用于51單片機顏色識別所用,所用模塊還有TCS3200和LCD1602,適合畢業設計(僅限本科)和課余自樂!
0.png

單片機源程序:
  1. #include <reg52.h>                                //添加STC89C52所需頭文件
  2. #include <string.h>
  3. #define uchar unsigned char                //宏定義無符號字符型變量
  4. #define uint  unsigned  int                //宏定義無符號整型變量
  5. uchar str[3];                                        //定義數組
  6. uchar *s;                                                //定義指針
  7. uint date;                            //定義數據類型
  8. uint dispcount=0;                    //中斷計數
  9. uint lck=0;                                    //定時器計數
  10. uint disp=0;                            //頻率值計數
  11. sbit RS=P1^0;                            //數據/命令選擇端,高電平-數據寄存器,低-指令寄存器
  12. sbit RW=P1^1;                            //讀/寫選擇端,高-讀操作,低-寫操作
  13. sbit E=P2^5;                                        //使能端
  14. sbit s0 = P2^0;                                        //聲明引腳
  15. sbit s1 = P2^1;
  16. sbit s3 = P1^7;
  17. sbit s2 = P1^6;
  18. sbit oe = P1^2;
  19. /**************************************************
  20.                         延遲函數,延時1ms  
  21. **************************************************/
  22. void delay1ms(uint i)
  23. {  uint j;
  24.    while(i--)
  25.    {       
  26.                  for(j=0;j<125;j++);
  27.    }
  28. }
  29. /**************************************************
  30.                          初始化STC89C52        
  31. **************************************************/
  32. void initTimer(void){         //定時器0初始化函數,包括裝入初值,設置定時時間為1ms
  33.        
  34.         TMOD=0x0;
  35.         TH0=0xe0;
  36.         TL0=0x18;
  37. }
  38. void timer0(void) interrupt 1{        //定時器函數                                                          
  39.         TH0=0xe0;                         //裝入初值
  40.         TL0=0x18;                        //裝入初值(定時器中斷每1ms中斷一次)
  41.         lck++;                                //設置累加變量,累加1000次即為1S
  42.         if(lck==1000){                 //判斷是否到了1S
  43.                 disp=dispcount; //將外部中斷0內的累加數據(接收TCS3200的脈沖次數)賦值給disp,便于傳遞參數
  44.                 lck=0;                        //對累加變量清零,用于下1S的累加計數
  45.                 dispcount=0;        //對外部中斷0的累加數據進行清零,便于下一次對脈沖的計數
  46.        }
  47. }
  48. void int0(void) interrupt 0{//外部中斷0的處理函數
  49.         dispcount++;                 //外部中斷0,TCS3200的OUT端口接到了STC89C52的INT0端口
  50.                                                 //每一次中斷,計數加1,當到達1S時,將此數據放在定時器函數中計數
  51. }
  52. /*******RGB三種顏色通道選擇模塊       
  53. **************************************************/  
  54. void red()               
  55. {                        //紅色通道選通函數
  56.         oe = 0;        //使能TCS3200
  57.         s2 = 0;        //選通紅色濾波器
  58.         s3 = 0;
  59.         s0 = 0;        //設置輸出為2%比率
  60.         s1 = 1;
  61.         delay1ms(1100);//延遲1S
  62.         date=disp/100;//依據方法2,求出比例系數
  63.         date=(255.0/153)*date;//153是在純白情況下測得的紅色通道頻率值
  64. }
  65. void green() //綠色通道選通函數
  66. {       
  67.         s0 = 0;
  68.         s1 = 1;        //設置輸出2%的比率
  69.         oe = 0;
  70.         s2 = 1;
  71.         s3 = 1;
  72.         delay1ms(1100);
  73.         date=disp/100;
  74.         date=(255.0/145)*date;//145是在純白情況下測得的綠色通道頻率值
  75. }
  76. void blue()                          //藍色通道
  77. {       
  78.         //P1=0x81;
  79.         s0 = 0;
  80.         s1 = 1;
  81.         s3 = 1;
  82.         s2 = 0;
  83.         oe = 0;
  84.         delay1ms(1100);
  85.         date=disp/100;
  86.         date=(255.0/183)*date;        //183是在純白情況下測得的藍色通道頻率值
  87. }
  88. /**************************************************
  89.          整型數轉化成字符串,以便LCD輸出顯示       
  90. **************************************************/
  91. uchar * int2str(uint d)
  92. {        if(d>=255)
  93.         { d=255;
  94. str[0]='0'+d/100;
  95. str[1]='0'+d%100/10;
  96.       str[2]='0'+d%10;        }
  97.         else
  98.         { str[0]='0'+d/100;
  99.           str[1]='0'+d%100/10;
  100.       str[2]='0'+d%10; }
  101.         return str;
  102. }
  103. /*****LCD顯示模塊*********/

  104. void LCD_w_com(unsigned com)                                  //寫命令函數,com為        要寫的指令
  105. {  RW=0; RS=0; E=1;
  106.    P0=com; delay1ms(10);
  107.    E=0; RW=1;
  108. }
  109. void LCD_w_dat(uchar dat)                   // 寫數據 函數,        寫要顯示的數據
  110. {  RW=0; RS=1; E=1;
  111.    P0=dat; delay1ms(10);
  112.    E=0; RW=1;
  113. }
  114. void init_LCD(void)                                                // 初始化lcd
  115. {  LCD_w_com(0x38);                             // lcd為兩行顯示8位數據線有效
  116.    LCD_w_com(0x0e);                                     // 顯示字符  關閉光標
  117.    LCD_w_com(0x06);                    // 輸入方式設置 光標向右移動一位 ac-1
  118. }
  119. void clear_LCD()                                                                    //清屏
  120. {            
  121.    LCD_w_com(0x01);                                              //清屏指令
  122.    LCD_w_com(0x02);                          // 光標歸位 即光標置于左上位置
  123. }
  124. void display_LCD_string(uchar *p)                              //字符串輸出函數
  125. {  while(*p)
  126.    {  LCD_w_dat(*p); p++; delay1ms(10); }
  127. }
  128. void gotoxy(unsigned x,unsigned y)                              //定位  ,x為行,y為列
  129. {  if(x==1)  LCD_w_com(0x80+y);
  130.    else      LCD_w_com(0xC0+y);
  131. }

  132. /**************************************************
  133.                      主函數       
  134. **************************************************/
  135. void main(void)
  136. {  IT0=1;                                                //INT0下降沿中斷
  137.    EX0=1;                                                 //允許INT0中斷
  138.    initTimer();                                                  //裝入初值
  139.    TR0=1;                                                          //開定時器T0
  140.    ET0=1;                                                          //允許T0中斷
  141.    EA=1;                                                          //中斷總控制
  142.    init_LCD();                                                 //LCD初始化
  143.    clear_LCD();   //清屏
  144.    while(1)
  145.    {  
  146.           gotoxy(1,00); display_LCD_string("R:"); red();        //調用紅色通道并顯示色彩值
  147.       

  148. …………限于本文篇幅 余下代碼請從51黑論壇下載附件…………
復制代碼
下載:
MyColorTest.zip (38.03 KB, 下載次數: 202)
回復

使用道具 舉報

ID:283987 發表于 2018-9-13 14:54 | 顯示全部樓層
謝謝分享
回復

使用道具 舉報

ID:403334 發表于 2018-10-29 10:09 來自手機 | 顯示全部樓層
你好,請問out接哪個口?
回復

使用道具 舉報

ID:397663 發表于 2018-11-5 18:35 | 顯示全部樓層
TCS3200跟openmv相比哪個比較好用啊??
回復

使用道具 舉報

ID:379099 發表于 2018-12-17 16:10 | 顯示全部樓層
為什么下載后程序打不開?
回復

使用道具 舉報

ID:508997 發表于 2019-5-4 18:16 | 顯示全部樓層
樓主還在嗎,我有一些問題想要請教你
回復

使用道具 舉報

ID:551325 發表于 2019-5-30 20:39 | 顯示全部樓層
為什么下載后程序打不開?
回復

使用道具 舉報

ID:328014 發表于 2019-5-31 01:56 | 顯示全部樓層
F滄海一聲笑 發表于 2019-5-30 20:39
為什么下載后程序打不開?

可以打開啊 keil4
回復

使用道具 舉報

ID:858523 發表于 2021-9-27 18:30 | 顯示全部樓層
為什么我測出來的G值和B值都是0?
回復

使用道具 舉報

ID:942417 發表于 2021-12-19 17:32 | 顯示全部樓層
Sinclair! 發表于 2018-11-5 18:35
TCS3200跟openmv相比哪個比較好用啊??

OPENmv好用
回復

使用道具 舉報

ID:208271 發表于 2023-3-24 11:52 | 顯示全部樓層
實測,有數據,但數據不準,不建議使用
回復

使用道具 舉報

ID:433219 發表于 2023-3-24 14:16 | 顯示全部樓層
有沒有大佬推薦下類似的  CMYK色  判讀傳感器 ?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男人天堂999 | 特黄一级| 欧美日韩国产一区二区三区 | 色免费视频 | 国产91丝袜在线播放 | 久久精品电影 | 久久亚洲天堂 | 亚洲喷水| 色网站入口 | 久久99精品国产99久久6男男 | 亚洲精品视频在线观看视频 | 午夜视频免费在线观看 | 国产一区二区三区视频 | 成人在线亚洲 | 色噜噜亚洲男人的天堂 | 成人一区二区三区在线观看 | www.99re| 精品中文字幕久久 | 久久精品国产一区二区电影 | 51ⅴ精品国产91久久久久久 | 一区二区三区四区在线 | 超碰最新在线 | 日韩在线播放中文字幕 | 黄色在线观看国产 | 久久99网 | 国产一区二区三区精品久久久 | 成人午夜免费网站 | 99精品国产一区二区三区 | 久久综合九色综合欧美狠狠 | 日韩电影免费观看中文字幕 | 日本高清不卡视频 | 欧美日韩在线看 | 免费黄色在线 | 毛片免费看 | 国产精品久久久久久久久久 | 日韩精品免费在线观看 | 欧美激情综合 | 夜夜爽99久久国产综合精品女不卡 | 色婷婷久久综合 | 一区二区三区四区免费观看 | 欧美精品在欧美一区二区 |