×
单片机 > 单片机程序设计 > 详情

单片机DHT11温湿度检测器

发布时间:2023-08-31 发布时间:
|

元件清单:

元件型号 元件名称 元件标号

蜂鸣器 蜂鸣器 B1

10uF 电容 C1

20pF 电容 C2, C3

D 指示灯 D1, D2, D3, D4,

LCD1602 液晶 LCD1

9012 三极管 Q1

10K 电阻 R3, R4

2K 电阻 R1

2K 电阻 R2, R5

SW-PB 按键 S1, S2, S3, S4, S5

sw-灰色 电源开关 SW1

U1 单片机 U1

DHT11 温湿度传感器 U2

12M 晶振 Y1


单片机源程序如下:

#include // 头文件包含

#include


#define uchar unsigned char // 以后unsigned char就可以用uchar代替

#define uint unsigned int // 以后unsigned int 就可以用uint 代替


sfr ISP_DATA = 0xe2; // 数据寄存器

sfr ISP_ADDRH = 0xe3; // 地址寄存器高八位

sfr ISP_ADDRL = 0xe4; // 地址寄存器低八位

sfr ISP_CMD = 0xe5; // 命令寄存器

sfr ISP_TRIG = 0xe6; // 命令触发寄存器

sfr ISP_CONTR = 0xe7; // 命令寄存器


sbit Buzzer_P = P1^4; // 蜂鸣器

sbit DHT11_P = P1^5; // 温湿度传感器DHT11数据接入

sbit LcdRs_P = P1^0; // 1602液晶的RS管脚

sbit LcdRw_P = P1^1; // 1602液晶的RW管脚

sbit LcdEn_P = P1^2; // 1602液晶的EN管脚

sbit KeySet_P = P3^5; // “设置”按键的管脚

sbit KeyDown_P = P3^6; // “减”按键的管脚

sbit KeyUp_P = P3^7; // “加”按键的管脚

sbit LedTL_P = P2^0; // 温度过低报警指示灯

sbit LedTH_P = P2^1; // 温度过高报警指示灯

sbit LedHL_P = P2^2; // 湿度过低报警指示灯

sbit LedHH_P = P2^3; // 湿度过高报警指示灯


uchar temp; // 保存温度

uchar humi; // 保存湿度


uchar AlarmTL; // 温度下限报警值

uchar AlarmTH; // 温度上限报警值

uchar AlarmHL; // 湿度下限报警值

uchar AlarmHH; // 湿度上限报警值




/*********************************************************/

// 单片机内部EEPROM不使能

/*********************************************************/

void ISP_Disable()

{

ISP_CONTR = 0;

ISP_ADDRH = 0;

ISP_ADDRL = 0;

}



/*********************************************************/

// 从单片机内部EEPROM读一个字节,从0x2000地址开始

/*********************************************************/

unsigned char EEPROM_Read(unsigned int add)

{

ISP_DATA = 0x00;

ISP_CONTR = 0x83;

ISP_CMD = 0x01;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

// 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效

ISP_TRIG = 0x46;

ISP_TRIG = 0xB9;

_nop_();

ISP_Disable();

return (ISP_DATA);

}



/*********************************************************/

// 往单片机内部EEPROM写一个字节,从0x2000地址开始

/*********************************************************/

void EEPROM_Write(unsigned int add,unsigned char ch)

{

ISP_CONTR = 0x83;

ISP_CMD = 0x02;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

ISP_DATA = ch;

ISP_TRIG = 0x46;

ISP_TRIG = 0xB9;

_nop_();

ISP_Disable();

}



/*********************************************************/

// 擦除单片机内部EEPROM的一个扇区

// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除

/*********************************************************/

void Sector_Erase(unsigned int add)

{

ISP_CONTR = 0x83;

ISP_CMD = 0x03;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

ISP_TRIG = 0x46;

ISP_TRIG = 0xB9;

_nop_();

ISP_Disable();

}



/*********************************************************/

// 毫秒级的延时函数,time是要延时的毫秒数

/*********************************************************/

void DelayMs(uint time)

{

uint i,j;

for(i=0;i

for(j=0;j<112;j++);

}



/*********************************************************/

// 1602液晶写命令函数,cmd就是要写入的命令

/*********************************************************/

void LcdWriteCmd(uchar cmd)

{

LcdRs_P = 0;

LcdRw_P = 0;

LcdEn_P = 0;

P0=cmd;

DelayMs(2);

LcdEn_P = 1;

DelayMs(2);

LcdEn_P = 0;

}



/*********************************************************/

// 1602液晶写数据函数,dat就是要写入的数据

/*********************************************************/

void LcdWriteData(uchar dat)

{

LcdRs_P = 1;

LcdRw_P = 0;

LcdEn_P = 0;

P0=dat;

DelayMs(2);

LcdEn_P = 1;

DelayMs(2);

LcdEn_P = 0;

}



/*********************************************************/

// 1602液晶初始化函数

/*********************************************************/

void LcdInit()

{

LcdWriteCmd(0x38); // 16*2显示,5*7点阵,8位数据口

LcdWriteCmd(0x0C); // 开显示,不显示光标

LcdWriteCmd(0x06); // 地址加1,当写入数据后光标右移

LcdWriteCmd(0x01); // 清屏

}



/*********************************************************/

// 液晶光标定位函数

/*********************************************************/

void LcdGotoXY(uchar line,uchar column)

{

// 第一行

if(line==0)

LcdWriteCmd(0x80+column);

// 第二行

if(line==1)

LcdWriteCmd(0x80+0x40+column);

}



/*********************************************************/

// 液晶输出字符串函数

/*********************************************************/

void LcdPrintStr(uchar *str)

{

while(*str!='


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计