单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

TCS3200颜色传感器识别颜色程序

  [复制链接]
跳转到指定楼层
楼主
xuwei 发表于 2015-6-13 19:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************

* 文件名:测试
* 型号:   GY-31
* 功能:   读取RGB值
* 单片机: STC89C52
* 晶振:   11.0592m
* 时间:   2011-3-20
* LCD1602显示R,G,B值
/********************************************/
//接线说明:
//模块S2-----单片机P1.1
//模块S3-----单片机P1.0
//模块OUT----单片机P3.5(计数器1输入)
//模块VCC----单片机VCC
//模块GND----单片机GND
//**********************************************
#include<REG52.H>        
#include<math.h>       //Keil library  
#include<stdio.h>      //Keil library        
#include<INTRINS.H>
#define uchar unsigned char
#define uint  unsigned int        
#define DataPort P0           //LCD1602 数据端口        
sbit    LCM_RS=P2^6;   //LCD1602 控制端口               
sbit    LCM_RW=P2^5;   //LCD1602 控制端口        
sbit    LCM_EN=P2^7;   //LCD1602 控制端口

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

//显示数组
uchar disp_R[3];  //红
uchar disp_G[3];  //绿
uchar disp_B[3];  //蓝

//********定义函数*****************************
void    delay(unsigned int k);
void    InitLcd();
void    WriteDataLCM(uchar dataW);
void    WriteCommandLCM(uchar CMD,uchar Attribc);
void    DisplayOneChar(uchar X,uchar Y,uchar DData);

//*********LCD1602初始化**********************
void InitLcd()                                
{                        
        WriteCommandLCM(0x38,1);        
        WriteCommandLCM(0x08,1);        
        WriteCommandLCM(0x01,1);
        WriteCommandLCM(0x06,1);        
        WriteCommandLCM(0x0c,1);
}

//**********检测忙信号************************
void WaitForEnable(void)        
{                                       
        DataPort=0xff;               
        LCM_RS=0;LCM_RW=1;_nop_();
        LCM_EN=1;_nop_();_nop_();
        while(DataPort&0x80);        
        LCM_EN=0;                                
}
                                       
//**********写命令至LCD***********************
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
        if(Attribc)WaitForEnable();        
        LCM_RS=0;LCM_RW=0;_nop_();
        DataPort=CMD;_nop_();        
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}        
                                
//**********写数据至LCD************************
void WriteDataLCM(uchar dataW)
{                                       
        WaitForEnable();               
        LCM_RS=1;LCM_RW=0;_nop_();
        DataPort=dataW;_nop_();        
        LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
                                       
//*********写一个字符数据到指定的目标***********
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                                
        Y&=1;                                                
        X&=15;                                                
        if(Y)X|=0x40;                                       
        X|=0x80;                        
        WriteCommandLCM(X,0);               
        WriteDataLCM(DData);               
}

//**********延时函数***************
void delay(unsigned int k)        
{                                                
        unsigned int i,j;                                
        for(i=0;i<k;i++)
        {                        
        for(j=0;j<121;j++)                        
        {;}
        }                                                
}                                                            

/*******************************************
* 函数名称: t0_init()
* 函数功能: 定时器0初始化
* 入口参数: 无
* 出口参数: 无
/********************************************/
void t0_init()
{
     TMOD=0x51;        //T1计数 T0定时 工作方式1

     TH1=0x00;        //计数初值
     TL1=0x00;

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

     ET0=1;        
     TR0=1;           //启动
     TR1=1;
}

//*********************************************
//数值转换出个十百千的ASCII码
//*********************************************
void conversion(uint temp_data)  
{  
    bai=temp_data/100+0x30 ;
    temp_data=temp_data%100;   //取余运算
    shi=temp_data/10+0x30 ;
    ge=temp_data%10+0x30;      //取余运算
}

/*******************************************
* 函数名称: c10ms_out()
* 函数功能: 定时中断0服务程序
            修改颜色标志disp_tc(0:红 1:绿 2:蓝)
            设置S0 S1 S2 选择滤波器
            计算脉冲,读取色值
* 入口参数: 无
* 出口参数: 无
/********************************************/
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=0;s3=1;            //选择滤波器为蓝色

                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;   //打开计数器
}


/*******************************************
* 函数名称: main()
/********************************************/
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) ;


     }
}



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

使用道具 举报

沙发
绿源学习者 发表于 2015-6-20 21:14 | 只看该作者
这程序有问题吗?
回复

使用道具 举报

板凳
用户 发表于 2015-7-9 17:09 | 只看该作者
感谢提供,做个记号。
回复

