做的是1602和dht11結合的溫濕度傳感器,但是為什么1602上不顯示數據,只是亮起
4112f8ef9eda8d64011b7924186fc96a.png (96.7 KB, 下載次數: 53)
下載附件
2020-12-8 18:36 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #include<stdio.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit rs=P2^0; //lcd數據/指令選擇控制線
- sbit rw=P2^1; //lcd讀寫控制線
- sbit e=P2^2; //lcd使能控制線
- sbit temp_data=P2^3;//dht11數據線
- sbit lcd_data=P1;
- uchar table[8];
- void delayxms(uchar xms)
- {
- uchar i,j;
- for(i=xms;i>0;i--)
- for(j=110;j>0;j--);
- }
- void delayxus(uchar xus)
- {
- while(--xus);
- }
- void lcdms(uint ms)
- {
- uchar a,b;
- for(;ms>0;ms--)
- for(b=38;b>0;b--)
- for(a=130;a>0;a--);
- }
- void lcd_busy()//判斷lcd是否處于忙的狀態
- {
- uchar temp;
- lcd_data=0xff;
- rs=0;
- rw=1;
- do
- {
- e=1;
- temp=lcd_data;
- e=0;
- }while(temp&0x80);
-
- }
- void w_com(uchar com)
- {
- lcd_busy();
- rs=0;//命令端
- rw=0;//寫
- lcd_data=com;
- lcdms(1);
- e=1;//使能開關
- lcdms(1);
- e=0;
- }
- void w_data(uchar dat)
- {
- lcd_busy();
- rs=1;
- rw=0;
- lcd_data=dat;
- lcdms(1);
- e=1;
- lcdms(1);
- e=0;
- }
- void lcd_init() //lcd初始化
- {
- w_com(0x38);
- w_com(0x0C);
- w_com(0x06);
- w_com(0x01);
- w_com(0x80);
- }
- void DHT_start() //dht啟動程序
- {
- temp_data=1;
- delayxus(2);
- temp_data=0;
- delayxms(20);
- temp_data=1;
- delayxus(13);
- }
- uchar rec_byte() //dht11接收一個字節數據
- {
- uchar i,dat=0;
- for(i=0;i<8;i++)
- {
- while(!temp_data);
- delayxus(8);
- dat<<=1;
- if(temp_data==1)
- {
- dat+=1;
- }
- while(temp_data);
- }
- return dat;
- }
- void DH_receive() //接收溫濕度數據
- {
- uchar R_S,R_G,T_S,T_G;
- uchar RS,RG,TS,TG,revise;
- DHT_start();
- if(temp_data==0)
- {
- while(temp_data==0);
- while(temp_data);
- R_S=rec_byte();
- R_G=rec_byte();
- T_S=rec_byte();
- T_G=rec_byte();
- revise=rec_byte();//校驗位
- delayxus(25);
- if((R_S+R_G+T_S+T_G)==revise)
- {
- RS=R_S;
- RG=R_G;
- TS=T_S;
- TG=T_G;
- }
- table[0]='S';
- table[1]='0'+RS/10;
- table[2]='0'+RS%10;
- table[3]=' ';
- table[4]=' ';
- table[5]='w';
- table[6]='0'+TS/10;
- table[7]='0'+TS%10;
- }
- }
- void lcdCursor(uchar x,uchar y,uchar *s)
- {
- if(y==0)
- {
- w_com(0x80+x);
- }
- else
- {
- w_com(0xC0+x);
- }
- while(*s)
- {
- w_data(*s);
- s++;
- }
- }
- void lcdshow(uchar x,uchar y,uchar date)
- {
- if(y==0)
- {
- w_com(0x80+x);
- }
- else
- {
- w_com(0xC0+x);
- }
- w_data(date);
- }
- void main()
- {
- uint i;
- lcd_init();
-
- while(1)
- {
- delayxus(1000);
- DH_receive();
- for(i=0;i<8;i++)
- {
- lcdshow(i,0,table[i]);
- }
- }
- }
復制代碼
|