## TCS230颜色识别——STC89C52RC
连线
代码
其他说明
1.连线
连线
实物图
2.代码
#include "reg52.h"
#include "LCD1602.h"
#include "Delay.h"
sbit tcs230_s2=P1^0; //TCS3200 S2 P1.0
sbit tcs230_s3=P1^1; //TCS3200 S3 P1.1
//TCS3200 OUT 接P3.5
/******************************************************************
- 说明:变量定义
- 备注:无
******************************************************************/
unsigned int Ryz,Gyz,Byz; //分别定义红色因子 绿色因子 蓝色因子
unsigned int Rzhi,Gzhi,Bzhi; //RGB值
unsigned char code num[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/******************************************************************/
void baipingheng(void)//白平衡
{
TMOD=0x51; //设定T0以工作方式1定时10毫秒
TH0=(65536-10000)/256; //取红色因子
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=0; //选择红色滤光器
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Ryz=TH1*256+TL1; //其实这里的比例因子应该为255/(TH1*256+TL1)
TH0=(65536-10000)/256; //取蓝色因子
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=1; //选择蓝色滤光器
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Byz=TH1*256+TL1; //其实这里的比例因子应该为255/(TH1*256+TL1)
TH0=(65536-10000)/256; //求绿色因子
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=1;
tcs230_s3=1; //选择绿色滤光器
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Gyz=TH1*256+TL1; //其实这里的比例因子应该为255/(TH1*256+TL1)
}
/******************************************************************
- 功能描述:测量颜色值
- 入口参数:无
- 参 数 值:无
- 返回说明:无
- 备 注:无
******************************************************************/
void ceyanse(void)//颜色采集
{
TMOD=0x51; //设定T0以工作方式1定时10毫秒
TH0=(65536-10000)/256; //求R值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0; //选择红色滤光器
tcs230_s3=0;
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Rzhi=(unsigned long)(TH1*256+TL1)*255/Ryz;
if(Rzhi>255)Rzhi=255; //判断RGB值是否合法
TH0=(65536-10000)/256; //求B值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=1; //选择蓝色滤光器
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Bzhi=(unsigned long)(TH1*256+TL1)*255/Byz;
if(Bzhi>255)Bzhi=255; //判断RGB值是否合法
TH0=(65536-10000)/256; //求G值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=1;
tcs230_s3=1; //选择绿色滤光器
TR0=1; //10毫秒开始计时
TR1=1; //开始计数
while(TF0==0); //等待定时器溢出
TF0=0; //清除定时器0溢出标志
TR0=0; //关闭定时0
TR1=0;
Gzhi=(unsigned long)(TH1*256+TL1)*255/Gyz;
if(Gzhi>255)Gzhi=255; //判断RGB值是否合法
}
void main(void)
{
LCD_Init();
baipingheng();//上电时先白平衡一次
while(1)
{
ceyanse(); //颜色测试
LCD_ShowChar(1, 1,'R');//以十进制显示RGB中红色的分值
LCD_ShowChar(2, 1, Rzhi/100+0x30); //显示百位数据
LCD_ShowChar(2,2, Rzhi/10%10+0x30);//显示十位数据
LCD_ShowChar(2, 3, Rzhi%10+0x30);//显示个位数据
LCD_ShowChar(1, 5,'G');//以十进制显示RGB中绿色的分值
LCD_ShowChar(2,6, Gzhi/100+0x30); //显示百位数据
LCD_ShowChar(2,7, Gzhi/10%10+0x30);
LCD_ShowChar(2,8, Gzhi%10+0x30);
LCD_ShowChar(1,10,'B');//以十进制显示RGB中蓝色的分值
LCD_ShowChar(2,11, Bzhi/100+0x30);
LCD_ShowChar(2,12, Bzhi/10%10+0x30);
LCD_ShowChar(2,13, Bzhi%10+0x30);
Delay(600);
*****在LCD1602的第二行以16进制显示RGB*******************
//LCD_ShowChar(2 1, num[Rzhi/16]);
//LCD_ShowChar(2 2, num[Rzhi%16]);
//LCD_ShowChar(2 3, 'H');
//LCD_ShowChar(2, 6, num[Gzhi/16]);
//LCD_ShowChar(2 7, num[Gzhi%16]);
//LCD_ShowChar(2 8, 'H');
//LCD_ShowChar(2, 11,num[Bzhi/16]);
//LCD_ShowChar(2 12,num[Bzhi%16]);
//LCD_ShowChar(2 13,'H');
}
}
3.其他说明
之前做比赛需要用到颜色识别,当时尝试用这个模块,效果不是很好,而且需要占用几个定时器资源,本来是想移植到stc8h我们比赛要用的单片机上,但最终效果不如一个光敏电阻识别灵敏和便捷。最后,程序会在LCD1602上显示三原色,由于最终没使用这个模块,后面的根据三原色判断颜色就没再写。