|
要用DHT11在數(shù)碼管上顯示當(dāng)前溫濕度,并且可以通過按鍵設(shè)置閾值,同時能用串口通信發(fā)送相關(guān)數(shù)據(jù)到串口仿真終端。
現(xiàn)已經(jīng)能實現(xiàn)顯示當(dāng)前溫濕度,并可以靠按住按鍵1、2顯示濕度或溫度的上下限,串口內(nèi)容能夠勉強過關(guān)。
但是通過按鍵調(diào)節(jié)閾值卻始終實現(xiàn)不了,同時我發(fā)現(xiàn)我的按鍵掃描函數(shù)是有bug的,按鍵一按下并彈起,實際上等同于我期望達到的按鍵二按下的效果。該BUG我理解發(fā)生原因,但是不知道怎么比較好的解決。
(因不明原因,PROTEUS文件在上傳前一會崩潰,一旦開始仿真就會閃退)
核心問題:DHT11怎么在數(shù)碼管上顯示溫濕度上下限閾值,并通過按鍵調(diào)節(jié)?
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
無標(biāo)題.png (148.87 KB, 下載次數(shù): 20)
下載附件
2020-6-3 22:10 上傳
單片機源程序如下:
- #include <reg51.h>
- #include <absacc.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define cmd_8155 XBYTE[0x8000]
- #define pb_8155 XBYTE[0x8002]
- #define pc_8155 XBYTE[0x8003]
- sbit dht=P1^0;
- sbit k1=P1^1;
- sbit k2=P1^2;
- sbit k3=P1^3;
- sbit k4=P1^4;
- sbit k5=P1^5;
- sbit k6=P1^6;
- sbit rled=P3^2;
- sbit tled=P3^3;
- unsigned char s[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰極0~9編碼
- unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x76,0x38};//共陰極0~9+H、L編碼
- unsigned char DisBuff[5]={0,0,0,0,0};
- unsigned char a[5]={0,0,0,0,0};
- uchar k;
- signed char R;//濕度
- signed char T;//溫度
- unsigned char key_value;//按鍵值
- unsigned char WRH=85,WRL=35,WTH=40,WTL=15;
- uint flag=0,c;
- void delay_ms(unsigned int cnt) //延時函數(shù)ms
- {
- unsigned int x;
- for( ; cnt>0; cnt--)
- {
- for(x=110; x>0; x--);//軟件延時為1MS
- }
- }
- void delay_us(unsigned int cnt) //延時函數(shù)us
- {
- while(cnt--);
- }
- void DHT11_delay_us(unsigned char n)//DHT延時函數(shù)us
- {
- while(--n);
- }
- void DHT11_delay_ms(unsigned int z)//DHT延時函數(shù)ms
- {
- unsigned int i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()//DHT啟動函數(shù)
- {
- dht=1;
- DHT11_delay_us(2);
- dht=0;
- DHT11_delay_ms(30); //延時18ms以上
- dht=1;
- DHT11_delay_us(30);
- }
- unsigned char DHT11_rec_byte() //接收一個字節(jié)
- {
- unsigned char i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!dht); ////等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
- if(dht==1) //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
- dat+=1;
- while(dht); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數(shù)據(jù)
- {
- unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11_start();
- if(dht==0)
- {
- while(dht==0); //等待拉高
- DHT11_delay_us(40); //拉高后延時80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte();//接收校正位
- DHT11_delay_us(25); //結(jié)束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- R=RH;
- T=TH;
- }
- }
- void key(){
- if(k1==0&&flag==0){
- flag=1;}
- if(k1==1&&flag==1){
- c=0;
- flag=0;}
- if(k2==0&&flag==0){
- flag=1;}
- if(k2==1&&flag==1){
- c=1;
- flag=0;}
- if(k3==0&&flag==0){
- flag=1;}
- if(k3==1&&flag==1){
- c=2;
- flag=0;}}
- void disr()//展示濕度上下限
- {
- unsigned char i,j,rn[6]={11,0,0,10,0,0};
-
- rn[1]=WRH/10;
- rn[2]=WRH%10;
- rn[4]=WRL/10;
- rn[5]=WRL%10;
-
- SP = 0x60;
- cmd_8155 = 0x0e;
- pc_8155=0;
- for(k=0;k<200;k++){
- j=32;
- for(i=0;i<6;i++)
- { pb_8155 = table[rn[i]];
- delay_us(10);
- pc_8155 = j;
- j = j/2;
- }
- delay_ms(1);}}
- void dist()//展示溫度上下限
- {
- unsigned char i,j,tn[6]={11,0,0,10,0,0};
- tn[1]=WTH/10;
- tn[2]=WTH%10;
- tn[4]=WTL/10;
- tn[5]=WTL%10;
- SP = 0x60;
- cmd_8155 = 0x0e;
- pc_8155=0;
-
- for(k=0;k<200;k++){
- j=32;
- for(i=0;i<6;i++)
- { pb_8155 = table[tn[i]];
- delay_us(10);
- pc_8155 = j;
- j = j/2;
- }delay_ms(1);}}
- void display() //展示當(dāng)前溫濕度
- {
- unsigned char i,j,shu[6]={0,0,0,0,0,0};
-
- shu[0]=R/10;
- shu[1]=R%10;
- shu[4]=T/10;
- shu[5]=T%10;
- SP = 0x60;
- cmd_8155 = 0x0e;
- pc_8155=0;
-
- for(k=0;k<200;k++)
- {
- j = 32;
- for(i=0;i<6;i++)
- {
- pc_8155 = 0x00;
- delay_us(10);
- pb_8155 = s[shu[i]];
- pc_8155 = j;
- j = j/2;
- delay_us(10);
- }}delay_ms(1);}
- void initscon(){//初始化串口
- SCON=0X40;
- TMOD=0X20;
- PCON=0X00;
- TH1=0xfd;
- TL1=0xfd;
- ES=0;
- ET1=0;
- TR1=1;
- }
- void send(){//向串口發(fā)送數(shù)據(jù)
- uchar i;
- initscon();
- for(i=0;i<4;i++){
- SBUF=a[i];
- while(TI==0);
- TI=0;}}
- void main(void)//主函數(shù)
- { while(1){
- DHT11_receive();//讀取溫濕度
- a[0]=R/10;
- a[1]=R%10;
- a[2]=T/10;
- a[3]=T%10;
- send();
- key();
- switch(c){
- case 0:display();break;
- case 1:disr();break;
- case 2:dist();break;}
-
- if(R>WRH||R<WRL){
- rled=0;}else{
- rled=1;}
- if(T>WTH||T<WTL){
- tled=0;}else{
- tled=1;}
- }}
復(fù)制代碼
全部資料51hei下載地址:
DHT11.rar
(36.9 KB, 下載次數(shù): 39)
2020-6-3 22:04 上傳
點擊文件名下載附件
|
|