使用道具 举报

地板
grq8888 发表于 2015-7-28 16:21 | 只看该作者
这个模块好像  检测距离比较近  对光照的影响也比较大
回复

使用道具 举报

5#
y1y2 发表于 2015-7-28 18:17 | 只看该作者
检测距离多少??
回复

使用道具 举报

6#
252622979 发表于 2015-8-1 16:31 | 只看该作者
学习了~!~!~!~!~!~!~!~!~!~!~!~!
回复

使用道具 举报

7#
绿源学习者 发表于 2015-8-2 22:13 | 只看该作者
可以了吗,这个程序
回复

使用道具 举报

8#
3033264848 发表于 2015-9-12 14:33 | 只看该作者
我用了这程序,但是RGB总是相同的啊,改了好久也没搞清楚为什么会这样
回复

使用道具 举报

9#
jcaihm 发表于 2016-5-5 20:06 | 只看该作者
我想增加黑白两个颜色该如何改呢?
回复

使用道具 举报

10#
absflash 发表于 2016-5-30 16:10 | 只看该作者
3033264848 发表于 2015-9-12 14:33
**** 作者被禁止或删除 内容自动屏蔽 ****

应该是引脚错误,
回复

使用道具 举报

11#
absflash 发表于 2016-5-30 16:13 | 只看该作者
jcaihm 发表于 2016-5-5 20:06
我想增加黑白两个颜色该如何改呢?

这个测量的是三基色,黑白被定义为两个极端,黑色 0,0,0,白色255,255,255数值不一定相同,越接近越好,

但是我遇到的问题是 程序运行几个小时后,同一种颜色结果就会变得相差很大,真实头疼,这方面的资料还是太少了
回复

使用道具 举报

12#
qwerty112 发表于 2016-7-13 13:51 | 只看该作者
absflash 发表于 2016-5-30 16:13
这个测量的是三基色,黑白被定义为两个极端,黑色 0,0,0,白色255,255,255数值不一定相同,越接近越 ...

你好,我也在弄这个传感器,可以一起学习交流吗?QQ867329431
回复

使用道具 举报

13#
631125 发表于 2016-9-30 18:54 | 只看该作者
小白问个问题识别的颜色信号怎么输出。
回复

使用道具 举报

14#
嘟嘟嘟a嘟嘟嘟 发表于 2016-11-23 10:21 | 只看该作者
学习一下
回复

使用道具 举报

15#
寂寞之雨3 发表于 2017-5-10 20:25 | 只看该作者
楼主您好,可以加QQ好友吗?我想请教您一些关于这方面的问题
回复

使用道具 举报

16#
寂寞之雨3 发表于 2017-5-10 20:27 | 只看该作者
想跟你请教一个关于颜色识别传感器实验的遇到的问题,我的QQ号是758759506
谢谢赐教
回复

使用道具 举报

17#
Swenlong 发表于 2017-10-8 14:47 | 只看该作者
非常感谢!!!
回复

使用道具 举报

18#
LRX1113100356 发表于 2017-10-24 21:13 | 只看该作者
不错,比较有用
回复

使用道具 举报

19#
ChunyuY19 发表于 2017-10-25 19:32 | 只看该作者
下载下来 学习学习
回复

使用道具 举报

20#
EVOLVINGINS 发表于 2018-2-26 11:07 | 只看该作者
很好呀!!!学习一下
回复

使用道具 举报

21#
公路小江湖 发表于 2018-5-14 22:21 | 只看该作者
我也有疑惑。按照这个程序烧到单片机里,LCD1602显示的RGB确实数值都是一样的,检查过硬件的连接没有问题。有没有高手给解释一下,感激
回复

使用道具 举报

22#
公路小江湖 发表于 2018-5-14 22:21 | 只看该作者
3033264848 发表于 2015-9-12 14:33
**** 作者被禁止或删除 内容自动屏蔽 ****

哥们你的问题解决了么? 遇到了和你一样的问题
回复

使用道具 举报

23#
1017990143@qq.c 发表于 2018-7-7 13:32 | 只看该作者
学习学习你的程序
回复

使用道具 举报

24#
284213945 发表于 2018-8-26 20:18 | 只看该作者
我下到单片机里去之后RBG值不准啊,是不是白平衡的问题
回复

使用道具 举报

25#
lxy12 发表于 2019-1-12 17:35 | 只看该作者
您好,请问这个有连接原理图么
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51hei电子论坛2群 联系QQ:125739409;技术交流QQ群219535678

Powered by 单片机教程网

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