徐州工程学院毕业设计(论文)
红色滤波器,S0为高电平1,S1为低电平0,表明以20%的方式输出频率。在绿色通道中,设置S2、S3都为低电平1,表明选择绿色滤波器,S0为高电平1,S1为低电平0,表明以20%的方式输出频率。在蓝色通道中,设置S2为低电平0,S3为高电平1,表明选择蓝色滤波器,S0为高电平1,S1为低电平0,表明以20%的方式输出频率。具体程序如下:
void red() //红色通道 { P1=0x01;
delay1ms(1100); date=disp/100;
//153是在纯白情况下测得的红色通道频率值
date=(255.0/153)*date; }
void green() //绿色通道 { P1=0xc1;
delay1ms(1100); date=disp/100;
date=(255.0/145)*date; } //145是在纯白情况下测得的绿色通道频率值
//蓝色通道
void blue() { P1=0x81;
delay1ms(1100); date=disp/100;
date=(255.0/183)*date; } //183是在纯白情况下测得的蓝色通道频率值
4.4 4个白色LED补光模块的设计
因为本设计的TCS230颜色采集模块需要在密闭的环境下实现,所以需要另外添加一个稳定的光源。本模块主要是用4个白色的LED光,照在待检测的物体上,然后反射到TCS230颜色传感器上,达到合适的光强的目的。电路图设计如图4.5所示。
4.5 LCD1602液晶显示模块
4.5.1 LCD1602液晶显示模块硬件设计
本设计中的LCD1602液晶显示模块主要是和MCS-51单片机的P0口和P2口连接的。Vss管脚接地,Vcc管脚接+5V电源,Vo管脚接地,RS管脚接P2.0管脚,RW管脚接P2.1管脚,E管脚接P2.7管脚,D0-D7管脚依次接P0.0-P0.7管脚,A管脚接+5V电源,K管脚接地。
P0口是一个三态双向口,可作为地址/数据分时复用接口,也可作为通用的I/O接口。它由一个输出锁存器、两个三态缓冲器、输出驱动电路和输出控制电路组成。
P2口也是准双向口,它有两种用途:通用I/O接口和高8位地址线。与P1口相比,它只在输出驱动电路上比P1口多了一个模拟转换开关MUX和反相器。
27
4.5.2 LCD1602液晶显示模块软件设计
LCD1602与51单片机的具体连接方式如图4.6所示。
徐州工程学院毕业设计(论文)
图4.5 白色LED补光模块电路图
图4.6 LCD1602与51单片机的具体连接图
28
徐州工程学院毕业设计(论文)
单片机处理后的数据设定光标显示位置整型数转化成字符型数组以字符串方式输出LCD1602初始化和清屏输出结束是否显示完成图4.7 LCD1602显示模块流程图
本设计的LCD1602液晶显示模块主要是利用比较经典的LCD显示方法来进行设计的,即字符串的方式进行输出显示。流程图如图4.7所示。
首先,将MCS-51单片机处理所得的最终数据送入uchar * int2str(uint d)函数,此函数的功能是将接收到的整型数d的每个位的数字取出,放到一个字符型的数组str[]中,以便LCD1602输出显示,具体程序如下:
uchar * int2str(uint d) //整型数转化成字符型数组函数 { }
其次,对LCD1602进行初始化和清屏,使用8位数据,显示两行,使用5*7的字型;显示器打开,关闭光标闪烁;输出方式为字符不动,光标自动右移一格。具体程序如下: void init_LCD(void) // 初始化lcd
{ LCD_w_com(0x38); // lcd为两行显示8位数据线有效 LCD_w_com(0x0e); // 显示字符 关闭光标
LCD_w_com(0x06); // 输入方式设置 光标向右移动一位 ac-1 }
void clear_LCD()
//清屏
{ LCD_w_com(0x01); //清屏指令
LCD_w_com(0x02); // 光标归位 即光标置于左上位置 }
最后,是向LCD1602液晶显示器写命令函数void LCD_w_com(unsigned com)和写数据str[0]='0'+d/100; str[1]='0'+d0/10; str[2]='0'+d; return str;
29
徐州工程学院毕业设计(论文)
函数void LCD_w_dat(uchar dat)以及字符串输出函数void display_LCD_string(uchar *p)、光标定位函数void gotoxy(unsigned x,unsigned y)。写命令函数的功能是向LCD1602中写入相应的命令指令,比如清屏命令LCD_w_com(0x01),实现LCD1602清屏功能。写数据函数和字符串输出函数的功能是向LCD1602写入要输出的数据,字符串输出函数中定义的指针P指向前面的字符型数组str[],一位一位的输出。光标定位函数的功能是告诉LCD1602要输出的数据的显示位置。具体程序如下: void LCD_w_com(unsigned com) { RW=0; RS=0; E=1; P0=com; delay1ms(10); E=0; RW=1; }
void LCD_w_dat(uchar dat) // 写数据 函数, 写要显示的数据 { RW=0; RS=1; E=1; P0=dat; delay1ms(10); E=0; RW=1; }
void display_LCD_string(uchar *p)//字符串输出函数 { while(*p)
{ LCD_w_dat(*p); p++; delay1ms(10); }}
void gotoxy(unsigned x,unsigned y) //定位 ,x为行,y为列 { if(x==1) LCD_w_com(0x80+y); else LCD_w_com(0xC0+y); }
//写命令函数,com为 要写的指令
4.6 本章小结
本章对整个系统所包含的几个模块进行了详细的介绍和设计,包括TCS230驱动模块、TCS230颜色采集模块、LED补光模块以及LCD1602液晶显示模块。其中TCS230颜色采集模块、LCD1602液晶显示模块是最重要的部分。颜色采集模块利用TCS230颜色传感器进行数据采集,以数字量输出,送到51单片机里进行数据处理,最后通过LCD1602液晶显示器显示出来。
30
徐州工程学院毕业设计(论文)
5 色彩识别系统的实验
5.1色彩识别的实验过程
事物是随时间变化而运动变化的,由于本系统对软硬件关联性要求很高,其整个实验过程中间变化过程很复杂,一般仿真无法实现。
本设计的实验过程很简单,具体操作如下:首先将开发板接通电源,将色彩纸板放平,其次把设计中的颜色采集模块放在待测的纸板上,放正放平,最后用隔光较好的纸张或者盒子将颜色采集模块遮盖起来,然后用笔记录LCD显示的值,依次测量不同颜色的纸板并记录数据即可。
在实验过程中进行了多次的测量试验,记录的一些数据如下图5.1
颜色纯白结果第一次第二次第三次第一次第二次第三次第一次第二次第三次第一次第二次第三次R253255249166166166078075069035028031G246250252036047036131128133043045042B243253250044041040061062058107101105图像纯红纯绿纯蓝图5.1 实验数据
5.2 实验结果分析
通过上面的实验仿真结果可以看出,如果被测物体的颜色中,红色成分比较多,那么在显示的输出结果中的R的值就大;同样的,如果绿色成分多,输出结果中的G的值就大,如果蓝色成分多,输出结果中的B的值就大。表格最后一列给出了这些颜色值对应的色彩图像,而表格的第一列给出了标准的色彩图像,可以看出,实际测得值与标准值之间还存在着一定的误差,这些误差产生的原因有很多,其中之一就是外界干扰光的存在,其次因为传感器芯片对光的敏感性不同,此外可能的原因包括补光模块中的LED二极管发出的光不稳定,还可能因为物体对光的反射能力不同等等,所有的这些原因导致了在测量的过程中存在的误差在所难免,只有不断的改善,以达到减小误差的目的,所以本系统还有待更进一步的研究以改善整个系统。
5.3 本章小结
通过实验,验证了色彩识别系统的可行性,通过对纯白色、纯红色、纯绿色、纯蓝色
31