|
这次课程设计主要用的TCS3200颜色传感器,附件里面有传感器的原理,结构图,调试例程
TCS3200颜色传感器简介:
TCS3200颜色传感模块电路及实验电路图:
控制板是通用型的,可以控制语音模块 、超声波模块、AD模块等,如果只是颜色传感器用,AT24C01部分、按键部分可以不焊接;
超声波控制板电路原理图:
51单片机源程序:
- /*模块的使用方法:把板距离白纸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初始化
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
下载:
TCS3200颜色传感器配套资料.rar
(603.14 KB, 下载次数: 504)
|
评分
-
查看全部评分
|