#include"reg52.h"#include"stdio.h"#include"intrins.h"#include"lcd1602.H"#define uchar unsigned char#define uint unsigned int#define ulong unsigned longuchar code tab[9] ={ 0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };uchar date[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };void delayms(uint xms){ uint x, y; for (x = xms; x > 0; x--) for (y = 110; y > 0; y--) ;}void send(uchar dat) //發送一字節 { SBUF = dat; while (!TI) ; TI = 0;}void main(void){ uint tmp; uchar i; TMOD = 0x20; // T1定時方式2 SCON = 0x40; //串行工作 方式1 PCON = 0x00; //不加倍 TH1 = TL1 = 0xfd; //定時器1賦初值 保證波特率9600 TR1 = 1; //開定時器1 REN = 1; //允許串口接收 init_1602(); //液晶初始化 delayms(10); ES = 1; //打開串口中斷 EA = 1; //開總中斷 while (1) { for (i = 0; i < 9; i++) //向co2傳感器發送數據 { send(tab[i]); } delayms(1000); //延時一秒 刷新測得數據 tmp = date[2] * 256 + date[3]; //計算出co2濃度值 if (tmp > 9999) tmp = 0; WRITE_LCD1602_COM(0x80 + 8); if ((tmp / 1000) > 0) WRITE_LCD1602_DAT(LCD1602_Table[tmp / 1000]); else WRITE_LCD1602_DAT(' '); WRITE_LCD1602_DAT(LCD1602_Table[tmp00 / 100]); WRITE_LCD1602_DAT(LCD1602_Table[tmp0 / 10]); WRITE_LCD1602_DAT(LCD1602_Table[tmp]); }}void serial() interrupt 4 //串口中斷服務函數{ static uchar j=0; ES = 0; //禁止中斷 if (!RI) ; RI = 0; //清楚接收完畢標志 date[j] = SBUF; if (date[0] == 0xff) //判斷接收到的第一位為傳感器所發數據 j++; else j = 0; if (j == 9) //接收傳感器所發數據9字節 j = 0; ES = 1; //允許串口中斷}//////////////////////////////////////////////////////////////////////////////////////////////lcd1602.H:#define uchar unsigned char#define uint unsigned intsbit RS = P2 ^ 5;sbit RW = P2 ^ 6;sbit EN = P2 ^ 7;uchar LCD1602_Table[] = "0123456789";//LCD1602顯示標尺 //0123456789abcdefuchar code DIS_TIM[16] = { " PPM= " }; //顯示溫濕度uchar code DIS_STA[16] = { " Test is oK! " }; //uchar code DIS[16] = { "alarm ppm" }; //extern void delayms(uint xms);void WRITE_LCD1602_DAT(uchar date){ EN = 0; RS = 1; P0 = date; EN = 1; delayms(2); EN = 0;}void WRITE_LCD1602_COM(uchar date){ EN = 0; RS = 0; P0 = date; EN = 1; delayms(2); EN = 0;}void init_1602(){ unsigned char i; RW = 0; WRITE_LCD1602_COM(0x38); WRITE_LCD1602_COM(0x0c); WRITE_LCD1602_COM(0x06); WRITE_LCD1602_COM(0x01); WRITE_LCD1602_COM(0x80); for (i = 0; i < 8; i++) WRITE_LCD1602_DAT(DIS_TIM[i]);}
|