全部资料51hei下载地址:
DHT11 串口显示.rar
(44.77 KB, 下载次数: 355)
单片机源码:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar str1[]={" "},str2[]={" "};
- sbit dat=P2^0; //dht11 dat端口
- sbit EN=P3^4;
- sbit RS=P3^5;
- sbit RW=P3^6;
- uchar TH_data,TL_data,RH_data,RL_data,CK_data;
- uchar FLAG,k,count,temp,comdata;
- uchar T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
- uchar T_data_H_temp,T_data_L_temp,RH_data_H_temp,
- RH_data_L_temp,checkdata_temp;
- void delayms(uint x)
- {
- uint y;
- for(;x>0;x--)
- for(y=110;y>0;y--);
- }
- void Delay(uint j) //100us
- {
- uchar i;
- for(;j>0;j--)
- for(i=0;i<27;i++);
- }
- void Delay_10us(void)
- {
- uchar i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- bit LCD_Check_Busy(void)
- {
- P0=0xFF;
- RS=0;
- RW=1;
- EN=0;
- _nop_();
- EN=1;
- return(bit)(P0&0x80);
- }
- void LCD_Write_Com(uchar com)
- {
- while(LCD_Check_Busy()); //忙则等待
- RS=0;
- RW=0;
- P0=com;
- _nop_();
- EN=1;
- _nop_();
- EN=0;
- }
- void LCD_Write_Data(uchar Data)
- {
- while(LCD_Check_Busy()); //忙则等待
- RS=1;
- RW=0;
- P0=Data;
- _nop_();
- EN=1;
- _nop_();
- EN=0;
- }
- void LCD_Write_String(uchar x,y,uchar *s)
- {
- if(y==0)
- {
- LCD_Write_Com(0x80+x); //表示第一行
- }
- else
- {
- LCD_Write_Com(0xC0+x); //表示第二行
- }
- while(*s)
- {
- LCD_Write_Data(*s);
- s++;
- }
- }
- void LCD_Write_Char(uchar x,y,Data)
- {
- if (y==0)
- {
- LCD_Write_Com(0x80+x);
- }
- else
- {
- LCD_Write_Com(0xC0+x);
- }
- LCD_Write_Data(Data);
- }
- void LCD_Init(void)
- {
- LCD_Write_Com(0x01); //清屏
- LCD_Write_Com(0x38);
- LCD_Write_Com(0x08); //显示关闭
- LCD_Write_Com(0x01); //显示清屏
- LCD_Write_Com(0x06); //显示光标移动设置
- LCD_Write_Com(0x0C); //显示开及光标设置
- }
- void COM(void)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- FLAG=2;
- while((!dat)&&FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- temp=0;
- if(dat)temp=1;
- FLAG=2;
- while((dat)&&FLAG++); //超时则跳出for循环
- if(FLAG==1) //判断数据位是0还是1
- break; //如果高电平高过预定0高电平值则数据位为 1
- comdata<<=1;
- comdata|=temp; //0
- }
- }
- void RH(void)
- {
- dat=0;
- Delay(200);
- dat=1;
- Delay_10us(); //总线由上拉电阻拉高 主机延时20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主机设为输入 判断从机响应信号
- dat=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!dat) //T !
- {
- FLAG=2;
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!dat)&&FLAG++);
- FLAG=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((dat)&&FLAG++);
- //数据接收状态
- COM();
- RH_data_H_temp=comdata;
- COM();
- RH_data_L_temp=comdata;
- COM();
- T_data_H_temp=comdata;
- COM();
- T_data_L_temp=comdata;
- COM();
- checkdata_temp=comdata;
- dat=1; //数据校验
- temp=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
- if(temp==checkdata_temp)
- {
- RH_data_H=RH_data_H_temp;
- RH_data_L=RH_data_L_temp;
- T_data_H=T_data_H_temp;
- T_data_L=T_data_L_temp;
- checkdata=checkdata_temp;
- }
- }
- }
- void main()
- {
- LCD_Init();
- Delay(20000);
- LCD_Write_String(0,0,"shidu:");
- LCD_Write_String(0,1,"wendu:");
- LCD_Write_Char(9,0,'%');
- LCD_Write_Char(10,1,'C');
- //LCD_Write_String(10,1,"C");
- LCD_Write_String(10,0," RH");
- Delay(1);
- while(1)
- {
- RH();
- RH_data=RH_data_H; //把湿度整数给予SRT0.(直接使用即可)
- RL_data=RH_data_L; //把湿度小数给予SRT1.==0(为零,不用)
- TH_data=T_data_H; //把温度整数给予SRT2.(直接使用即可)
- TL_data=T_data_L; //把温度小数给予SRT3.==0(为零,不用)
- CK_data=checkdata; //校验位(不用)
- str1[0]=(char)(0x30+RH_data/10); //湿度整数部分
- str1[1]=(char)(0x30+RH_data%10);
- str2[0]=(char)(0x30+TH_data/10); //温度整数部分
- str2[1]=(char)(0x30+TH_data%10);
- LCD_Write_Char(7,0,str1[0]); //显示湿度
- LCD_Write_Char(8,0,str1[1]);
- LCD_Write_Char(7,1,str2[0]); //显示温度
- LCD_Write_Char(8,1,str2[1]);
- Delay(20000); //读取模块数据周期不易小于 2S
- }
- }
复制代码
|