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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1823|回復: 0
打印 上一主題 下一主題
收起左側

51單片機的TSC2300顏色識別程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:696368 發表于 2020-2-23 06:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己修改的通告LED進行反饋的程序

單片機源程序如下:
  1. /*
  2. * TCS3200模塊
  3. *
  4. * 用途:TCS3200顏色測試,讀取RGB值,LCD1602顯示R,G,B值
  5. *
  6. * 作者                                        日期                                備注
  7. * Huafeng Lin                        2010/12/10                        新增
  8. * Huafeng Lin                        2010/12/11                        修改
  9. *
  10. */

  11. //接線說明:
  12. //模塊S2-----單片機P1.1
  13. //模塊S3-----單片機P1.0
  14. //模塊OUT----單片機P3.5(計數器1輸入)
  15. //模塊VCC----單片機VCC
  16. //模塊GND----單片機GND

  17. #include<REG52.H>        
  18. #include<math.h>       //Keil library  
  19. #include<stdio.h>      //Keil library        
  20. #include<INTRINS.H>

  21. #define uchar unsigned char
  22. #define uint  unsigned int        
  23. #define DataPort P0           //LCD1602 數據端口
  24.         
  25. sbit    LCM_RS=P2^6;   //LCD1602 控制端口               
  26. sbit    LCM_RW=P2^5;   //LCD1602 控制端口        
  27. sbit    LCM_EN=P2^7;   //LCD1602 控制端口

  28. /**引腳定義**/  
  29. sbit s2=P1^1;        //TCS3200 S2
  30. sbit s3=P1^0;        //TCS3200 S3
  31.                      //TCS3200 S0 模塊內部默認上拉
  32.                      //TCS3200 S1 模塊內部默認上拉
  33.                      //TCS3200 OE 模塊內部接地
  34. sbit LEDA=P2^4;
  35. sbit LEDB=P2^2;

  36. sbit test_pin=P1^2;  //用示波器看這個引腳,可知道定時器中斷頻率
  37. //變量、常量定義
  38. uchar ge,shi,bai ;
  39. uchar rp=3,gp=3,bp=6; //定義比例因子,具體環境可以修改
  40. uchar count;          //顏色標志位(0:紅 1:綠 2:藍)

  41. //顯示數組
  42. uchar disp_R[3];  //紅
  43. uchar disp_G[3];  //綠
  44. uchar disp_B[3];  //藍


  45. //********定義函數*****************************
  46. void    delay(unsigned int k);
  47. void    InitLcd();
  48. void    WriteDataLCM(uchar dataW);
  49. void    WriteCommandLCM(uchar CMD,uchar Attribc);
  50. void    DisplayOneChar(uchar X,uchar Y,uchar DData);

  51. //*********LCD1602初始化**********************
  52. void InitLcd()                                
  53. {                        
  54.         WriteCommandLCM(0x38,1);        
  55.         WriteCommandLCM(0x08,1);        
  56.         WriteCommandLCM(0x01,1);
  57.         WriteCommandLCM(0x06,1);        
  58.         WriteCommandLCM(0x0c,1);
  59. }

  60. //**********檢測忙信號************************
  61. void WaitForEnable(void)        
  62. {                                       
  63.         DataPort=0xff;               
  64.         LCM_RS=0;LCM_RW=1;_nop_();
  65.         LCM_EN=1;_nop_();_nop_();
  66.         while(DataPort&0x80);        
  67.         LCM_EN=0;                                
  68. }
  69.                                        
  70. //**********寫命令至LCD***********************
  71. void WriteCommandLCM(uchar CMD,uchar Attribc)
  72. {                                       
  73.         if(Attribc)WaitForEnable();        
  74.         LCM_RS=0;LCM_RW=0;_nop_();
  75.         DataPort=CMD;_nop_();        
  76.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  77. }        
  78.                                 
  79. //**********寫數據至LCD************************
  80. void WriteDataLCM(uchar dataW)
  81. {                                       
  82.         WaitForEnable();               
  83.         LCM_RS=1;LCM_RW=0;_nop_();
  84.         DataPort=dataW;_nop_();        
  85.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  86. }
  87.                                        
  88. //*********寫一個字符數據到指定的目標***********
  89. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  90. {                                                
  91.         Y&=1;                                                
  92.         X&=15;                                                
  93.         if(Y)X|=0x40;                                       
  94.         X|=0x80;                        
  95.         WriteCommandLCM(X,0);               
  96.         WriteDataLCM(DData);               
  97. }

  98. //**********延時函數***************
  99. void delay(unsigned int k)        
  100. {                                                
  101.         unsigned int i,j;                                
  102.         for(i=0;i<k;i++)
  103.         {                        
  104.                 for(j=0;j<121;j++)                        
  105.                 {;}
  106.         }                                                
  107. }                                                            

  108. /*******************************************
  109. * 函數名稱: t0_init()
  110. * 函數功能: 定時器0初始化
  111. * 入口參數: 無
  112. * 出口參數: 無
  113. /********************************************/
  114. void t0_init()
  115. {
  116.         TMOD=0x51;        //T1計數 T0定時 工作方式1
  117.         
  118.         TH1=0x00;        //計數初值
  119.         TL1=0x00;
  120.         
  121.         TH0=0xE0;
  122.         TL0=0x00;        //11。0592M 晶振10ms
  123.         EA=1;            //開中斷
  124.         
  125.         ET0=1;        
  126.         TR0=1;           //啟動
  127.         TR1=1;
  128. }

  129. //*********************************************
  130. //數值轉換出個十百千的ASCII碼
  131. //*********************************************
  132. void conversion(uint temp_data)  
  133. {  
  134.     bai=temp_data/100+0x30 ;
  135.     temp_data=temp_data%100;   //取余運算
  136.     shi=temp_data/10+0x30 ;
  137.     ge=temp_data%10+0x30;      //取余運算
  138. }

  139. /*******************************************
  140. * 函數名稱: main()
  141. /********************************************/
  142. void main()
  143. {
  144.         delay(10);
  145.         InitLcd();      //lcd初始化
  146.         s2=0;           //初始設定S2引腳
  147.         s3=0;           //初始設定S3引腳
  148.         t0_init();      //定時計數初使?


  149.         while(1)
  150.         {
  151.                 DisplayOneChar(0, 0, 'T');
  152.                 DisplayOneChar(1, 0, 'C');
  153.                 DisplayOneChar(2, 0, 'S');
  154.                 DisplayOneChar(3, 0, '2');
  155.                 DisplayOneChar(4, 0, '3');
  156.                 DisplayOneChar(5, 0, '0');

  157.                 DisplayOneChar(10, 0, 'R');
  158.                 DisplayOneChar(11, 0, '[');
  159.                 DisplayOneChar(12, 0, disp_R[0]);
  160.                 DisplayOneChar(13, 0, disp_R[1]);
  161.         
  162.                 DisplayOneChar(14, 0, disp_R[2]);
  163.                 DisplayOneChar(15, 0, ']');        
  164.         
  165.                 DisplayOneChar(0, 1, 'G');
  166.                 DisplayOneChar(1, 1, '[');
  167.                 DisplayOneChar(2, 1, disp_G[0]);
  168.                 DisplayOneChar(3, 1, disp_G[1]);
  169.                 DisplayOneChar(4, 1, disp_G[2]);
  170.                 DisplayOneChar(5, 1, ']');
  171.                
  172.                 DisplayOneChar(10, 1, 'B');
  173.                 DisplayOneChar(11, 1, '[');
  174.                 DisplayOneChar(12, 1, disp_B[0]);
  175.                 DisplayOneChar(13, 1, disp_B[1]);
  176.                 DisplayOneChar(14, 1, disp_B[2]);
  177.                 DisplayOneChar(15, 1, ']');
  178.         
  179.                
  180.                 delay(100) ;        
  181.         }
  182. }

  183. /*******************************************
  184. * 函數名稱: c10ms_out()
  185. * 函數功能: 定時中斷0服務程序
  186.             修改顏色標志disp_tc(0:紅 1:綠 2:藍)
  187.             設置S0 S1 S2 選擇濾波器
  188.             計算脈沖,讀取色值
  189. * 入口參數: 無
  190. * 出口參數: 無
  191. /********************************************/
  192. void c10ms_out() interrupt 1
  193. {
  194.         uint temp;
  195.         test_pin=!test_pin; //測試定時器中斷頻率引腳,可以用示波器觀察
  196.         TR0=0;              //關閉定時
  197.         TR1=0;              //關閉計數
  198.         //   count+1實現先檢測綠色,再檢測藍色,然后檢測紅色,循環檢測      
  199.         if(count==0)
  200.         {
  201.                 count++;   
  202.                 s2=1;s3=1;             //選擇濾波器為綠色     
  203.                
  204.                 temp=(8<<TH1)+TL1;    //計算這段時間內 TCS230 的輸出脈沖數        
  205.                 temp/=rp;                        
  206.                 conversion(temp);
  207.                 disp_R[2]=ge;         //因為這次的中斷,是上次選擇濾波器的數值
  208.                 disp_R[1]=shi;
  209.                 disp_R[0]=bai;


  210.         
  211.         
  212.         }        
  213.         else if(count==1)
  214.         {            
  215.                 count++;
  216.                 s2=1;s3=0;            //選擇濾波器為藍色
  217.                 temp=(8<<TH1)+TL1;    //計算這段時間內 TCS230 的輸出脈沖數        
  218.                 temp/=gp;                        
  219.                 conversion(temp);
  220.                 disp_G[2]=ge;         //因為這次的中斷,是上次選擇濾波器的數值
  221.                 disp_G[1]=shi;
  222.                 disp_G[0]=bai;
  223.         }        
  224.         else if(count==2)
  225.         {            
  226.                 count=0;
  227.                 s2=0;s3=0;            //選擇濾波器為紅色
  228.                
  229.                 temp=(8<<TH1)+TL1;    //計算這段時間內 TCS230 的輸出脈沖數        
  230.                 temp/=bp;               
  231.                 conversion(temp);
  232.                 disp_B[2]=ge;         //因為這次的中斷,是上次選擇濾波器的數值
  233.                 disp_B[1]=shi;
  234.                 disp_B[0]=bai;        
  235.         }
  236.         /****************************************************************************************
  237.         * 判斷顏色的值進行LED反饋
  238.         RGB反饋的數值進行接收然后進行發饋
  239.         /****************************************************************************************/
  240.         
  241.                                 if(disp_R[1]=='4'&&disp_G[1]=='3'&&disp_B[1]=='1')
  242.         {
  243.                 LEDA=0;
  244.                 delay(100);
  245.                 LEDA=1;
  246.         
  247.         }        
  248.                 if(disp_R[1]=='4'&&disp_G[1]=='2'&&disp_B[1]=='0')
  249.         {
  250.                 LEDB=0;
  251.                 delay(100);
  252.                 LEDB=1;
  253.         
  254.         }        
  255.         //定時器計數器重賦初值
  256.         TH0=0xE0;
  257.         TL0=0x00; //11。0592M 晶振,為10ms
  258.         TL1=0x00;//計數器清零
  259.         TH1=0x00;//計數器清零
  260.         TR0=1;   //打開定時器
  261.         TR1=1;   //打開計數器
  262. }
