IMG20180519160055.jpg (1.64 MB, 下載次數: 86)
下載附件
溫濕度檢測1602顯示
2018-5-19 16:01 上傳
7X0V0Q5K9JQQ{C18EFIZ`XT.png (70.51 KB, 下載次數: 93)
下載附件
串口顯示
2018-5-19 16:04 上傳
全部資料51hei下載地址:
DHT11 串口顯示.rar
(44.77 KB, 下載次數: 358)
2018-5-19 16:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源碼:
- #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
- }
- }
復制代碼
|