1、参考网上程序或者模块提供的程序
2、仔细参读datasheet,尤其研究时序以及逻辑功能的实现
3、多动脑筋思考,学会调试程序,多百度Google。
/*模块的使用方法:把板距离白纸2CM处开机,使输出的数据位FFFFFFF(白平衡),接下来就可以正常使用实现功能:对颜色传感器输出RGB
使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
晶振:12MHZ
编译环境:Keil
作者:zhengzhongxign39*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3 |
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4 |
|DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
|DB3-----P0.3 | DB7-----P0.7 |
---------------------------------------------------*/
//================================================*/
#define LCM_Data P0 //LCD1602数据接口
#define Busy 0x80 //用于检测LCM状态腔好字中的Busy标识
sbit LCM_RW = P2^3 //读写控制输入端,LCD1602的第五脚
sbit LCM_RS = P2^4 //寄存器选择输入端,LCD1602的第四脚
sbit LCM_E = P2^2 //使能信号输入端,LCD1602的第6脚
//=================颜色传感模块连接=====================
/*-----------------------------------------------------
|EO-----GND
|S0-----VCC | S2-----P2.0 | OUT-------P3.5
|S1-----VCC | S3-----P2.1 |
---------------------------------------------------*/
sbit tcs230_s2=P2^0//TCS230 S2接单片机P2.0
sbit tcs230_s3=P2^1//TCS230 S3接单片机P2.1
sbit tcs230_en=P3^0 //TCS230 EN(E0)接GND
//**************函数声明***************************************
void WriteDataLCM (uchar WDLCM)//LCD模块写数据
void WriteCommandLCM (uchar WCLCM,BuysC) //LCD模块写指令
uchar ReadStatusLCM(void)//读LCD模块的忙标
void DisplayOneChar(uchar X,uchar Y,uchar ASCII)//在第X+1行的第Y+1位置显示一个字符
void LCMInit(void)//LCD初始
void DelayMs(uint Ms)//1MS基准延时程序
void baipingheng()//白山圆旅平衡子程序
void 逗凳 celiang()//实际颜色程序
uint ryz,gyz,byz//分别定义红色因子 绿色因子 蓝色因子
uint rb,gb,bb//RGB值
uchar tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}
//***********************主程序******************************
main()
{
TMOD=0x51//设定T0以工作方式1定时10毫秒
LCMInit()//LCD初始
baipingheng()//上电时先白平衡一次
while(1)
{
celiang()//颜色测试
DisplayOneChar(0, 0,'R')//以十进制显示RGB中红色的分值
DisplayOneChar(0, 1, rb/100+0x30) //显示百位数据
DisplayOneChar(0, 2, rb/10%10+0x30)//显示十位数据
DisplayOneChar(0, 3, rb%10+0x30)//显示个位数据
DisplayOneChar(0, 5,'G')//以十进制显示RGB中绿色的分值
DisplayOneChar(0, 6, gb/100+0x30) //显示百位数据
DisplayOneChar(0, 7, gb/10%10+0x30)
DisplayOneChar(0, 8, gb%10+0x30)
DisplayOneChar(0, 10,'B')//以十进制显示RGB中蓝色的分值
DisplayOneChar(0, 11, bb/100+0x30)
DisplayOneChar(0, 12, bb/10%10+0x30)
DisplayOneChar(0, 13, bb%10+0x30)
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1, 1, tab1[rb/16])
DisplayOneChar(1, 2, tab1[rb%16])
DisplayOneChar(1, 3, 'H')
DisplayOneChar(1, 6, tab1[gb/16])
DisplayOneChar(1, 7, tab1[rb%16])
DisplayOneChar(1, 8, 'H')
DisplayOneChar(1, 11,tab1[bb/16])
DisplayOneChar(1, 12,tab1[bb%16])
DisplayOneChar(1, 13,'H')
DelayMs(250)//每隔0.25秒测试一次颜色
}
}
//******************************************************
//白平衡子程序
void celiang()
{
//*********求R值************************************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=0//选择红色滤光器
tcs230_en=0
TR0=1//10毫秒开始计时
TR1=1//开始计数
while(TF0==0)//等待定时器溢出
TF0=0//清楚定时器0溢出标志
TR0=0//关闭定时0
TR1=0
rb=(unsigned long)(TH1*256+TL1)*255/ryz
if(rb>255)rb=255//判断RGB值是否合法
//***********求B值**************************************
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
bb=(unsigned long)(TH1*256+TL1)*255/byz
if(bb>255)bb=255//判断RGB值是否合法
//***********求G值**************************************
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
tcs230_en=1
gb=(unsigned long)(TH1*256+TL1)*255/gyz
if(gb>255)gb=255//判断RGB值是否合法
}
//******************************************************
//白平衡子程序
void baipingheng()
{
//**************求取红色因子***********************
TH0=(65536-10000)/256
TL0=(65536-10000)%256
TH1=0
TL1=0
tcs230_s2=0
tcs230_s3=0//选择红色滤光器
tcs230_en=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
tcs230_en=1
gyz=TH1*256+TL1//其实这里的比例因子应该为255/(TH1*256+TL1)
}
/*======================================================================
LCM初始化
其他程序网上自己找找参照
彩的颜察孙色检测器,包括了一块TAOSTCS3200RGB感应芯片和4个白光LED灯,TCS3200能在一定的范围内检测和测量几乎所有的可见光。它适合于色度计测量应用领域。比如彩色打印、医疗诊断、计算机彩色监视器校准以及油漆、纺织品、化妆品和印刷材料的过程控制。 通常所看到的物体颜色,实际上是物体表面吸收了照射到它上面的白光(日光)中的一部分有色成分,而反射出的另一部分有色光在人眼中的反应。白色是由各种频率的可见光混合在一起构成的,也就是说白光中包含着各种颜色的色光(如红R、黄Y、绿G、青V、蓝B、紫P)。根据德国物理学家赫姆霍兹(Helinholtz)的三原色理论可知,各种颜色是由不同比例的三原色(红、绿、蓝)混合而成的。 由上面的三原色感应原理可知,如果知道构成各种颜色的三原色的值,就能够知道所测试物体的颜色。对于TCS3200D来说,当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其它原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其它的滤波器,就可以得到蓝色光和绿首脊色光的光强。通过这三个光强值,就可以分析出反射到TCS3200D传感器上的光的颜色。 TCS3200D传感器有红绿蓝和清除4种滤光器,可以通过其引脚S2和S3的高低电平来选败芹链择滤波器模式。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)