欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機DHT11檢測程序(串口發送)
[打印本頁]
作者:
Cheney111
時間:
2018-4-26 19:13
標題:
單片機DHT11檢測程序(串口發送)
關于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
作者:
卡薩丁斯柯達
時間:
2018-6-26 02:24
串口讀出01010101....
作者:
不德不
時間:
2018-8-3 15:48
學習學習,萌新
作者:
無線強大
時間:
2019-5-11 16:01
看不懂啊,能詳細一點不啊
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1