找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4815|回复: 0
打印 上一主题 下一主题
收起左侧

室内甲醛浓度检测及无线显示系统设计 代码

[复制链接]
跳转到指定楼层
楼主
ID:187216 发表于 2017-4-7 18:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发射模块主要程序:
void main()
{       
        uchar TxBuf[20]={0};            //清空发送缓存区
        uchar RxBuf[20]={0};      //清空接收缓存区
        SCON = 0x50;            //设置8-bit控制串口寄存器
        TMOD = 0x20;            //设置定时器Timer1频率
        TH1 = TL1 = 0xfd; //设置定时器高八位和低八位
        TR1 = 1;                //启动定时器Timer1
        ES = 1;               
        EA = 1;                 //开中断
       
//        send_write("STC12C5A60S2\r\nUart Test !\r\n");
        init_NRF24L01() ;          //初始化nrf24L01
        nRF24L01_TxPacket(TxBuf);        //缓存区数据放入nrf24L01
        delay(80000);
       
        while(1)
        {       
                TxBuf[0] = 12;                  //主机对从机发送的起始信息
                TxBuf[1] = ch2o/256;              //甲醛高位
                TxBuf[2] = ch2o%256;             //甲醛低位
                TxBuf[3] = (ch2o/256)+(ch2o%256);  //甲醛浓度计算规则
                if(once==1)
                {
                        nRF24L01_TxPacket(TxBuf);        // 传送缓存数据
                        TxBuf[0] = 0;                 //清缓存
                        TxBuf[0] = 0;
                        once=0;                     //标志位
                        delay(20000);      
                }
                SetRX_Mode();
                nRF24L01_RxPacket(RxBuf);                                       
                if(RxBuf[0]==12)            
                {         
                        once=1;       
                }
                Delay(10000);
                RxBuf[0] = 0x00;               //清接收缓存寄存器
                RxBuf[1] = 0x00;       
        }
}
void send_init_4() interrupt 4
{
    if (RI)
    {
        RI = 0;             //标志位
                UART_dat[sign]=SBUF;
                switch(sign)
                {
                        case 0:
                                if(UART_dat[sign]==0xFF)        //发送起始位
                                {
                                        sign=1;
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 1:
                                if(UART_dat[sign]==0x17)        //判断气体名称是否为CH2O
                                {
                                        sign=2;
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 2:
                                if(UART_dat[sign]==0x04)       //判断单位是否为ppm
                                {
                                        sign=3;
                                }else
                                {
                                        sign=0;  
                                }
                        break;
                        case 3:
                                if(UART_dat[sign]==0x00)       //数据高位
                                {
                                        sign=4;
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 4:
                                sign=5;                     //数据低位
                        break;
                        case 5:
                                sign=6;
                        break;
                        case 6:
                                if(UART_dat[sign]==0x13)                //判断满量程高位
                                {
                                        sign=7;   
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 7:
                                if(UART_dat[sign]==0x88)      //判断满量程低位
                                {
                                        sign=8;  
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 8:  /进行信息的校验,判断要不要接收
                                if((UART_dat[sign]+UART_dat[1]+UART_dat[2]+UART_dat[3]+UART_dat[4]+UART_dat[5]+UART_dat[6]+UART_dat[7])%256==0)
                                {
                                        ch2o=UART_dat[4]*256+UART_dat[5];
                                        ch2o=ch2o*13.392857;         //单位由ppmmg/m^2
                                        sign=0;
                                        once=1;
                                        send(0x30+ch2o/1000%10);     //发送小数点后第一位
                                        send(0x30+ch2o/100%10);      //发送小数点后第二位
                                        send(0x30+ch2o/10%10);       //发送小数点后第三位
                                        send(0x30+ch2o%10);          //发送小数点后第四位
                                        send_write("\r\n");
                                }else
                                {
                                        sign=0;   
                                }
                        break;
                }
    }
接收模块主要程序:
uint ch2o_H,ch2o;
uchar ms,sec;
bit beep1,send;
void delay(uint T)                                          //延时函数
{
        while(T--);
}
void LCD1602_write(uchar order,dat)                                  //1602 一个字节  处理
{
    LCD1602_e=0;
    LCD1602_rs=order;
    LCD1602_dat=dat;
    LCD1602_rw=0;
    LCD1602_e=1;
    delay(20);
    LCD1602_e=0;                                                                                                                                                                                                     
}
void LCD1602_writebyte(uchar *prointer)                                   //1602 字符串    处理
{
    while(*prointer!='\0')
    {
        LCD1602_write(1,*prointer);
        prointer++;
    }
}
void LCD1602_cls()                          //1602 初始化
{
        LCD1602_write(0,0x01);     //清屏
        delay(15000);
        LCD1602_write(0,0x38);     // 设置5*7点阵
        delay(1500);
        LCD1602_write(0,0x0c);     //开显示屏,不显示光标
        LCD1602_write(0,0x06);     //写入字符且光标右移
        LCD1602_write(0,0xd0);
        delay(15000);
}
void show()                        //显示数据
{
        LCD1602_write(0,0x80);                   //显示第一行
        LCD1602_writebyte("CH2O:");  
        LCD1602_write(1,0x30+ch2o/10000%10);       //显示小数点前一位
        LCD1602_writebyte(".");                     //显示小数点
        LCD1602_write(1,0x30+ch2o/1000%10);        //显示小数点后第一位
        LCD1602_write(1,0x30+ch2o/100%10);         //显示小数点后第二位
        LCD1602_write(1,0x30+ch2o/10%10);          //显示小数点后第三位
        LCD1602_write(1,0x30+ch2o%10);             //显示小数点后第四位
        LCD1602_writebyte("mg/m3");                 //显示单位
        LCD1602_write(0,0xc0);                   //显示第二行
        LCD1602_writebyte("CH2O_H:");
        LCD1602_write(1,0x30+ch2o_H/100%10);    //显示小数点前一位
        LCD1602_writebyte(".");
        LCD1602_write(1,0x30+ch2o_H/10%10);     //显示小数点后第一位
        LCD1602_write(1,0x30+ch2o_H%10);        //显示小数点后第二后
        LCD1602_writebyte("mg/m3");              //显示单位
}
void proc()
{
        if(ch2o/100>=ch2o_H)  //超过设定值
        {
                led_1=1;               //1灯亮,2灯灭
                led_2=0;
                beep1=1;
        }else
        {
                led_1=0;              //1灯灭,2灯亮
                led_2=1;
                beep1=0;
        }
}
void key()
{
        if(!key_1)
        {
                ms=sec=0;
                delay(8888);   //按键去抖
                if(!key_1)
                {
                        if(ch2o_H<700)ch2o_H++;      //按键加
                        ms=sec=0;       
                        while(!key_1)
                        {
                                show();
                                proc();
                        }
                        IapEraseSector(0x0000);
                        IapProgramByte(0x0000,ch2o_H/256);
                        IapProgramByte(0x0001,ch2o_H%256);
                }
        }
        if(!key_2)
        {
                ms=sec=0;
                delay(8888);
                if(!key_2)
                {
                        if(ch2o_H>0) ch2o_H--;           //按键减
                        ms=sec=0;
                        while(!key_2)
                        {
                                show();
                                proc();
                        }
                        IapEraseSector(0x0000);
                        IapProgramByte(0x0000,ch2o_H/256);
                        IapProgramByte(0x0001,ch2o_H%256);
                }
        }
}
void main()
{       
        float Ad_dat=0;
        uchar h,l;                     //定义高位与低位变量
        uchar TxBuf[20]={0};         
        uchar RxBuf[20]={0};
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        ET0=1;
        TR0=1;
        EA=1;
        init_NRF24L01() ;
        delay(40000);
        nRF24L01_TxPacket(TxBuf);
        delay(60000);
        LCD1602_cls();
        h=IapReadByte(0x0000);            
        l=IapReadByte(0x0001);
        ch2o_H=h*256+l;                   //高位*256+低位
        if(ch2o_H>700) ch2o_H=5000;
        while(1)
        {
                TxBuf[0] = 12;
                TxBuf[1] = 0;
                if(send==1)
                {
                        nRF24L01_TxPacket(TxBuf);        //接收缓冲区的数据
                        TxBuf[0] = 0x00;
                        TxBuf[1] = 0x00;
                        send=0;
                        delay(20000);               
                }
                SetRX_Mode();
                nRF24L01_RxPacket(RxBuf);                                       
                if(RxBuf[0]==12)
                {                
                        ch2o=RxBuf[1]*256+RxBuf[1];                                                       
                }
                               
                delay(20000);
                RxBuf[0] = 0x00;
                RxBuf[1] = 0x00;
                RxBuf[2] = 0x00;         
                RxBuf[3] = 0x00;
                show();                                   //调用显示程序
                key();                                    //调用按键程序
                proc();                                    //调用与标准值对比程序
        }
}
void UART_1() interrupt 1
{
        TH0=0x4c;                                                   //定时器初始化
        TL0=0x00;
        ms++;
        if(ms%2==0)   //长按按键计数处理                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
        {
                if(sec>1)              //定时超过1s
                {
                        if(!key_1)
                        {
                                if(ch2o_H<700)ch2o_H++;      
                        }
                        if(!key_2)
                        {
                                if(ch2o_H>0) ch2o_H--;
                        }
                }
        }
        if(ms%10==0)            //定时500ms,中断10
        {
                send=1;
                if(beep1==1)
                {
                        beep=!beep;
                }else
                {
                        beep=1;
                }
        }
        if(ms>19)             //定时超过1s,中断超过20
        {
                ms=0;
                sec++;
        }       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表