dht11部分:
#include "dht11.h"
/****
*******DHT11延時函式
*****/
void delay_dht11(uint i)
{
while(i--);
}
/****
*******DHT11延時1ms函式
*****/
void delay_ms_dht11(uint i)
{
while(i--)
delay_dht11(90);
}
/****
*******DHT11復位函式
*****/
void DHT11_Rst(void)
{
DHT11_DQ_OUT=0; //拉低DQ
delay_ms_dht11(20); //拉低至少18ms
DHT11_DQ_OUT=1; //DQ=1
delay_dht11(3); //主機拉高20~40us
}
/****
*******等待DHT11的回應函式
*******回傳1:未檢測到DHT11的存在
*******回傳0:存在
*****/
uchar DHT11_Check(void)
{
uchar retry=0;
while(DHT11_DQ_OUT&&retry<100)//DHT11會拉低40~50us
{
retry++;
_nop_();
}
if(retry>=100)
return 1;
else
retry=0;
while(!DHT11_DQ_OUT&&retry<100)//DHT11拉低后會再次拉高40~50us
{
retry++;
_nop_();
}
if(retry>=100)
return 1;
return 0;
}
/****
*******DHT11初始化函式
*******回傳1:初始化失敗
*******回傳0:初始化成功
*****/
uchar DHT11_Init(void)
{
DHT11_Rst();
return DHT11_Check();
}
/****
*******從DHT11讀取一個位函式
*******回傳值:1/0
*****/
uchar DHT11_Read_Bit(void)
{
uchar retry=0;
while(DHT11_DQ_OUT&&retry<100)//等待變為低電平 12-14us 開始
{
retry++;
_nop_();
}
retry=0;
while((!DHT11_DQ_OUT)&&retry<100)//等待變高電平 26-28us表示0,116-118us表示1
{
retry++;
_nop_();
}
delay_dht11(1);//等待40us
if(DHT11_DQ_OUT)
return 1;
else
return 0;
}
/****
*******從DHT11讀取一個位元組函式
*******回傳值:讀到的資料
*****/
uchar DHT11_Read_Byte(void)
{
uchar i,dat=0;
for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
}
return dat;
}
/****
*******從DHT11讀取一次資料函式
*******參量定義: temp:溫度值(范圍:0~50)
******* humi:濕度值(范圍:20%~95%)
*******回傳值:0:正常; 1:讀取失敗
*****/
uchar Dht11_Get_Temp_Humi_Value(uint *temp,uint *humi)
{
uchar buf[5];
uchar i;
DHT11_Rst();
if(DHT11_Check()==0)
{
for(i=0;i<5;i++)//讀取40位資料
{
buf[i]=DHT11_Read_Byte();
}
if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humi=buf[0]*10+buf[1];
*temp=buf[2]*10+buf[3];
}
}
else
return 1;
return 0;
}
main部分代碼:
#include "main.h"
#include "lcd1602.h"
#include "key.h"
#include "motor_zhiliu.h"
#include "ds1302.h"
#include "adc.h"
#include "dht11.h"
#include "uart.h"
/**********************************
變數定義
**********************************/
uchar key_num = 0; //按鍵標志位
uchar time_num = 0; //延時標記位
uchar flag_light = 0;
bit flag_person_cont = 0; //人數總計
bit flag_per_add = 0; //判斷人數增加
bit flag_per_cut = 0; //判斷人數減少
bit flag_display_obj = 0; //顯示標志位
uint temp,humi,ch4_value,light_value; //溫度,濕度,可燃性氣體,光照強度的引數
extern uchar light,uart_num; //繼承亮度引數
uchar send_buf[16]; //發送資料包
/**********************************
函式宣告
**********************************/
void Delay_function(uint x); //延時函式
void Key_function(void); //按鍵函式
void Monitor_function(void); //監測函式
void Display_function(void); //顯示函式
void Manage_function(void); //處理函式
/****
******* 主函式
*****/
void main()
{
while(DHT11_Init()); //DHT11初始化
Delay_function(10); //延時10ms
Lcd1602_Init(); //LCD1602初始化
Delay_function(10); //延時10ms
lcd1602_clean(); //清屏
Delay_function(10); //延時10ms
Ds1302_Init(); //時間芯片初始化
Delay_function(10); //延時10ms
Init_timer(); //串口初始化
Uart_Init(); //定時器初始化
IR_per = 1;
// ds1302_write_time(); //向DS302寫入時鐘資料,只在第一次燒錄時開啟
while(1)
{
Key_function(); //按鍵函式
Monitor_function(); //監測函式
Display_function(); //顯示函式
Manage_function(); //處理函式
Delay_function(1); //延時10ms
time_num++; //計時變數+1
if(time_num > 100)
{
sprintf(send_buf,"溫度:%.1f%",temp/10.0); //發送溫度資料采用浮點型
Uart_Sent_Str(send_buf);
sprintf(send_buf,"濕度:%.1f%%",humi/10.0); //發送濕度資料采用浮點型
Uart_Sent_Str(send_buf);
time_num = 0;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274934.html
標籤:單片機/工控
上一篇:FPGA
