基于51单片机的颜色识别系统docWord格式.docx

上传人:b****5 文档编号:19835182 上传时间:2023-01-10 格式:DOCX 页数:21 大小:2.80MB
下载 相关 举报
基于51单片机的颜色识别系统docWord格式.docx_第1页
第1页 / 共21页
基于51单片机的颜色识别系统docWord格式.docx_第2页
第2页 / 共21页
基于51单片机的颜色识别系统docWord格式.docx_第3页
第3页 / 共21页
基于51单片机的颜色识别系统docWord格式.docx_第4页
第4页 / 共21页
基于51单片机的颜色识别系统docWord格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于51单片机的颜色识别系统docWord格式.docx

《基于51单片机的颜色识别系统docWord格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机的颜色识别系统docWord格式.docx(21页珍藏版)》请在冰豆网上搜索。

基于51单片机的颜色识别系统docWord格式.docx

(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秒测试一次颜色

}

}

===========================《完》==========================

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1