復制代碼

全部資料51hei下載地址:
TCS230.zip (39.02 KB, 下載次數: 15)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级做性受免费大片免费 | 欧美一级片在线观看 | 国产精品久久一区二区三区 | 国产极品91 | 99久久99| 91久久国产综合久久 | 午夜视频免费在线观看 | 亚洲成人精品 | 国产成人免费在线 | 亚洲精品视频一区二区三区 | 亚洲一二三区精品 | 久久9精品 | 欧美一级淫片免费视频黄 | 日产精品久久久一区二区福利 | 久久久国产一区 | 日本精品裸体写真集在线观看 | 成人午夜精品 | 日韩欧美在线不卡 | 自拍视频在线观看 | 午夜视频免费在线观看 | 精品二区| 国精产品一品二品国精在线观看 | 亚洲不卡在线视频 | 婷婷国产一区 | 精品91久久久 | 美女福利视频 | 高清成人免费视频 | 日韩视频中文字幕 | 欧美www在线 | 欧美日韩亚洲一区 | 欧美美女一区二区 | 国内精品久久久久久 | 黄色香蕉视频在线观看 | 操人网站| 一区二区三区免费 | 一区精品视频在线观看 | 久久国产亚洲 | 成人国产一区二区三区精品麻豆 | 一级黄a视频 | 久久久国产一区二区三区 | 国产成人免费 |