• 51单片机驱动TCS3200颜色识别传感器


    在这里插入图片描述

    TCS3200

    简介

    TCS3200颜色传感器是一款全彩的颜色检测器,包括了一块TAOS TCS3200RGB感应芯片和4个白色LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。TCS3200有大量的光检测器,每个都有红绿蓝和清除4种滤光器。每种颜色滤光器均匀地按数组分布来清除颜色中偏移位置的颜色分量。内置的振荡器能输出方波,其频率与所选择的光的强度成比例关系,光线越强,内置的振荡器方波频率越高。

    输出频率与滤光器选择说明

    TCS3200D的OUT脚输出的信号频率与内置振荡器频率的比率因子可以通过S0,S1的上下电平来选择,具体入下图
    在这里插入图片描述
    根据图中的指示配置S0,S1的电平可以把输出的信号频率设置为100%、20%、2%与0%,分别为600KHz、120KHz与12KHz。
    由三原色原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色,TCS3200D有4个滤光器可以阻止某一种颜色的光通过,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。
    TCS3200传感器上的红、绿、蓝、和清除4种滤光器,可以通过其引脚S2和S3的上下电平来选择滤波器模式,如如下图。
    在这里插入图片描述

    实验说明

    本次实验将用51单片机驱动TCS3200颜色识别模块,通过1602LCD屏幕把识别到的三原色打印出来。
    51单片机(STC89C52RC)

    在这里插入图片描述

    点击图片购买

    1602LCD液晶显示器

    在这里插入图片描述

    点击图片购买

    接线

    51单片机TCS32001602LCD
    5VVCC
    GNDGND
    P1_1S2
    P1_0S3
    P3_5OUT
    P2DATA
    P0_7RS
    P0_6RW
    P0_5EN

    在这里插入图片描述
    由0原理图可知,S0,S1已经上拉,输出信号频率为100%
    在这里插入图片描述

    驱动

    驱动说明

    设置定时器为一固定时间(例如10 ms),然后通过选择三种颜色的滤波器,计算这段时间内TCS230的输出脉冲数,计算出一个比例因子,通过这个比例因子可以把这些脉冲数变为255。在实际测试时,使用同样的时间进行计数,把测得的脉冲数再乘以求得的比例因子,然后就可以得到所对应的R、G和B的值。

    主要代码

    void c10ms_out() interrupt 1
    {  uint temp;
            test_pin=!test_pin; //测试定时器中断频率引脚,可以用示波器观察
            TR0=0;              //关闭定时
            TR1=0;              //关闭计数
     //   count+1实现先检测绿色,再检测蓝色,然后检测红色,循环检测       
            if(count==0)
            {
            count++;    
            s2=1;s3=1;             //选择滤波器为绿色     
    	    
    		temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数	
    		temp/=rp;			
            conversion(temp);
    		disp_R[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
    		disp_R[1]=shi;
    		disp_R[0]=bai;
            } 
    
            else if(count==1)
            {            
            count++;
            s2=1;s3=0;            //选择滤波器为蓝色
    		temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数	
    		temp/=gp;			
            conversion(temp);
    		disp_G[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
    		disp_G[1]=shi;
    		disp_G[0]=bai;
            }
    
            else if(count==2)
            {            
            count=0;
            s2=0;s3=0;            //选择滤波器为红色
    
    		temp=(8<<TH1)+TL1;    //计算这段时间内 TCS230 的输出脉冲数	
    		temp/=bp;		
            conversion(temp);
      	    disp_B[2]=ge;         //因为这次的中断,是上次选择滤波器的数值
    		disp_B[1]=shi;
    		disp_B[0]=bai;
    
            }
    
         //定时器计数器重赋初值
         TH0=0xE0;
         TL0=0x00; //11。0592M 晶振,为10ms
         TL1=0x00;//计数器清零
         TH1=0x00;//计数器清零
         TR0=1;   //打开定时器
         TR1=1;   //打开计数器
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    主函数

    void main()
    {
    
          delay(10); 
          InitLcd();      //lcd初始化
    	  s2=0;           //初始设定S2引脚
    	  s3=0;           //初始设定S3引脚
          t0_init();      //定时计数初使化
    
         while(1)
         {
         
            DisplayOneChar(0,0,'G'); 
    		DisplayOneChar(1,0,':'); 
    		DisplayOneChar(2,0,disp_G[0]); 
    		DisplayOneChar(3,0,disp_G[1]); 
    		DisplayOneChar(4,0,disp_G[2]); 		//绿
    
            DisplayOneChar(6,0,'B'); 
    		DisplayOneChar(7,0,':'); 
    		DisplayOneChar(8,0,disp_B[0]); 
    		DisplayOneChar(9,0,disp_B[1]); 
    		DisplayOneChar(10,0,disp_B[2]);     //蓝
    
    
    		DisplayOneChar(0,1,'R'); 
    		DisplayOneChar(1,1,':'); 
    		DisplayOneChar(2,1,disp_R[0]); 
    		DisplayOneChar(3,1,disp_R[1]); 
    		DisplayOneChar(4,1,disp_R[2]); 	    //红				
    
            delay(100) ; 
    
    
         }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    实验现象

    在这里插入图片描述

    在这里插入图片描述

    验证:

    在这里插入图片描述

    实验注意事项:

    颜色识别时要避免外界光线的干扰,否则会影响颜色识别的结果。最好把传感器、光源等放置在一个密闭、无反射的箱子中进行测试,上面的实验由于环境与手机拍视角度光线的反射等因素影响,看着会有些许色差。

  • 相关阅读:
    被 CSDN,伤透了心
    SpringCloud-Ribbon和Feign快速上手
    华为数通方向HCIP-DataCom H12-831题库(单选题:241-260)
    DNS查询流程
    详解 localStorage、sessionStorage和cookie区别
    【从零开始学习 SystemVerilog】11.1、SystemVerilog 断言—— Assertions Introduction(断言概述)
    MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
    Java中split方法简介
    记录--用JS轻松实现一个录音、录像、录屏的工具库
    .bss (the block starting symbol)
  • 原文地址:https://blog.csdn.net/qq_42250136/article/details/126461261