關于DHT11的檢測及串口
單片機源程序如下:
- #include <reg51.h>
- #include"stdio.h"
- #include"intrins.h"
- #define OK 1
- #define ERROR 0
- extern void Delay_1ms(unsigned int ms);
- //函數的返回值表示讀取數據是否成功 OK 表示成功 ERROR 表示失敗
- extern unsigned char DHT11_ReadTempAndHumi(void);
- sbit dht11 = P2^0; //IO口定義
- //防止在與硬件通信時發生死循環的計數范圍
- #define NUMBER 120 //20 12T
- #define SIZE 5
- static unsigned char status;
- unsigned char tempshi,tempge;
- //存放五字節數據的數組
- static unsigned char value_array[SIZE];
- /*可在其他的文件引用溫濕度值,實際是溫度的整數的10 倍
- 如dht11 讀回的溫度是26,則temp_value = 260, 濕度同理*/
- int temp_value, humi_value;
- static unsigned char ReadValue(void);
- void serial_init(){
- TMOD=0x20;
- TH1=0xfd;
- TL1=0xfd; //設置9600波特率
- SCON=0x50; //串口方式1,允許接收
- TR1=1;
- }
- void main(){
- serial_init();
-
- while(1){
- if(DHT11_ReadTempAndHumi()==OK){
- TI=1;
- SBUF=temp_value;
- TI=0;
- Delay_1ms(1000);
- TI=1;
- SBUF=humi_value;
- TI=0;
- Delay_1ms(1000);
- }
- else if(DHT11_ReadTempAndHumi()==ERROR){
- TI=1;
- SBUF=0x01;
- TI=0;
- Delay_1ms(1000);
- }
- }
- }
- extern void Delay_1ms(unsigned int a){ //延時約1ms
- unsigned int i;
- while (--a!=0)
- for(i=600;i>0;i--);
- }
- static void DHT11_Delay_10us(void){
- unsigned char i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- /*讀一個字節的數據*/
- static unsigned char DHT11_ReadValue(void){
- unsigned char count, value = 0, i;
- status = OK; //設定標志為正常狀態
- for(i = 8; i > 0; i--){
- //高位在先
- value <<= 1;
- count = 0;
- //每一位數據前會有一個50us 的低電平時間.等待50us 低電平結束
- while(dht11 == 0 && count++ < NUMBER);
- if(count >= NUMBER){
- status = ERROR; //設定錯誤標志
- return 0; //函數執行過程發生錯誤就退出函數
- }
- //26-28us 的高電平表示該位是0,為70us 高電平表該位1
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- //延時30us 后檢測數據線是否還是高電平
- if(dht11 != 0){
- //進入這里表示該位是1
- value++;
- //等待剩余(約40us)的高電平結束
- while(dht11 != 0 && count++ < NUMBER){
- dht11 = 1;
- }
- if(count >= NUMBER){
- status = ERROR; //設定錯誤標志
- return 0;
- }
- }
- }
- return (value);
- }
- //讀溫度和濕度函數,讀一次的數據,共五字節,讀出成功函數返回OK, 錯誤返回ERROR
- extern unsigned char DHT11_ReadTempAndHumi(void){
- unsigned char i = 0, check_value = 0,count = 0;
- //EA = 0;
- dht11 = 0; //拉低數據線大于18ms 發送開始信號
- Delay_1ms(20); //需大于18 毫秒
- dht11 = 1; //釋放數據線,用于檢測低電平的應答信號
- //延時20-40us,等待一段時間后檢測應答信號,應答信號是從機拉低數據線80us
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- DHT11_Delay_10us();
- if(dht11 != 0){ //檢測應答信號,應答信號是低電平
- //沒應答信號
- // EA = 1;
- return ERROR;
- }
- else{
- //有應答信號
- while(dht11 == 0 && count++ < NUMBER); //等待應答信號結束
- if(count >= NUMBER){ //檢測計數器是否超過了設定的范圍
- dht11 = 1;
- // EA = 1;
- return ERROR; //讀數據出錯,退出函數
- }
- count = 0;
- dht11 = 1;//釋放數據線
- //應答信號后會有一個80us 的高電平,等待高電平結束
- while(dht11 != 0 && count++ < NUMBER);
- if(count >= NUMBER){
- dht11 = 1;
- // EA = 1;
- return ERROR; //退出函數
- }
- //讀出濕.溫度值
- for(i = 0; i < SIZE; i++){
- value_array[i] = DHT11_ReadValue();
- if(status == ERROR){ //調用ReadValue()讀數據出錯會設定status 為ERROR
- dht11 = 1;
- // EA = 1;
- return ERROR;
- }
- //讀出的最后一個值是校驗值不需加上去
- if(i != SIZE - 1){
- //讀出的五字節數據中的前四字節數據和等于第五字節數據表示成功
- check_value += value_array[i];
- }
- }//end for
- //在沒用發生函數調用失敗時進行校驗
- if(check_value == value_array[SIZE - 1]){
- //將溫濕度擴大10 倍方便分離出每一位
- humi_value = value_array[0] * 10;
- temp_value = value_array[2] * 10;
- dht11 = 1;
- // EA = 1;
- return OK; //正確的讀出dht11 輸出的數據
- }
- else{
- //校驗數據出錯
- // EA = 1;
- return ERROR;
- }
- }
- }
- /*****************************************************************************/
- /*****************************************************************************/
- /************************************************************************/
復制代碼
所有資料51hei提供下載:
1985486dht11.zip
(1.83 KB, 下載次數: 146)
2018-4-26 19:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|