找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5482|回复: 4
打印 上一主题 下一主题
收起左侧

GY-31 TCS3200颜色传感器单片机源程序与资料下载

[复制链接]
跳转到指定楼层
楼主
TCS3200的辅助设计电路原理图如下:


单片机源程序如下:
  1. /*******************************************
  2. * 文件名: TCS3200颜色测试
  3. * 型号:   GY-31
  4. * 功能:   读取RGB值
  5. * 单片机: STC89C52
  6. * 晶振:   11.0592m
  7. * 时间:   2011-3-20
  8. * LCD1602显示R,G,B值
  9. /********************************************/
  10. //接线说明:
  11. //模块S2-----单片机P1.1
  12. //模块S3-----单片机P1.0
  13. //模块OUT----单片机P3.5(计数器1输入)
  14. //模块VCC----单片机VCC
  15. //模块GND----单片机GND
  16. //**********************************************
  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. sbit    LCM_RS=P2^0;   //LCD1602 控制端口        
  25. sbit    LCM_RW=P2^1;   //LCD1602 控制端口   
  26. sbit    LCM_EN=P2^2;   //LCD1602 控制端口

  27. /**引脚定义**/  
  28. sbit s2=P1^1;        //TCS3200 S2
  29. sbit s3=P1^0;        //TCS3200 S3
  30.                      //TCS3200 S0 模块内部默认上拉
  31.                      //TCS3200 S1 模块内部默认上拉
  32.                      //TCS3200 OE 模块内部接地
  33. sbit test_pin=P1^2;  //用示波器看这个引脚,可知道定时器中断频率
  34. //变量、常量定义
  35. uchar ge,shi,bai ;
  36. uchar rp=2,gp=2,bp=2; //定义比例因子,具体环境可以修改
  37. uchar count;          //颜色标志位(0:红 1:绿 2:蓝)

  38. //显示数组
  39. uchar disp_R[3];  //红
  40. uchar disp_G[3];  //绿
  41. uchar disp_B[3];  //蓝

  42. //********定义函数*****************************
  43. void    delay(unsigned int k);
  44. void    InitLcd();
  45. void    WriteDataLCM(uchar dataW);
  46. void    WriteCommandLCM(uchar CMD,uchar Attribc);
  47. void    DisplayOneChar(uchar X,uchar Y,uchar DData);

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

  57. //**********检测忙信号************************
  58. void WaitForEnable(void)   
  59. {                    
  60.     DataPort=0xff;        
  61.     LCM_RS=0;LCM_RW=1;_nop_();
  62.     LCM_EN=1;_nop_();_nop_();
  63.     while(DataPort&0x80);   
  64.     LCM_EN=0;               
  65. }
  66.                     
  67. //**********写命令至LCD***********************
  68. void WriteCommandLCM(uchar CMD,uchar Attribc)
  69. {                    
  70.     if(Attribc)WaitForEnable();   
  71.     LCM_RS=0;LCM_RW=0;_nop_();
  72.     DataPort=CMD;_nop_();   
  73.     LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  74. }   
  75.                
  76. //**********写数据至LCD************************
  77. void WriteDataLCM(uchar dataW)
  78. {                    
  79.     WaitForEnable();        
  80.     LCM_RS=1;LCM_RW=0;_nop_();
  81.     DataPort=dataW;_nop_();   
  82.     LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  83. }
  84.                     
  85. //*********写一个字符数据到指定的目标***********
  86. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  87. {                        
  88.     Y&=1;                        
  89.     X&=15;                        
  90.     if(Y)X|=0x40;                    
  91.     X|=0x80;            
  92.     WriteCommandLCM(X,0);        
  93.     WriteDataLCM(DData);        
  94. }

  95. //**********延时函数***************
  96. void delay(unsigned int k)   
  97. {                        
  98.     unsigned int i,j;               
  99.     for(i=0;i<k;i++)
  100.     {            
  101.     for(j=0;j<121;j++)            
  102.     {;}
  103.     }                        
  104. }                                    

  105. /*******************************************
  106. * 函数名称: t0_init()
  107. * 函数功能: 定时器0初始化
  108. * 入口参数: 无
  109. * 出口参数: 无
  110. /********************************************/
  111. void t0_init()
  112. {
  113.      TMOD=0x51;        //T1计数 T0定时 工作方式1
  114.      
  115.      TH1=0x00;        //计数初值
  116.      TL1=0x00;

  117.      TH0=0xE0;
  118.      TL0=0x00;        //11。0592M 晶振10ms
  119.      EA=1;            //开中断

  120.      ET0=1;        
  121.      TR0=1;           //启动
  122.      TR1=1;
  123. }

  124. //*********************************************
  125. //数值转换出个十百千的ASCII码
  126. //*********************************************
  127. void conversion(uint temp_data)  
  128. {  
  129.     bai=temp_data/100+0x30 ;
  130.     temp_data=temp_data%100;   //取余运算
  131.     shi=temp_data/10+0x30 ;
  132.     ge=temp_data%10+0x30;      //取余运算
  133. }

  134. /*******************************************
  135. * 函数名称: c10ms_out()
  136. * 函数功能: 定时中断0服务程序
  137.             修改颜色标志disp_tc(0:红 1:绿 2:蓝)
  138.             设置S0 S1 S2 选择滤波器
  139.             计算脉冲,读取色值
  140. * 入口参数: 无
  141. * 出口参数: 无
  142. /********************************************/
  143. void c10ms_out() interrupt 1
  144. {  uint temp;
  145.         test_pin=!test_pin; //测试定时器中断频率引脚,可以用示波器观察
  146.         TR0=0;              //关闭定时
  147.         TR1=0;              //关闭计数
  148. //   count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测      
  149.         if(count==0)
  150.         {
  151.         count++;   
  152.         s2=1;s3=1;             //选择滤波器为绿色     
  153.       
  154.         temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数   
  155.         temp/=rp;            
  156.         conversion(temp);
  157.         disp_R[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  158.         disp_R[1]=shi;
  159.         disp_R[0]=bai;
  160.         }

  161.         else if(count==1)
  162.         {            
  163.         count++;
  164.         s2=0;s3=1;            //选择滤波器为蓝色

  165.         temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数   
  166.         temp/=gp;            
  167.         conversion(temp);
  168.         disp_G[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  169.         disp_G[1]=shi;
  170.         disp_G[0]=bai;
  171.         }

  172.         else if(count==2)
  173.         {            
  174.         count=0;
  175.         s2=0;s3=0;            //选择滤波器为红色
  176.       
  177.         temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数   
  178.         temp/=bp;        
  179.         conversion(temp);
  180.           disp_B[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  181.         disp_B[1]=shi;
  182.         disp_B[0]=bai;

  183.         }

  184.      //定时器计数器重赋初值
  185.      TH0=0xE0;
  186.      TL0=0x00; //11。0592M 晶振,为10ms
  187.      TL1=0x00;//计数器清零
  188.      TH1=0x00;//计数器清零
  189.      TR0=1;   //打开定时器
  190.      TR1=1;   //打开计数器
  191. }


  192. /*******************************************
  193. * 函数名称: main()
  194. /********************************************/
  195. void main()
  196. {

  197.       delay(10);
  198.       InitLcd();      //lcd初始化
  199.       s2=0;           //初始设定S2引脚
  200.       s3=0;           //初始设定S3引脚
  201.       t0_init();      //定时计数初使化

  202.      while(1)
  203.      {
  204.      
  205.         DisplayOneChar(0,0,'G');
  206.         DisplayOneChar(1,0,':');
  207.         DisplayOneChar(2,0,disp_G[0]);
  208.         DisplayOneChar(3,0,disp_G[1]);
  209.         DisplayOneChar(4,0,disp_G[2]);         //绿

  210.         DisplayOneChar(6,0,'B');
  211.         DisplayOneChar(7,0,':');
  212.         DisplayOneChar(8,0,disp_B[0]);
  213.         DisplayOneChar(9,0,disp_B[1]);
  214.         DisplayOneChar(10,0,disp_B[2]);     //蓝


  215.         DisplayOneChar(0,1,'R');
  216.         DisplayOneChar(1,1,':');
  217.         DisplayOneChar(2,1,disp_R[0]);
  218.         DisplayOneChar(3,1,disp_R[1]);
  219.         DisplayOneChar(4,1,disp_R[2]);         //红               

  220.         delay(100) ;


  221.      }
  222. }
复制代码

程序下载:
GY-31颜色模块发送资料.7z (1.65 MB, 下载次数: 111)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:990652 发表于 2021-12-10 19:07 | 只看该作者
有电路实图吗

回复

使用道具 举报

板凳
ID:1016593 发表于 2022-4-13 14:44 | 只看该作者
请问一下,为什么上面的程序压缩包里没有啊
回复

使用道具 举报

地板
ID:262 发表于 2022-4-13 16:28 | 只看该作者
yhmjjm 发表于 2022-4-13 14:44
请问一下,为什么上面的程序压缩包里没有啊

里面有,我找到了 在STC-GY-31颜色模块测试 里面的STC51_TCS3200.C
回复

使用道具 举报

5#
ID:1016593 发表于 2022-4-14 19:41 | 只看该作者
heicad 发表于 2022-4-13 16:28
里面有,我找到了 在STC-GY-31颜色模块测试 里面的STC51_TCS3200.C

好的,谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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