基于农产品检测系统程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*定义管脚*/
sbit RS = P3^5;
sbit RW = P3^6;
sbit E = P3^4;
sbit RES = P2^0;
sbit LCD_PSB = P3^7;
sbit keyON=P1^2; //1
sbit keyOFF=P1^3; //2
sbit aaa=P2^7;
sbit bbb=P2^6;
//sbit tcs230_en=P1^4;//YCS230引脚
sbit tcs230_s2=P1^5;//YCS230引脚gao
sbit tcs230_s3=P1^6;//YCS230引脚
#define Lcd_Bus P0 //MCU P0 LCM
//#define FIRST_ADDR 0x00 //定义字符/汉字显示起始位置
uchar key=0,white_flag=0,balance_flag=0,T1_COUNT=0,T1_TIME=0;
void chk_busy();//检查忙状态
void delay_ms(uint t);
void write_cmd(unsigned char cmdcode);//命令
void write_data(unsigned char Dispdata);//数据
void LCD_Init();//初始化
void write_xbyte(unsigned char code *s);//多个字节的数据
//void clrgdram();//清空
void LCD_Position(uchar X,uchar Y);//在某个位置显示字符
void Primary_interface();
void Secondary_interface();
void Third_interface();
void Fourth_interface();
void fifth_interface();
void keyscan();
void white_balance();
void detection();
void zhuchengxu();
void zhuchengxu2();
void zhuchengxu3();
void zhuchengxu4();
void T_Init();
void send(uchar r,uchar c,uint RGB0[3][3]);
void BCD_shi();
uint RGB[3][3]={
48,48,48,
48,48,48};
uint RGB2[3][3]={
48,48,48,
48,48,48,
48,48,48};
uint BLUE3=0,GREEN3=0,RED3=0;
uint
BLUE=0,GREEN=0,RED=0,BLUE1=0,GREEN1=0,RED1=0,BLUE2=0,GREEN2=0,RED2=0; /*------------------检查忙位-----------------------------*/
void chk_busy()
{
Lcd_Bus=0xff;
RS=0;
RW=1;
E=1;
while((Lcd_Bus&0x80)==0x80);
E=0;
}
/*------------------延时子程序-----------------------------*/
void delay_ms(uint t)
{
uint i,j;
for(i=0;i
for(j=0;j
}
/*------------------写命令到LCD------------------------------*/
void write_cmd(unsigned char cmdcode)
{
chk_busy(); //查忙
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
delay_ms(5);////////////////////在数据写入的时候加入适当的延时
E=0;
delay_ms(5);
}
/*-------------------写数据到LCD----------------------------*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RW=0;
E=1;
Lcd_Bus=Dispdata;
delay_ms(5);///////////////////在数据写入的时候加入适当的延时
E=0;
delay_ms(5);
}
/*------------------初始化LCD 屏--------------------------*/
void LCD_Init()
{
LCD_PSB=1; //并口方式
write_cmd(0x30); //基本指令操作
delay_ms(5);
write_cmd(0x0c); //开显示(无游标、不反白)
delay_ms(5);
write_cmd(0x01); //清除显示,并且设定地址指针为00H
delay_ms(5);
write_cmd(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay_ms(5);
}
void T_Init()
{
IE=0X00;//T1,EA=1
//T2CON=0X02;
TR1=0;
//T2作为外部计数装置
T2CON=0X02;
TMOD=0X10;//定时器1
TH2=0X00;
TL2=0X00;
//T1作为计时器
}
void T_Init0()
{
IE=0X00;
TR1=0;
T2CON=0X02;//计数器
TMOD=0X10;//定时器1
TH2=0X00;
TL2=0X00;
TH1=0X00;
TL1=0X00;
}
void write_xbyte(unsigned char code *s)
{
while(*s>0)
{ write_data(*s);
s++;
}
}
/*------------------清整个GDRAM 空间----------------------------
void clrgdram()
{
unsigned char x,y;
for(y=0;y
for(x=0;x
{
write_cmd(0x34);
write_cmd(y+0x80); //行地址
write_cmd(x+0x80); //列地址
write_cmd(0x30);
write_data(0x00);
write_data(0x00);
}
} */
void LCD_Position(uchar X,uchar Y)
{
uchar position;
switch(X)
{
case 1:
X=0X80;
break;
case 2:
X=0X90;
break;
case 3:
X=0X88;
break;
case 4:
X=0X98;
break;
}
position=X+Y;
write_cmd(position);//显示
void Primary_interface()
{
LCD_Position(1,0);
write_xbyte("欢迎使用");
LCD_Position(2,0);
write_xbyte("农产品检测仪器");
LCD_Position(3,0);
write_xbyte("研制单位:");
LCD_Position(4,0);
write_xbyte("天津农学院机电系");
delay_ms(5000);
write_cmd(0x01);
}
void Secondary_interface()
{
write_cmd(0x01);//清屏
LCD_Position(2,0);
write_xbyte("是否需要白平衡?");
LCD_Position(3,2);
write_xbyte("Yes NO");
}
void white_balance()//白平衡程序
{
char i,j;
for(i=0;i
{
tcs230_s2=1;//清除颜色
tcs230_s3=0;
if(balance_flag==1)//说明是进行颜色平衡
{
T_Init0();//R 计数器2进行计数至满中断,定时器1进行计时中断 //balance_flag=0;
}
else
{
T_Init();//R 定时器计时中断,计数器2不中断
if(i==0)
{
TH1=(65536-RED3)/256;//计时
TL1=(65536-RED3)%256;
}
if(i==1)
TH1=(65536-BLUE3)/256;//计时 TL1=(65536-BLUE3)%256; } if(i==2) { TH1=(65536-GREEN3)/256;//计时 TL1=(65536-GREEN3)%256; } IE=0X80;//T1,EA=1 } if(i==0) { tcs230_s2=0;//红色 tcs230_s3=0; } if(i==1) { tcs230_s2=0;//蓝色 tcs230_s3=1; } if(i==2) { tcs230_s2=1;//绿色 tcs230_s3=1; } delay_ms(5); //T2CON=0X04; TR1=1; TR2=1; if(balance_flag==1) { while(TF2==0); TF1=0; TF2=0; } else { while(TF1==0); TF1=0; if(i==0) { for(j=RED1;j>0;j--)
TR1=0; TH1=0; TL1=0; TR1=1; while(TF1==0); TF1=0; } } if(i==1) { for(j=BLUE1;j>0;j--) { TR1=0; TH1=0; TL1=0; TR1=1; while(TF1==0); TF1=0; } } if(i==2) { for(j=GREEN1;j>0;j--) { TR1=0; TH1=0; TL1=0; TR1=1; while(TF1==0); TF1=0; } } } TR1=0; TR2=0; if(balance_flag==1) { if(i==0) { RED1=200*T1_TIME+T1_COUNT; //时间 RED3=TH1*256+TL1;//时间 T1_TIME=0;
T1_COUNT=0;
}
if(i==1)
{
BLUE1=200*T1_TIME+T1_COUNT;
BLUE3=TH1*256+TL1;//时间
T1_TIME=0;
T1_COUNT=0;
}
if(i==2)
{
GREEN1=200*T1_TIME+T1_COUNT;
GREEN3=TH1*256+TL1;//时间
T1_TIME=0;
T1_COUNT=0;
balance_flag=0;
}
}
else
{
if(i==0)
RED=TH2*256+TL2;//计数
if(i==1)
BLUE=TH2*256+TL2; //计数
if(i==2)
GREEN=TH2*256+TL2;//计数
}
}
white_flag=1;
}
void BCD_shi()
{
RGB[0][0]=RED2/100+48;
RGB[0][1]=RED2%100/10+48;
RGB[0][2]=RED2%10+48;
RGB[1][0]=GREEN2/100+48;
RGB[1][1]=GREEN2%100/10+48;
RGB[1][2]=GREEN2%10+48;
RGB[2][0]=BLUE2/100+48;
RGB[2][1]=BLUE2%100/10+48;
RGB[2][2]=BLUE2%10+48;
}
void Third_interface()
{
char i,j;
if(key==1)
{
balance_flag=1;
write_cmd(0x01);//清屏
LCD_Position(2,0);
write_xbyte("白平衡中。。。。");
//delay_ms(200);
while(white_flag!=1)//白平衡调节完毕后,会返回一个值,white_flag=1 {
white_balance();//会返回一个值,white_flag=1
write_cmd(0x01);//清屏
LCD_Position(2,3);
write_xbyte("完成");
delay_ms(5000);
//white_flag=1;
}
for(i=0;i
{
for(j=0;j
{
RGB2[i][j]=48;
RGB[i][j]=48;
}
}
}
white_flag=0;
key=0;
}
void send(uchar r,uchar c,uint RGB0[3][3])//发送字符数和字符所在的数组 {
uchar i;
for(i=0;i
{
write_data(RGB0[r][i]);
}
}
void Fourth_interface()
{
write_cmd(0x01);//清屏
LCD_Position(1,2);
write_xbyte("上次");
LCD_Position(1,5);
write_xbyte("当前");
LCD_Position(2,0);//R
write_xbyte("R:");
LCD_Position(2,2);
send(0,3,RGB2); //显示上次的值
LCD_Position(2,5);
send(0,3,RGB);//显示本次的值
LCD_Position(3,0);//G
write_xbyte("G:");
LCD_Position(3,2);
send(1,3,RGB2);//显示上次的值
LCD_Position(3,5);
send(1,3,RGB);//显示本次的值
LCD_Position(4,0);//B
write_xbyte("B:");
LCD_Position(4,2);
send(2,3,RGB2);//显示上次的值
LCD_Position(4,5);
send(2,3,RGB);//显示本次的值
key=0;
}
void fifth_interface()//产品检测完毕之后,显示具体的结果 {
write_cmd(0x01);
LCD_Position(2,0);
write_xbyte("暂无结果显示");
key=0;
}
void keyscan()//确认键代表1,否定键代表2,传送变量为key {
uchar temp=0;
while(temp==0)
{
keyON=1;
keyOFF=1;
if(keyON==0)
{
delay_ms(20);
if(keyON==0)
key=1;
while(keyON==0);
temp=1;
}
if(keyOFF==0)
{
delay_ms(20);
if(keyOFF==0)
key=2;
while(keyOFF==0);
temp=1;
}
}
temp=0;
}
void detection()//检测
{
char i,j;
white_balance();//此处是采集数据
BLUE2=BLUE;
GREEN2=GREEN;
RED2=RED;
if(BLUE2>255)
BLUE2=255;
if(GREEN2>255)
GREEN2=255;
if(RED2>255)
RED2=255;
for(i=0;i
{
for(j=0;j
{
RGB2[i][j]=RGB[i][j];
RGB[i][j]=48;
}
}
BCD_shi();//十进制显示转换
}
void zhuchengxu()
{
Secondary_interface();//是否需要白平衡
keyscan();//扫描按键
Third_interface();//条件进入,条件退出, 确定白平衡,1 zhuchengxu2();// 1
}
void zhuchengxu2()//结果界面
{
Fourth_interface();//检测结果界面 1
keyscan();//如果key=1;开始检测,key=2,返回上级界面 if(key==1)
{
key=0;
write_cmd(0x01);
LCD_Position(2,1);
write_xbyte("设备准备阶段");//准备5秒后进行正式检测 delay_ms(5000);
write_cmd(0x01);
LCD_Position(2,0);
write_xbyte("检测进行中。。。");
delay_ms(2000);
while(white_flag!=1)
detection();//检测程序 1
white_flag=0;
zhuchengxu3();
}
if(key==2)//返回到以一级界面
{
key=0;
zhuchengxu();
}
}
void zhuchengxu3()
{
Fourth_interface();//显示结果
//delay_ms(5000);//此处可以进行手动进入和时间进入 keyscan();
if(key==1)
{
key=0;
zhuchengxu4();
}
if(key==2)
{
key=0;
zhuchengxu2();//重新进行检测, 可以带标志 }
//while(1);
}
void zhuchengxu4()
{
fifth_interface() ;//详细结果
keyscan();
if(key==1)
{
key=0;
write_cmd(0x01);
LCD_Position(2,2);
write_xbyte("欢迎使用");
LCD_Position(3,2);
write_xbyte("检测完毕");
//显示检测完毕
keyscan();
if(key==1)
{
key=0;
zhuchengxu();
}
if(key==2)
{
key=0;
zhuchengxu4();//显示详细结果 }
//显示检测完毕 }
if(key==2)
{
key=0;
zhuchengxu3();//返回上页 }
}
void main()
{
tcs230_s2=1;
tcs230_s3=0;
aaa=0;
bbb=0;
//ET1=1;
LCD_Init();//初始化
Primary_interface();//开机界面
zhuchengxu();
}
void T1_count1() interrupt 3
{
T1_COUNT++;
if(T1_COUNT==200)
{
T1_COUNT=0;
T1_TIME++;
}
}