找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2772|回复: 2
收起左侧

颜色传感器单片机不能读取数值,各位好,能不能指导一下小弟的东西?

[复制链接]
ID:222738 发表于 2017-7-27 12:13 | 显示全部楼层 |阅读模式
如题。求各位大佬帮忙。如图,一个颜色传感器,一个单片机。我现有的程序只能让LCD屏显示,并不能读取颜色传感器的数值,求大佬帮忙。另外,接线的话。能不能也请各位指导一下。。拜谢。。。
QQ图片20170727121229.jpg QQ图片20170727121235.jpg
程序如下:

  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<reg51.h>
  18. #include<lcd.h>         
  19. #include<math.h>       //Keil library  
  20. #include<stdio.h>      //Keil library        
  21. #include<INTRINS.H>
  22. #define uchar unsigned char
  23. #define uint  unsigned int        
  24. #define DataPort P0           //LCD1602 数据端口        
  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. sbit s1=P1^2;        //TCS3200 S1
  32. sbit s0=P1^3;        //TCS3200 S0
  33.                      //TCS3200 S0 模块内部默认上拉
  34.                      //TCS3200 S1 模块内部默认上拉
  35.                      //TCS3200 OE 模块内部接地
  36. sbit test_pin=P1^2;  //用示波器看这个引脚,可知道定时器中断频率
  37. //变量、常量定义
  38. uchar ge,shi,bai ;
  39. uchar rp=2,gp=2,bp=2; //定义比例因子,具体环境可以修改
  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. //**********延时函数***************
  52. void delay(unsigned int k)        
  53. {                                                
  54.         unsigned int i,j;                                
  55.         for(i=0;i<k;i++)
  56.         {                        
  57.         for(j=0;j<121;j++)                        
  58.         {;}
  59.         }                                                
  60. }                                                            

  61. /*******************************************
  62. * 函数名称: t0_init()
  63. * 函数功能: 定时器0初始化
  64. * 入口参数: 无
  65. * 出口参数: 无
  66. /********************************************/
  67. void t0_init()
  68. {
  69.      TMOD=0x51;        //T1计数 T0定时 工作方式1

  70.      TH1=0x00;        //计数初值
  71.      TL1=0x00;

  72.      TH0=0xE0;
  73.      TL0=0x00;        //11。0592M 晶振10ms
  74.      EA=1;            //开中断

  75.      ET0=1;        
  76.      TR0=1;           //启动
  77.      TR1=1;
  78. }

  79. //*********************************************
  80. //数值转换出个十百千的ASCII码
  81. //*********************************************
  82. void conversion(uint temp_data)  
  83. {  
  84.     bai=temp_data/100+0x30 ;
  85.     temp_data=temp_data%100;   //取余运算
  86.     shi=temp_data/10+0x30 ;
  87.     ge=temp_data%10+0x30;      //取余运算
  88. }

  89. /*******************************************
  90. * 函数名称: c10ms_out()
  91. * 函数功能: 定时中断0服务程序
  92.             修改颜色标志disp_tc(0:红 1:绿 2:蓝)
  93.             设置S0 S1 S2 选择滤波器
  94.             计算脉冲,读取色值
  95. * 入口参数: 无
  96. * 出口参数: 无
  97. /********************************************/
  98. void c10ms_out() interrupt 1
  99. {  uint temp;
  100.         test_pin=!test_pin; //测试定时器中断频率引脚,可以用示波器观察
  101.         TR0=0;              //关闭定时
  102.         TR1=0;              //关闭计数
  103. //   count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测      
  104.         if(count==0)
  105.         {
  106.         count++;   
  107.         s2=1;s3=1;             //选择滤波器为绿色     
  108.          
  109.                 temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数        
  110.                 temp/=rp;                        
  111.         conversion(temp);
  112.                 disp_R[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  113.                 disp_R[1]=shi;
  114.                 disp_R[0]=bai;
  115.         }

  116.         else if(count==1)
  117.         {            
  118.         count++;
  119.         s2=0;s3=1;            //选择滤波器为蓝色

  120.                 temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数        
  121.                 temp/=gp;                        
  122.         conversion(temp);
  123.                 disp_G[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  124.                 disp_G[1]=shi;
  125.                 disp_G[0]=bai;
  126.         }

  127.         else if(count==2)
  128.         {            
  129.         count=0;
  130.         s2=0;s3=0;            //选择滤波器为红色

  131.                 temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数        
  132.                 temp/=bp;               
  133.         conversion(temp);
  134.               disp_B[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
  135.                 disp_B[1]=shi;
  136.                 disp_B[0]=bai;

  137.         }

  138.      //定时器计数器重赋初值
  139.      TH0=0xE0;
  140.      TL0=0x00; //11。0592M 晶振,为10ms
  141.      TL1=0x00;//计数器清零
  142.      TH1=0x00;//计数器清零
  143.      TR0=1;   //打开定时器
  144.      TR1=1;   //打开计数器
  145. }


  146. /*******************************************
  147. * 函数名称: main()
  148. /********************************************/
  149. void main()
  150. {
  151.       delay(10);
  152.       LcdInit();                  //LCD初始化子程序
  153.           s2=0;           //初始设定S2引脚
  154.           s3=0;           //初始设定S3引脚
  155.       t0_init();      //定时计数初使化

  156.      while(1)
  157.      {     
  158.         LcdWriteCom(0x80);
  159.                 LcdWriteData('G');
  160.                 LcdWriteData(':');
  161.                 LcdWriteData(disp_G[0]);
  162.                 LcdWriteData(disp_G[1]);
  163.                 LcdWriteData(disp_G[2]);   //绿

  164.                 LcdWriteCom(0x80+6);
  165.                 LcdWriteData('B');
  166.                 LcdWriteData(':');
  167.                 LcdWriteData(disp_B[0]);
  168.                 LcdWriteData(disp_B[1]);
  169.                 LcdWriteData(disp_B[2]);   //蓝

  170.                 LcdWriteCom(0xc0);
  171.                 LcdWriteData('R');
  172.                 LcdWriteData(':');
  173.                 LcdWriteData(disp_R[0]);
  174.                 LcdWriteData(disp_R[1]);
  175.                 LcdWriteData(disp_R[2]);   //红

  176.         delay(100) ;
  177.      }
  178. }
复制代码



回复

使用道具 举报

ID:82765 发表于 2017-7-27 17:58 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:123289 发表于 2017-7-27 23:38 | 显示全部楼层
研读传感器手册
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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