- #include <12c5a60s2.h>
- #include <intrins.h>
- #include<absacc.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define busy 0x80
- uint jiaquan_mg,jiaquan_ppm;
- uchar NRxBuff; //通訊接收緩沖區(qū)記數(shù)
- uchar inbuff[20];//通訊接收緩沖區(qū)數(shù)據(jù)
- uchar outbuff[20];//通訊發(fā)射緩沖區(qū)數(shù)據(jù)
- sbit RS=P3^3;
- sbit RW=P3^4;
- sbit E=P3^5;
- //毫秒延時子程序
- void delay_nms(uint n)
- {uint i,j;
- for (i=0;i<n;i++){for(j=0;j<1900 ;j++);}}
- //串口1 初始化
- void UartInit(void) //9600bps@11.0592MHz
- {
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0x50; //8位數(shù)據(jù),可變波特率
- AUXR=AUXR&0x5a;
- TMOD &= 0x0f; //清除定時器1模式位
- TMOD |= 0x20; //設(shè)定定時器1為8位自動重裝方式
- TL1 = 0xFA; //設(shè)定定時初值
- TH1 = 0xFA; //設(shè)定定時器重裝值
- ET1 = 0; //禁止定時器1中斷
- TR1 = 1; //啟動定時器1
- }
- //串口2 初始化
- void Uart_two_init (void)
- {
- S2CON=0x50;
- BRT=0xfd;
- AUXR1=AUXR1&0xef;
- IE2=IE2|0x01;
- }
- // 串口2 發(fā)送一個字符
- void uart_two_send(uchar l)
- {
- ES2=0;
- S2BUF=l;
- while((S2CON&0x02)!=0x02);
- S2CON&=~0x02;
- ES=1;
- }
- //串口2 發(fā)送數(shù)據(jù)
- void uart_two_printf(uchar *p)
- {
-
- uchar b;
- for(b=0;b<=7;b++)
- {
- uart_two_send(p[b]);
- }
- }
- /////串口1中斷子程序//////
- serial (void) interrupt 4
- {
- RI=0;
- inbuff[NRxBuff]=SBUF;
- NRxBuff++;
- if (NRxBuff>15)NRxBuff=0;
- }
- //串口1輸出子程序
- void sprint(uchar a)
- {
- ES=0;
- SBUF=a;
- while(!TI)
- {};
- TI=0;
- ES=1;
- }
- //發(fā)送讀取指令
- void fa_read_pro(void)
- {
- uchar a;
- outbuff[0]=0xa5;
- outbuff[1]=0x5a;
- outbuff[2]=0x02;
- outbuff[3]=0x80;
- outbuff[4]=0xaa;
- for (a=0;a<5;a++)sprint(outbuff[a]);
- }
- // 1602的顯示程序這里省略了
- // 主程序 //
- void main(void)
- {
- uint mg1,mg2,mg3,ppm1,ppm2,ppm3;
- uchar *s1;
- uchar *s2;
- uchar *s3;
- uchar s4;
- init_1602();
- s1="HCHO:";
- s2="mg/m3";
- s3="ppm";
- s4='.';
- display_1602string(0,0,s1); // 第一行開頭顯示 HCHO:
- display_1602string(0,1,s1); // 第二行開頭顯示 HCHO:
- display_1602string(11,0,s2); // 第一行末尾顯示 mg/m3
- display_1602string(13,1,s3); // 第二行末尾顯示 ppm
- EA=0;
- delay_nms(50); //
- NRxBuff=0;
- UartInit(); //串口1 初始化
- Uart_two_init(); // 串口2 初始化
- EA=1;
- delay_nms(166); //
- while(1)
- {
- fa_read_pro();////發(fā)送讀取指令
- delay_nms(100);//延時一段時間,大于50ms
- if ((NRxBuff>=8)&&(inbuff[0]==0xA5)&&(inbuff[1]==0x5A)&&(inbuff[3]==0x80)) //如果收到8個字節(jié)的數(shù)據(jù),進行判斷,然后處理數(shù)據(jù)。
- {
- jiaquan_mg=inbuff[4]*256+inbuff[5];////////////計算甲醛mg值
- jiaquan_ppm=inbuff[6]*256+inbuff[7];//////////計算甲醛ppm值
- NRxBuff=0;
- }
- // 想在這個位置 把從串口一接收到的8個字節(jié)數(shù)據(jù)通過RS232從串口二傳送出去 串口二只用于傳送 不用接受
-
- mg1=jiaquan_mg/100; //計算各位
- mg2=jiaquan_mg%100/10; //計算十分位
- mg3=jiaquan_mg%100%10; //計算千分位
- ppm1=jiaquan_ppm/100;
- ppm2=jiaquan_ppm%100/10;
- ppm3=jiaquan_ppm%100%10;
- display_1602char(7,0,s4); //顯示小數(shù)點
- display_1602char(7,1,s4);
- display_1602int(6,0,0x30+mg1); //顯示動態(tài)數(shù)字要加 0x30 顯示以mg為單位的檢測數(shù)值
- display_1602int(8,0,0x30+mg2);
- display_1602int(9,0,0x30+mg3);
- display_1602int(6,1,0x30+ppm1); //顯示動態(tài)數(shù)字要加 0x30 顯示以ppm為單位的檢測數(shù)值
- display_1602int(8,1,0x30+ppm2);
- display_1602int(9,1,0x30+ppm3);
- delay_nms(166);
- }
- }
復(fù)制代碼 |