基于51单片机的颜色识别系统docWord格式.docx
《基于51单片机的颜色识别系统docWord格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的颜色识别系统docWord格式.docx(21页珍藏版)》请在冰豆网上搜索。
(1602液晶屏)
(连接好1602液晶屏)
(为了方便检测小物料和白平衡检测,需要自己做一个小平台,俩饮料瓶盖子,一颗自攻螺丝即可搞定!
)
(做好的平台,为了方便白平衡,需要在上面盖子上划俩口子,只要能卡住一张白纸即可!
(最终效果)
(全家福)
(连接好TCS3200模块)
(白平衡测试,注意:
上电前必须白平衡检测,不然后面检测的颜色都不会准确的;
检测方法:
白纸放在TCS3200模块前面1公分处,然后单片机上电,只要第一次读出的值为255,255,255即可,否则请重新进行白平衡!
(白平衡的结果,现在就可以进行颜色识别了)
(识别到绿色娃娃的颜色,上位机上面的颜色为识别到的颜色,同时液晶上会显示RGB值)
(识别到黄色娃娃的颜色值)
(识别到粉红色娃娃的颜色值)
(上位机显示粉红色娃娃的颜色)
(上位机界面)
(这俩高尔夫球的识别,但是结果不准确,估计是这俩高尔夫球的反光能力太强烈了,只要表面不是很光滑的物体检测出来误差都是很小的,另外,有网友说要放在黑盒子里检测,我感觉没必要,只要白平衡做好了基本就没什么问题了,至于表面特别光滑的物体,只能去寻找其他方法去进行检测了!
=========================测试程序========================#include"
reg52.h"
#define_dataP2//LCD1602数据接口
/******************************************************************
-说明:
端口定义
-备注:
无
******************************************************************/
sbitEN=P0^5;
//读写使能,高电平有效,下降沿锁定数据。
sbitRW=P0^6;
//读/写选择:
高电平为读数据,低电平为写数据。
sbitRS=P0^7;
//数据/指令选择:
高电平为数据,低电平为指令。
sbittcs230_s2=P1^0;
//TCS3200S2P1.0
sbittcs230_s3=P1^1;
//TCS3200S3P1.1
//TCS3200OUT接P3.5
变量定义
unsignedintRyz,Gyz,Byz;
//分别定义红色因子绿色因子蓝色因子
unsignedintRzhi,Gzhi,Bzhi;
//RGB值
unsignedcharcodenum[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
A'
B'
C'
D'
E'
F'
};
/******************************************************************
-功能描述:
延时子程序
-入口参数:
长整数型
-参数值:
0-65535
-返回说明:
-备注:
voiddelay1ms(unsignedintms)//延时1毫秒(不够精确的)
{
unsignedinti,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
100;
j++);
}
voiddelay600ms(void)
unsignedchara,b,c;
for(c=89;
c>
0;
c--)
for(b=230;
b>
b--)
for(a=12;
a>
a--);
写数据子程序
数据
字节型
voidwdat(unsignedchardat)
delay1ms
(1);
RS=1;
RW=0;
EN=0;
_data=dat;
EN=1;
写命令子程序
voidwcmd(unsignedcharcom)
RS=0;
_data=com;
初始化子程序
voidinit_1602(void)
{
delay1ms(15);
wcmd(0x38);
delay1ms(5);
//功能设置8位总线2行显示5*7点阵
wcmd(0x06);
//设置输入模式光标右移整体不移
wcmd(0x08);
//设置显示方式显示关
wcmd(0x01);
//清除显示
wcmd(0x0c);
//设置显示方式显示开无光标光标不闪烁
指定位置写字符函数
行,列,字符
voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharin)
X&
=0x1;
//限制X值为0和1
Y&
=0xF;
//限制Y值为0-15
if(X)
{Y|=0x40;
}//当要显示第二行时地址码+0x40;
Y|=0x80;
//得出列位置
wcmd(Y);
//写地址
wdat(in);
//写数据
发送数据到上位机
数据1,数据2,数据3
voidSendOneByte(unsignedcharina,unsignedcharinb,unsignedcharinc)
TMOD=0x20;
SCON=0x50;
TH1=0xFD;
TL1=TH1;
PCON=0x00;
EA=1;
ES=1;
TR1=1;
SBUF=ina;
while(!
TI);
TI=0;
SBUF=inb;
SBUF=inc;
白平衡函数
voidbaipingheng(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)
//取蓝色因子
tcs230_s3=1;
//选择蓝色滤光器
Byz=TH1*256+TL1;
//求绿色因子
tcs230_s2=1;
//选择绿色滤光器
Gyz=TH1*256+TL1;
测量颜色值
voidceyanse(void)
TMOD=0x51;
TH0=(65536-10000)/256;
//求R值
TL0=(65536-10000)%256;
TH1=0;
TL1=0;
tcs230_s2=0;
tcs230_s3=0;
TR0=1;
TR1=1;
while(TF0==0);
TF0=0;
TR0=0;
TR1=0;
Rzhi=(unsignedlong)(TH1*256+TL1)*255/Ryz;
if(Rzhi>
255)Rzhi=255;
//判断RGB值是否合法
//求B值
tcs230_s3=1;
Bzhi=(unsignedlong)(TH1*256+TL1)*255/Byz;
if(Bzhi>
255)Bzhi=255;
//判断RGB值是否合法
//求G值
tcs230_s2=1;
Gzhi=(unsignedlong)(TH1*256+TL1)*255/Gyz;
if(Gzhi>
255)Gzhi=255;
voidmain(void)
init_1602();
//LCD初始
baipingheng();
//上电时先白平衡一次
while
(1)
{
ceyanse();
//颜色测试
DisplayOneChar(0,0,'
R'
);
//以十进制显示RGB中红色的分值
DisplayOneChar(0,1,Rzhi/100+0x30);
//显示百位数据
DisplayOneChar(0,2,Rzhi/10%10+0x30);
//显示十位数据
DisplayOneChar(0,3,Rzhi%10+0x30);
//显示个位数据
DisplayOneChar(0,5,'
G'
//以十进制显示RGB中绿色的分值
DisplayOneChar(0,6,Gzhi/100+0x30);
DisplayOneChar(0,7,Gzhi/10%10+0x30);
DisplayOneChar(0,8,Gzhi%10+0x30);
DisplayOneChar(0,10,'
//以十进制显示RGB中蓝色的分值
DisplayOneChar(0,11,Bzhi/100+0x30);
DisplayOneChar(0,12,Bzhi/10%10+0x30);
DisplayOneChar(0,13,Bzhi%10+0x30);
//*****在LCD1602的第二行以16进制显示RGB*******************
DisplayOneChar(1,1,num[Rzhi/16]);
DisplayOneChar(1,2,num[Rzhi%16]);
DisplayOneChar(1,3,'
H'
DisplayOneChar(1,6,num[Gzhi/16]);
DisplayOneChar(1,7,num[Gzhi%16]);
DisplayOneChar(1,8,'
DisplayOneChar(1,11,num[Bzhi/16]);
DisplayOneChar(1,12,num[Bzhi%16]);
DisplayOneChar(1,13,'
SendOneByte(Rzhi,Gzhi,Bzhi);
//发送数据到上位机
delay600ms();
//每隔0.6秒测试一次颜色
}
}
===========================《完》==========================