#include <reg52.h>
#include <intrins.h>
unsigned char tmp;
sbit PPM = P2^0;
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="PM2.5 TMEP HRT ";
uchar buff[30];
uint pm1 = 0;
uint pm2 = 0;
uint pm10 = 0;
uchar Uart_Buf;
uchar Rec_Addr=0;
uchar Rec_Uart=0;
uchar Recive_Buf[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
bit rec_ok_flag=0;
sbit rs=P2^3;
sbit rw=P2^4;
sbit en=P2^5;
void rs232_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
IT0=0; //1负跳变触发 0低电平触发
EX0=1; //允许外部中断0
TR1=1;
SM0=0;
SM1=1;
REN=1; //先设定号工作方式,在打开允许接收
EA=1;
ES=1;
}
void UART1_interrupt (void) interrupt 4
{
EA=0;
if(TI) {TI=0;};
if(RI)
{
RI=0; //
Uart_Buf=SBUF; //
switch (Rec_Uart)
{
case 0: //
if(Uart_Buf==0x42) Rec_Uart=1; //
else Rec_Uart=0;
break;
case 1: //
if(Uart_Buf==0x4d) Rec_Uart=2; //
else Rec_Uart=0;
break;
case 2:
{
Recive_Buf[Rec_Addr]=Uart_Buf; //
Rec_Addr++;
if(Rec_Addr>=22)
{
Rec_Uart=0; //
rec_ok_flag=1; //
Rec_Addr=0;
}
}
break;
}//end switch
}//end RI
EA=1;
}
void getdata(void)//转换数据
{
pm1= Recive_Buf[2]<<8;
pm1|=Recive_Buf[3];
pm2= Recive_Buf[4]<<8;
pm2|=Recive_Buf[5];
pm10= Recive_Buf[6]<<8;
pm10|=Recive_Buf[7];
}
void delay(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write1602_com(uint com) //写1602地址
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write1602_date(uchar date) //写1602数据
{
rs=1;
rw=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init1602(void) //初始化1602
{
write1602_com(0x38);
write1602_com(0x0c);
write1602_com(0x06);
write1602_com(0x01);
}
void display(uint add,temp) //显示xxx
{
write1602_com(add);
// write1602_date(temp/1000+0x30);
// delay(1);
write1602_date(temp%1000/100+0x30);
delay(1);
write1602_date(temp%100/10+0x30);
delay(1);
write1602_date(temp%10+0x30);
delay(1);
}
void display_head() //表头
{
uchar num;
write1602_com(0x80); //?úμúò?DD?aí·??ê?
for(num=0;num<16;num++)
{
write1602_date(table[num]);
delay(5);
}
}
void displayall(void) //显示数据
{
display(0xc0,pm2);
display(0xc0+6,pm1);
display(0xc0+12,pm10);
}
void clear(void)//清空屏幕
{
uchar num;
write1602_com(0x80); //第一行
for(num=0;num<16;num++)
{
write1602_date(0x10);
delay(5);
}
write1602_com(0xc0); //第二行
for(num=0;num<16;num++)
{
write1602_date(0x10);
delay(5);
}
}
void main(void) //主函数
{
init1602(); //初始化1602
rs232_init(); //初始化UART
clear(); //清屏
displayall(); //数据
display_head(); //表头
ES=1; //内部中断
EA=1; //总中断使能
while(1)
{
if(rec_ok_flag==1) //得到UART标记位
{
getdata(); //转换数据
displayall(); //显示数据
rec_ok_flag=0; //清除标记位
}
}
}