久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
dht11和ds18b20溫濕度控制 單片機程序
[打印本頁]
作者:
1091212269
時間:
2019-6-5 12:44
標題:
dht11和ds18b20溫濕度控制 單片機程序
基于51單片機,傳感器使用dht11和ds18b20,dht11測溫度精度有限,18b20可以彌補。第一行顯示dht11采集到的濕度和溫度,以及繼電器狀態。第二行顯示18b20采集到溫度和THI。THi是畜牧業衡量動物熱應激指數的標準,不需要的刪除掉。繼電器是通過THI指數高低控制的。
1.jpg
(90.36 KB, 下載次數: 39)
下載附件
2019-6-6 03:58 上傳
單片機源程序如下:
/*********************************************************************************************
程序名: DHT11-1602
編寫人: fby
編寫時間: 2019年3月21日
硬件支持: STC89C52RC DHT11 LCD1602
接口說明: DHT11:VCC DATA NC GND
*********************************************************************************************
說明:1、單片機是STC89C52RC,晶振頻率11.0592MHz,實驗成功。
2、好東西要共享,大家隨意折騰~~
*********************************************************************************************/
#include "reg52.h"
#include<intrins.h> //此文件中定義了單片機的一些特殊功能寄存器
#include<stdio.h>
#include"temp.h"
#define uchar unsigned char //無符號字符型類型數據
#define uint unsigned int //無符號整型數據
#define ulong unsigned long //無符號整型數據
#define xiao float //xiaoshu
#define IODATA P0
uchar dat_r[10]; //用于存放從DHT11讀取到的數值
uchar sData[10];
sbit DATA=P2^0; //定義數據線
sbit RS=P2^6; //定義rs端口
sbit RW=P2^5; //定義rw端口
sbit E=P2^7;
sbit jidian=P3^7; //定義繼電器
static uint i;
extern uint zheng;
void delay200ms(void) //誤差 0us
{
unsigned char a,b,c;
for(c=4;c>0;c--)
for(b=116;b>0;b--)
for(a=214;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
/*******************************************************************************
* 函 數 名 : datapros()
* 函數功能 : 溫度讀取處理轉換函數
* 輸 入 : temp
* 輸 出 : 無
*******************************************************************************/
void datapros(int temp)
{
float tp;
if(temp< 0) //當溫度值為負數
{
sData[0]=0;
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
else
{
sData[0]=1;
tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
//顯示數據處理
sData[1] = '0'+(temp / 10000);
sData[2] = '0'+(temp % 10000 / 1000);
sData[3] = '0'+(temp % 1000 / 100) ;
sData[4] = '0'+(temp % 100 / 10);
sData[5] = '0'+(temp % 10);
//真實數據
sData[7] = temp / 10000;
sData[8] = temp % 10000 / 1000;
sData[9] = temp % 1000 / 100 ;
sData[10] =temp % 100 / 10;
}
/*******************************************************************************
* 函 數 名 : Timer1Init
* 函數功能 : 定時器1初始化
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void Timer1Init()
{
TMOD|=0X10;//選擇為定時器1模式,工作方式1,僅用TR1打開啟動。
TH1=0XFC; //給定時器賦初值,定時1ms
TL1=0X18;
ET1=1;//打開定時器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時器
}
/*********************************************************************************************
函數名:延時函數
調 用:Delay30us();/Delay20ms();/Delay1s();
參 數:無
返回值:無
結 果:延時相應時間
備 注:振蕩晶體為11.0592MHz(所有延時函數Copy自STC-ISP(v6.85).exe)
**********************************************************************************************/
void Delay30us() //@11.0592MHz-40
{
unsigned char i;
i = 11;
while (--i);
}
void Delay20ms() //@11.0592MHz
{
unsigned char i, j;
i = 36;
j = 217;
do
{
while (--j);
} while (--i);
}
void Delay1s() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*********************************************************************************************
函數名:DHT11啟動函數
調 用:無
參 數:無
返回值:無
結 果:DHT11開始工作
備 注:
**********************************************************************************************/
void DHT11_start() // 主機控制DHT11開始工作
{
DATA=1; // 主線空閑狀態
_nop_();
_nop_();
DATA=0; // 主機發送開始工作信號
Delay20ms(); //延時18ms以上
DATA=1; // 拉高并延時等待DHT11響應
Delay30us();
}
/*********************************************************************************************
函數名:DHT11讀數據函數
調 用:? = DHT11_rec_byte();
參 數:無
返回值:
結 果:讀DHT11數據并保存到dat
備 注:
**********************************************************************************************/
uchar DHT11_rec_byte() //接收一個字節
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位數據
{
while(!DATA); ////等待50us低電平過去
Delay30us();
Delay30us(); //延時60us,如果還為高則數據為1,否則為0
dat<<=1; //左移位使正確接收8位數據,數據為0時直接移位
if(DATA==1) //數據為1時,使dat加1來接收數據1
dat+=1;
while(DATA); //等待數據線拉低
}
return dat;
}
/*********************************************************************************************
函數名:接收DHT11的40位的數據并校驗
調 用:? = DHT11_receive();
參 數:無
返回值:無
結 果:結果保存到dat_r[i]中
備 注:
**********************************************************************************************/
void DHT11_receive() //接收40位的數據
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
//xiao thi;
//uint zheng;
DHT11_start(); // 主機控制DHT11開始工作
if(DATA==0)
{
while(DATA==0); //等待拉高
Delay30us();
Delay30us();
Delay30us(); //拉高后延時80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位
Delay30us(); //結束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數據處理,方便顯示*/
dat_r[0]='0'+(RH/10);
dat_r[1]='0'+(RH%10);
dat_r[2]='0'+(TH/10);
dat_r[3]='0'+(TH%10);
dat_r[4]=RH;
//dat_r[4]='0'+(zheng/100);
//dat_r[5]='0'+(zheng%100/10);
//dat_r[6]='0'+(zheng%10);
//dat_r[7]='0'+(zheng/10);
//dat_r[8]=Thi;
//dat_r[7]='0'+(h);
//dat_r[7]='0'+(zheng);
}
}
/********************************************************************
* 名稱 : bit Busy(void)
* 功能 : 這個是一個讀狀態函數,讀出函數是否處在忙狀態
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void Busy(void)
{
bit busy_flag = 1;
IODATA = 0xff;
RS = 0; //指令關
Delay30us();
RW = 1; //讀狀態
Delay30us();
E = 1; //使能高電平
while(1)
{
busy_flag = (bit)(IODATA & 0x80); //強制取最高位
if(busy_flag == 0)
{
break;
}
}
E = 0; //E 1->0,rs=0,rw=1,
//將數據寄存器內的數據讀到DB0~DB7,分別將狀態標志BF和地址計數器(AC)內容讀到DB7和DB6~DB0。
}
/********************************************************************
* 名稱 : lcd1602_write_cmd(uchar del)
* 功能 : 1602命令函數
* 輸入 : 輸入的命令值
* 輸出 : 無
***********************************************************************/
void lcd1602_write_cmd(uchar del)
{
RS = 0;
Delay30us();
RW = 0;
Delay30us();
E = 0;
Delay30us();
IODATA = del;
Delay30us();
E = 1;
Delay30us();
E = 0; //E 1->0,rs=0,rw=0, 將指令代碼寫入指令寄存器中
}
/********************************************************************
* 名稱 : lcd1602_write_data(uchar del)
* 功能 : 1602寫數據函數
* 輸入 : 需要寫入1602的數據
* 輸出 : 無
***********************************************************************/
void lcd1602_write_data(uchar del)
{
Busy();
Delay30us();
RS = 1;
Delay30us();
RW = 0;
Delay30us();
E = 0;
Delay30us();
IODATA = del;
Delay30us();
E = 1;
Delay30us();
E = 0; //E 1->0,rs=1,rw=0, 數據寫入數據寄存器中
}
/********************************************************************
* 名稱 : lcd1602_init()
* 功能 : 1602初始化,請參考1602的資料
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void lcd1602_init(void)
{
Delay20ms();
lcd1602_write_cmd(0x38); //8位數據,雙列,5*7字形
Delay20ms();
lcd1602_write_cmd(0x38);
Delay20ms();
lcd1602_write_cmd(0x38);
Busy();
lcd1602_write_cmd(0x08);// 只開顯示
Busy();
lcd1602_write_cmd(0x01); //清屏
Busy();
lcd1602_write_cmd(0x06);//顯示地址遞增,即寫一個數據后,顯示位置右移一位
Busy();
lcd1602_write_cmd(0x0c); //開啟顯示屏,關光標,光標不閃爍
}
/********************************************************************
* 名稱 : lcd1602_char(uchar hang,uchar lie,char sign)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符顯示"b" ,調用該函數如下
L1602_char(1,5,'b')
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void lcd1602_char(uchar hang,uchar lie,char sign)
{
uchar a;
if(hang == 1)
{
a = 0x80;
}
if(hang == 2)
{
a = 0xc0;
}
a = a + lie - 1;
Busy();
lcd1602_write_cmd(a); //置數據存貯器地址
Busy();
lcd1602_write_data(sign);
}
/********************************************************************
* 名稱 : lcd1602_string(uchar hang,uchar lie,uchar *p)
* 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
L1602_string(1,5,"ab cd ef;")
* 輸入 : 行,列,需要輸入1602的數據
* 輸出 : 無
***********************************************************************/
void lcd1602_string(uchar hang,uchar lie,uchar *p)
{
uchar a;
if(hang == 1)
{
a = 0x80;
}
if(hang == 2)
{
a = 0xc0;
}
a = a + lie - 1;
while(1)
{
Busy();
lcd1602_write_cmd(a);
Busy();
lcd1602_write_data(*p);
a++;
p++;
if((*p == '\0')||(a==0x90)||(a==0xd0)) //字符結束或每行最后一個字符
{
break;
}
}
}
void kongzhi() //控制函數
{
if(dat_r[8]>78) {jidian=0;lcd1602_string(1,16,"K");} // 上限74
else if(dat_r[8]<77) {jidian=1;lcd1602_string(1,16,"G");} // 下限72
else {lcd1602_string(1,16,"L");}
}
//thi計算函數
void thisuan()
{
xiao th;
uint thi,shi,wen;
shi=dat_r[4] ;
wen=sData[7]*100+sData[8]*10+sData[9]+sData[10]/10 ;
th=wen*0.81+(0.99*wen-14.3)*shi/100+46.3+0.5;
thi=th*10;
dat_r[5]='0'+(thi/100);
dat_r[6]='0'+(thi%100/10);
dat_r[7]='0'+(thi%10);
dat_r[8]=th;
}
/*********************************************************************************************
函數名:主函數
調 用:無
參 數:無
返回值:無
結 果:讀DHT11數據并送到1602顯示
備 注:
**********************************************************************************************/
void main (void)
{
Delay20ms();
lcd1602_init(); //LCD初始化
while(1)
{
datapros(Ds18b20ReadTemp());
delay200ms; //經測試,兩次連讀要至少延時80ms
DHT11_receive();//接受數據
thisuan();
lcd1602_string(1,1,"S:");
lcd1602_char(1,3,dat_r[0]);
lcd1602_char(1,4,dat_r[1]);
lcd1602_string(1,5,"%");
lcd1602_string(1,7,"W:");
lcd1602_char(1,8,dat_r[2]);
lcd1602_char(1,9,dat_r[3]);
lcd1602_char(1,10,0XDF);
lcd1602_string(1,11,"C");
lcd1602_string(2,1,"T:");
lcd1602_char(2,3,dat_r[5]);
lcd1602_char(2,4,dat_r[6]);
lcd1602_string(2,5,".");
lcd1602_char(2,6,dat_r[7]);
if(sData[0]==0)
{
lcd1602_string(2,8,"-");
}
if(sData[7]>0)
{
lcd1602_char(2,9,sData[1]);
}
lcd1602_char(2,10,sData[2]);
lcd1602_char(2,11,sData[3]);
lcd1602_string(2,12,".");
lcd1602_char(2,13,sData[4]);
//lcd1602_char(2,14,sData[5]);
lcd1602_string(1,13,"ji:");
kongzhi();
}}
//void Timer0() interrupt 3 //定時器中斷
//{
//TH0=0XFC; //給定時器賦初值,定時1ms
//TL0=0X18;
//i++;
//}
復制代碼
所有資料51hei提供下載:
THI dht11 18b20.zip
(78.98 KB, 下載次數: 90)
2019-6-5 12:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
eagleking
時間:
2019-11-2 15:29
樓主你太辛苦了,謝謝啊
作者:
Eli_
時間:
2019-11-6 23:19
stc89c52rc,11.0592MHz,實測可以運行!
作者:
明明12
時間:
2020-3-2 17:25
你好,我想問一下,DHT11怎么接入51開發板,接哪個引腳,小白一個。不是很懂
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩一区二区在线免费观看
|
日韩欧美不卡
|
日本成人毛片
|
午夜欧美a级理论片915影院
|
国产一区精品在线
|
国内精品视频在线观看
|
在线观看中文字幕视频
|
久久精品久久久久久
|
国产日韩欧美一区
|
亚洲欧美综合精品久久成人
|
国产高清一区二区三区
|
国产精品99久久免费观看
|
久久久久久国产精品免费免费狐狸
|
精品1区
|
久久精品国产一区二区电影
|
日韩精品在线看
|
久草免费在线视频
|
午夜99
|
天天碰夜夜操
|
二区精品
|
caoporon
|
久久久精品视频免费看
|
黑人巨大精品欧美一区二区免费
|
欧美日韩高清一区
|
中文字幕av在线一二三区
|
日韩综合在线
|
日韩视频观看
|
亚洲伊人精品酒店
|
毛色毛片免费看
|
成人午夜免费在线视频
|
一区二区日韩
|
精品国产免费一区二区三区五区
|
久久久久久黄
|
日韩欧美国产精品一区二区
|
东京av男人的天堂
|
成人av免费网站
|
av一级
|
成人福利影院
|
日韩一区二区三区在线视频
|
日韩av在线一区
|
亚洲免费网
|