做的是1602和dht11结合的温湿度传感器,但是为什么1602上不显示数据,只是亮起
单片机源程序如下:
- #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]);
- }
- }
- }
复制代码
|