久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4704|回復(fù): 0
收起左側(cè)

室內(nèi)甲醛濃度檢測及無線顯示系統(tǒng)設(shè)計 代碼

[復(fù)制鏈接]
ID:187216 發(fā)表于 2017-4-7 18:08 | 顯示全部樓層 |閱讀模式
發(fā)射模塊主要程序:
void main()
{       
        uchar TxBuf[20]={0};            //清空發(fā)送緩存區(qū)
        uchar RxBuf[20]={0};      //清空接收緩存區(qū)
        SCON = 0x50;            //設(shè)置8-bit控制串口寄存器
        TMOD = 0x20;            //設(shè)置定時器Timer1頻率
        TH1 = TL1 = 0xfd; //設(shè)置定時器高八位和低八位
        TR1 = 1;                //啟動定時器Timer1
        ES = 1;               
        EA = 1;                 //開中斷
       
//        send_write("STC12C5A60S2\r\nUart Test !\r\n");
        init_NRF24L01() ;          //初始化nrf24L01
        nRF24L01_TxPacket(TxBuf);        //緩存區(qū)數(shù)據(jù)放入nrf24L01
        delay(80000);
       
        while(1)
        {       
                TxBuf[0] = 12;                  //主機對從機發(fā)送的起始信息
                TxBuf[1] = ch2o/256;              //甲醛高位
                TxBuf[2] = ch2o%256;             //甲醛低位
                TxBuf[3] = (ch2o/256)+(ch2o%256);  //甲醛濃度計算規(guī)則
                if(once==1)
                {
                        nRF24L01_TxPacket(TxBuf);        // 傳送緩存數(shù)據(jù)
                        TxBuf[0] = 0;                 //清緩存
                        TxBuf[0] = 0;
                        once=0;                     //標(biāo)志位
                        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;             //標(biāo)志位
                UART_dat[sign]=SBUF;
                switch(sign)
                {
                        case 0:
                                if(UART_dat[sign]==0xFF)        //發(fā)送起始位
                                {
                                        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)       //數(shù)據(jù)高位
                                {
                                        sign=4;
                                }else
                                {
                                        sign=0;
                                }
                        break;
                        case 4:
                                sign=5;                     //數(shù)據(jù)低位
                        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:  /進(jìn)行信息的校驗,判斷要不要接收
                                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;         //單位由ppm轉(zhuǎn)mg/m^2
                                        sign=0;
                                        once=1;
                                        send(0x30+ch2o/1000%10);     //發(fā)送小數(shù)點后第一位
                                        send(0x30+ch2o/100%10);      //發(fā)送小數(shù)點后第二位
                                        send(0x30+ch2o/10%10);       //發(fā)送小數(shù)點后第三位
                                        send(0x30+ch2o%10);          //發(fā)送小數(shù)點后第四位
                                        send_write("\r\n");
                                }else
                                {
                                        sign=0;   
                                }
                        break;
                }
    }
接收模塊主要程序:
uint ch2o_H,ch2o;
uchar ms,sec;
bit beep1,send;
void delay(uint T)                                          //延時函數(shù)
{
        while(T--);
}
void LCD1602_write(uchar order,dat)                                  //1602 一個字節(jié)  處理
{
    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);     // 設(shè)置5*7點陣
        delay(1500);
        LCD1602_write(0,0x0c);     //開顯示屏,不顯示光標(biāo)
        LCD1602_write(0,0x06);     //寫入字符且光標(biāo)右移
        LCD1602_write(0,0xd0);
        delay(15000);
}
void show()                        //顯示數(shù)據(jù)
{
        LCD1602_write(0,0x80);                   //顯示第一行
        LCD1602_writebyte("CH2O:");  
        LCD1602_write(1,0x30+ch2o/10000%10);       //顯示小數(shù)點前一位
        LCD1602_writebyte(".");                     //顯示小數(shù)點
        LCD1602_write(1,0x30+ch2o/1000%10);        //顯示小數(shù)點后第一位
        LCD1602_write(1,0x30+ch2o/100%10);         //顯示小數(shù)點后第二位
        LCD1602_write(1,0x30+ch2o/10%10);          //顯示小數(shù)點后第三位
        LCD1602_write(1,0x30+ch2o%10);             //顯示小數(shù)點后第四位
        LCD1602_writebyte("mg/m3");                 //顯示單位
        LCD1602_write(0,0xc0);                   //顯示第二行
        LCD1602_writebyte("CH2O_H:");
        LCD1602_write(1,0x30+ch2o_H/100%10);    //顯示小數(shù)點前一位
        LCD1602_writebyte(".");
        LCD1602_write(1,0x30+ch2o_H/10%10);     //顯示小數(shù)點后第一位
        LCD1602_write(1,0x30+ch2o_H%10);        //顯示小數(shù)點后第二后
        LCD1602_writebyte("mg/m3");              //顯示單位
}
void proc()
{
        if(ch2o/100>=ch2o_H)  //超過設(shè)定值
        {
                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);        //接收緩沖區(qū)的數(shù)據(jù)
                        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();                                   //調(diào)用顯示程序
                key();                                    //調(diào)用按鍵程序
                proc();                                    //調(diào)用與標(biāo)準(zhǔn)值對比程序
        }
}
void UART_1() interrupt 1
{
        TH0=0x4c;                                                   //定時器初始化
        TL0=0x00;
        ms++;
        if(ms%2==0)   //長按按鍵計數(shù)處理                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
        {
                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++;
        }       
}

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线视频在线观看 | 国产免费拔擦拔擦8x高清 | 精品国产精品国产偷麻豆 | 精品视频一二区 | 最新av片| 欧美日韩一区二区在线播放 | 国产午夜精品视频 | 国产精品久久久久久久久久久久久久 | 91精品无人区卡一卡二卡三 | 欧美日韩一区二区在线播放 | 国产激情福利 | 秋霞影院一区二区 | 国产日韩精品在线 | 亚洲精品免费视频 | 热久久免费视频 | 久国产| 一级全黄少妇性色生活免费看 | 日韩高清中文字幕 | 欧美精品久久久 | 亚洲在线 | 91精品一区二区 | 中文字幕视频在线 | 亚洲综合区 | 麻豆成人在线视频 | 欧美日韩在线一区 | 国产精品欧美一区二区三区不卡 | 国产精品自拍视频 | 久久久精品影院 | 正在播放国产精品 | 国产激情91久久精品导航 | 国产精品久久久久久久岛一牛影视 | 欧美另类视频在线 | 99精品久久久久久 | 羞羞视频免费观 | av电影手机在线看 | 国产精品视频一 | 国产高清在线 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 天堂在线中文字幕 | 国产精品一区在线 | 91在线一区 |