国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
AT89C52單片機DHT11溫濕度控制和光電計數代碼Proteus仿真
[打印本頁]
作者:
coolfire
時間:
2021-4-17 01:54
標題:
AT89C52單片機DHT11溫濕度控制和光電計數代碼Proteus仿真
以AT89C52為主控芯片,以DHT11為溫濕度傳感器,用LCD1602顯示數值,當濕度過高時,啟動電風扇(用L298N驅動直流電機模擬),當溫度過低時,啟動電熱管(用OVEN器件模擬)
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
205406d00o8pyw0opd8aox.jpg
(96.97 KB)
下載附件
2021-4-17 01:53 上傳
單片機部分源程序如下:
#include <reg52.h> /////////////頭文件
sbit IN1 = P2^3;
sbit IN2 = P2^4;
sbit ENA = P2^5;
sbit Res = P2^6; //電熱絲控制口
sbit Key = P2^7; //模擬光電門
////////////////////////////////////////////////////////////////////////////
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void ConfigTimer0(unsigned int ms);
unsigned char IntToString(unsigned char *str, int dat);
extern void LcdWriteCmd(unsigned char cmd);
extern void LcdWriteDat(unsigned char dat);
extern bit Start18B20();
extern bit Get18B20Temp(int *temp);
extern void InitLcd1602();
bit DHT_Start();
bit DHT_ByteRead(unsigned char *dat);
///////////////////////////// 數組命名
int Humity,Tempature,x;
int Count = 0; //工具計數值
bit flag1s = 0; //1s定時標志
unsigned char T0RH = 0; //T0重載值的高字節
unsigned char T0RL = 0; //T0重載值的低字節
///////////////////////////////// 延時子程序
void delay()
{
x=99999;
while(x--);
}
void Key_Scan( void )
{
if( Key == 0 )
{
delay();
if( Key == 0 )
{
Count++;
if( Count > 20 )
{
Count = 0;
}
}
while(!Key);
}
}
/////////////////////////////////
void main() ////////////////主程序
{
int Tempature = 0;
int Humidy = 0;
bit tmp;
unsigned char Decade = 0;
unsigned char Digtal = 0;
unsigned char str[12];
unsigned char DHT[5];
////初始化///////////////////////
EA = 1; //開總中斷
ConfigTimer0(10); //T0定時10ms
InitLcd1602(); //初始化液晶
////////////////////////////////////
DHT_Start();
delay();
delay();
delay();
delay();
ENA = 0;
IN1 = 1;
IN2 = 0;
Res = 0;
LcdShowStr(0, 0, "Temp:"); //顯示到液晶屏上
LcdShowStr(0, 1, "Humi:"); //顯示到液晶屏上
LcdShowStr(8, 0, "Num:"); //顯示到液晶屏上
while (1)
{
if (flag1s) //每秒更新一次溫度
{
DHT_Start();
tmp=DHT_ByteRead(&DHT);
if(tmp==1)
{
str[0] = (DHT[0]/10)%10 + '0'; //十位轉為ASCII碼
str[1] = (DHT[0]%10) + '0'; //個位轉為ASCII
LcdShowStr(5, 1, str);
str[0] = (DHT[2]/10)%10 + '0'; //十位轉為ASCII碼
str[1] = (DHT[2]%10) + '0'; //個位轉為ASCII
str[2] = '\0';
LcdShowStr(5,0, str);
Tempature= DHT[2];
Humity=DHT[0];
if( Tempature >= 24 )
{
Res = 0;
}
else if ( Tempature < 24 )
{
Res = 1;
}
/*********************************/
if( Humity >= 60 )
{
ENA = 1;
}
else if ( Humity < 60 )
{
ENA = 0;
}
}
}
Key_Scan();
Decade = Count/10;
Digtal = Count%10;
LcdWriteCmd(0x80+12);
LcdWriteDat(0x30+Decade);
LcdWriteDat(0x30+Digtal);
}
}
/* 整型數轉換為字符串,str-字符串指針,dat-待轉換數,返回值-字符串長度 */
unsigned char IntToString(unsigned char *str, int dat)
{
signed char i = 0;
unsigned char len = 0;
unsigned char buf[6];
if (dat < 0) //如果為負數,首先取絕對值,并在指針上添加負號
{
dat = -dat;
*str++ = '-';
len++;
}
do { //先轉換為低位在前的十進制數組
buf[i++] = dat % 10;
dat /= 10;
} while (dat > 0);
len += i; //i最后的值就是有效字符的個數
while (i-- > 0) //將數組值轉換為ASCII碼反向拷貝到接收指針上
{
*str++ = buf[i] + '0';
}
*str = '\0'; //添加字符串結束符
return len; //返回字符串長度
}
/* 配置并啟動T0,ms-T0定時時間 */
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //臨時變量
tmp = 11059200 / 12; //定時器計數頻率
tmp = (tmp * ms) / 1000; //計算所需的計數值
tmp = 65536 - tmp; //計算定時器重載值
tmp = tmp + 12; //補償中斷響應延時造成的誤差
T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //清零T0的控制位
TMOD |= 0x01; //配置T0為模式1
TH0 = T0RH; //加載T0重載值
TL0 = T0RL;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
}
/* T0中斷服務函數,完成1秒定時 */
void InterruptTimer0() interrupt 1
{
static unsigned char tmr1s = 0;
TH0 = T0RH; //重新加載重載值
TL0 = T0RL;
tmr1s++;
if (tmr1s >= 100) //定時1s
{
tmr1s = 0;
flag1s = 1;
}
}
復制代碼
溫度檢測仿真電路.zip
(136.49 KB, 售價: 2 E幣)
2021-4-17 01:54 上傳
點擊文件名下載附件
售價: 2 E幣
[記錄]
[
購買
]
溫度檢測C語言程序.zip
(76.76 KB, 售價: 2 E幣)
2021-4-17 01:54 上傳
點擊文件名下載附件
售價: 2 E幣
[記錄]
[
購買
]
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0