首页

基于农产品检测系统程序

#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++;

}

}