- #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; //通讯接收缓冲区记数
- uchar inbuff[20];//通讯接收缓冲区数据
- uchar outbuff[20];//通讯发射缓冲区数据
- 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位数据,可变波特率
- AUXR=AUXR&0x5a;
- TMOD &= 0x0f; //清除定时器1模式位
- TMOD |= 0x20; //设定定时器1为8位自动重装方式
- TL1 = 0xFA; //设定定时初值
- TH1 = 0xFA; //设定定时器重装值
- ET1 = 0; //禁止定时器1中断
- TR1 = 1; //启动定时器1
- }
- //串口2 初始化
- void Uart_two_init (void)
- {
- S2CON=0x50;
- BRT=0xfd;
- AUXR1=AUXR1&0xef;
- IE2=IE2|0x01;
- }
- // 串口2 发送一个字符
- void uart_two_send(uchar l)
- {
- ES2=0;
- S2BUF=l;
- while((S2CON&0x02)!=0x02);
- S2CON&=~0x02;
- ES=1;
- }
- //串口2 发送数据
- 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;
- }
- //发送读取指令
- 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();////发送读取指令
- delay_nms(100);//延时一段时间,大于50ms
- if ((NRxBuff>=8)&&(inbuff[0]==0xA5)&&(inbuff[1]==0x5A)&&(inbuff[3]==0x80)) //如果收到8个字节的数据,进行判断,然后处理数据。
- {
- jiaquan_mg=inbuff[4]*256+inbuff[5];////////////计算甲醛mg值
- jiaquan_ppm=inbuff[6]*256+inbuff[7];//////////计算甲醛ppm值
- NRxBuff=0;
- }
- // 想在这个位置 把从串口一接收到的8个字节数据通过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); //显示小数点
- display_1602char(7,1,s4);
- display_1602int(6,0,0x30+mg1); //显示动态数字要加 0x30 显示以mg为单位的检测数值
- display_1602int(8,0,0x30+mg2);
- display_1602int(9,0,0x30+mg3);
- display_1602int(6,1,0x30+ppm1); //显示动态数字要加 0x30 显示以ppm为单位的检测数值
- display_1602int(8,1,0x30+ppm2);
- display_1602int(9,1,0x30+ppm3);
- delay_nms(166);
- }
- }
复制代码 |