|
其中用到的元器件有at89c52,dht11,18b20,1602,三極管,蜂鳴器
我讓dht11的濕度和18b20的濕度在1602顯示屏上顯示
第一行是dht11的濕度
第二行是18b20的溫度
因為dht11溫度不敏感,所以沒有使用
并且在程序中我讓溫度超過50度或者濕度達到50%時蜂鳴器會發出聲響,恢復正常值時,停止發出聲響.
51hei.png (26.93 KB, 下載次數: 46)
下載附件
2020-10-19 18:12 上傳
代碼如下
#include"reg51.h"
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char U8;
sbit DQ=P1^6; //溫度數據口 DS18B20
sbit dian=P2^6; //繼電器
sbit dht11=P3^3;
sbit lcden=P1^1;
sbit lcdrs=P1^3;
sbit lcdrw=P1^2;
sbit beep=P3^5;
U8 FLAG,temp3,comdata;
U8 T_H,T_L,RH_H,RH_L,jiaoyan;
U8 T_H_temp,T_L_temp,RH_H_temp,RH_L_temp,jiaoyan_temp;
U8 wendu,shidu;
U8 wendu_shi,wendu_ge,shidu_shi,shidu_ge,wendu_dian,wendu_q;
uchar code table2[]=" HUMI= %";
uchar code table1[]="TEMP= C";
unsigned int temp,temp1,temp2, xs,num,att,flag2,attt,setup=30,mode=0,setup1=0,setup2=0,MM,NN,BB;
/******延時程序*******/
void delay1(unsigned int m)
{
unsigned int i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void Delay2(uint j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void delay(unsigned int m) //溫度延時程序
{
while(m--);
}
void Init_DS18B20()
{
unsigned char x=0;
DQ = 1; //DQ復位 ds18b20通信端口
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay(4);
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}
/***********ds18b20讀一個字節**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 高電平拉成低電平時讀周期開始
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80; //
delay(4);
}
return(dat);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcd_init()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(att=0;att<10;att++)
{
write_data(table2[att]);
delay(10);
}
write_com(0x80+0x40);
for(num=0;num<9;num++)
{
write_data(table1[num]);
delay(10);
}
}
void write_sfm1(unsigned char add,unsigned char date)
{
write_com(0x80+0x40+add);
write_data(0x30+date);
// write_data(0x30+ge);
}
void write_sfm(unsigned char add,unsigned char date)
{
write_com(0x80+add);
write_data(0x30+date);
// write_data(0x30+ge);
}
/*************ds18b20寫一個字節****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0; //從高電平拉至低電平時,寫周期的開始
DQ = dat&0x01; //數據的最低位先寫入
delay(5); //60us到120us延時
DQ = 1;
dat>>=1; //從最低位到最高位傳入
}
}
/**************讀取ds18b20當前溫度************/
void ReadTemperature()
{
unsigned char a=0;
unsigned b=0;
unsigned t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作/
WriteOneChar(0x44); // 啟動溫度轉換
delay(5); // this message is wery important
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度/
delay(5);
a=ReadOneChar(); //讀取溫度值低位 /
b=ReadOneChar(); //讀取溫度值高位 /
temp1=b<<4; //高8位中后三位數的值
temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位數的值 temp1室溫整數值
temp2=a&0x0f; //小數的值
temp=((b*256+a)>>4); //當前采集溫度值除16得 實際溫度值 zhenshu
xs=temp2*0.0625*10; //小數位,若為0.5則算為5來顯示 xs小數 xiaoshu
}
/******************* DHT11函數區 **********************************/
void COM(void)
{
uint i;
for(i=0;i<8;i++)
{
FLAG=2;
while((!dht11)&&FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
temp3=0;
if(dht11)temp3=1;
FLAG=2;
while((dht11)&&FLAG++);
//超時則跳出for循環
if(FLAG==1)break;
//判斷數據位是0還是1
// 如果高電平高過預定0高電平值則數據位為 1
comdata<<=1;
comdata|=temp3;
}
}
void RH(void)
{
//主機拉低18ms
dht11=0;
Delay2(180);
dht11=1;
//總線由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
dht11=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!dht11)
{
FLAG=2;
//判斷從機是否發出 80us 的低電平響應信號是否結束
while((!dht11)&&FLAG++);
FLAG=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while((dht11)&&FLAG++);
//數據接收狀態
COM();
RH_H_temp=comdata;
COM();
RH_L_temp=comdata;
COM();
T_H_temp=comdata;
COM();
T_L_temp=comdata;
COM();
jiaoyan_temp=comdata;
dht11=1;
//數據校驗
temp3=(T_H_temp+T_L_temp+RH_H_temp+RH_L_temp);
if(temp3==jiaoyan_temp)
{
RH_H=RH_H_temp;
RH_L=RH_L_temp;
T_H=T_H_temp;
T_L=T_L_temp;
jiaoyan=jiaoyan_temp;
}
}
}
void wenshidu()
{
RH();
shidu=RH_H+RH_L/1000;
wendu=(T_H+T_L)*10;
shidu_shi=shidu%100/10;
shidu_ge=shidu%10;
wendu_shi=wendu%1000/100;
wendu_ge=wendu%1000%100/10;
wendu_dian=wendu%1000%100%10;
}
void main(void)
{
lcd_init();
while(1) {
wenshidu();
write_sfm1(6,temp/10);
write_sfm1(7,temp%10);
write_sfm(6,shidu_shi);
write_sfm(7,shidu_ge);
ReadTemperature();
if(shidu>0x32)
beep=0;
else
beep=1;
if(temp>0X32)
beep=0;
else
beep=1;
}
}
|
-
-
仿真圖.7z
2020-10-19 18:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
19.83 KB, 下載次數: 2, 下載積分: 黑幣 -5
|