找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1473|回复: 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, 下载次数: 14)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表