#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit DHT11 = P2^4; // 温湿度传感器的数据端
sbit BUZZER = P2^5; // 蜂鸣器驱动
sbit start = P2^3; //(1)启动温湿度转换
sbit topbot = P2^2; //(2)温湿度调整切换键
sbit add = P2^0; //(3)加
sbit minus = P2^1; //(4)减
sbit LED1 = P3^2; //湿度指示灯 红色
sbit LED2 = P3^3; //湿度指示灯 黄色
sbit LED3 = P3^4; //湿度指示灯 白色
sbit LED4 = P3^5; //湿度指示灯 蓝色
sbit RS =P2^6; //LCD1602的数据命令选择
sbit EN_LCD =P2^7; //LCD1602的使能信号
/*********************************************************
子函数定义
*********************************************************/
void delay(uint16 time); // 延时函数(6us单位)
void lcd_ini(); // LCD1602的初始化
void lcd_order(uint8 date); // 向LCD1602的写1个指令
void lcd_data(uint8 date); // 向LCD1602的写1个指令
uint8 dht11_ini(); // 向温湿度传感器发送开始信号
uint8 dht11_read(); // 从DHT11中读一个字节的数据
void dht11_got(); // 从DHT11中读温度的整小数,湿度的整小数,校验码
void call_waiting(); // 显示侍机界面
void tmprh_display(); // 温湿度及其上下限显示函数
void baojin(uint8 yan); // 蜂鸣器报警
void tmp_do(); // 温湿度显示处理
void rhtb_do(); //温度上下限调整界面显示处理
void key_con(); // 显示界面切换键是否按下
void key_admi(uint8 *date); // 加减按键检测
void system(); //系统功能实现函数
/*********************************************************
数组及全局变量的定义
**********************************************************/
uint8 tmprh[]={"TMP:00 RH:00 "}; //温湿度显示数组
uint8 tmphl[]={" TH:00 TL:00 "}; //名字输入及查看显示数组
uint8 rhhl[]={" RH:00 RL:00 "}; //名字输入及查看显示数组
uint8 code waiting1[]={" biyesheji "}; //侍机显示“毕业设计”
uint8 code waiting2[]={" wenshidujiance "}; //侍机显示“电子电话本”
uint8 TH_TMP=2; //温度的整数
uint8 TL_TMP=2; //温度的小数
uint8 TH_RH=2; //湿度的整数
uint8 TL_RH=2; //湿度的小数
uint8 CRC=0; //较验码
uint8 TMP_TOP=25; //温度的上限
uint8 TMP_BOT=13; //温度的下限
uint8 RH_TOP=75; //湿度的上限
uint8 RH_BOT=55; //湿度的下限
uint8 *tmprh_topbot; // 温湿度的上下限指针
bit start_value = 0; //启动温湿度转换按键当前值
uint8 topbot_value = 0; //温湿度上下限切换键当前值
/*********************************************************
主函数
*********************************************************/
int main(void)
{
BUZZER=1;
delay(100);
BUZZER=1;
lcd_ini();
delay(20000);
while(1)
{
key_con();
delay(10000);
system();
if(TH_RH<=55)
{
LED4=0;LED1=LED2=LED3=1;
}
else if(TH_RH>55&TH_RH<70)
{
LED3=0; LED1=LED2=LED4=1;
}
else if(TH_RH>=70&TH_RH<80)
{
LED2=0; LED1=LED4=LED3=1;
}
if(TH_RH>=80)
{
LED1=0; LED4=LED2=LED3=1;
}
}
}
/**********************************************
函数名:delay
行参 :time 延时基数
功能 :用while延时(6us单位)
************************************************/
// 延时函数(6us单位)
void delay(uint16 time)
{
while(time--);
}
/**********************************************
函数名:lcd_ini
功能 :LCD1602的初始化
************************************************/
void lcd_ini()
{
lcd_order(0x38); //设置1602的显示光标功能
delay(150);
lcd_order(0x0e); //显示开及光标设置
delay(150);
lcd_order(0x06); //显示光标移动设置
delay(150);
lcd_order(0x01); //显示清屏
delay(150);
}
/**********************************************
函数名:lcd_order
行参 :date 要定入的指令
功能 :向LCD1602的写1个指令
************************************************/
void lcd_order(uint8 date)
{
RS=0; //选择写指令
EN_LCD=0; //使能初使化
P0=date; //发送指令
EN_LCD=1; //开使能
delay(200); //延时
EN_LCD=0; //关使能
}
/**********************************************
函数名:lcd_order
行参 :date 要定入的指令
功能 :向LCD1602的写1个指令
************************************************/
void lcd_data(uint8 date)
{
RS=1; //选择写数据
EN_LCD=0; //使能初使化
P0=date; //发送指令
EN_LCD=1; //开使能
delay(200); //延时
EN_LCD=0; //关使能
}
/************************************************************
函数名:dht11_ini
返回值:ans,为1是收到DHT11的应答信号,
为0时表示未收到DHT11的应答信号
功能 :向温湿度传感器发送开始信号
************************************************************/
uint8 dht11_ini()
{
bit ans;
DHT11=1;
delay(1);
DHT11=0;
delay(1000);
DHT11=1;
delay(3);
if(!DHT11) //接收应答信号
ans=1;
else
ans=0;
while(!DHT11); //等待应答完成
return ans;
}
/************************************************************
函数名:dht11_read
返回值:date,从DHT11中读出的数据
功能 :从DHT11中读一个字节的数据
************************************************************/
uint8 dht11_read()
{
uint8 i,date=0;
DHT11=1;
TMOD=0X01;
TH0=0X00;
while(DHT11); //等待从机发送80us的高电平完成
for(i=0;i<8;i++)
{
TL0=0X00; //定时器初使化
while(!DHT11); //等待从机发送50us的低电平完成
TR0=1; //开启定时器
while(DHT11); //等待从机发送的高电平完成
TR0=0; //关启定时器
date<<=1; //数据左移以便接收数据
if(TL0>35) //拫据高电平的时间来判断从机发送的是0还是1
date|=0x01; //接收数据
}
return date;
}
/************************************************************
函数名:dht11_got
功能 :从DHT11中读温度的整小数,湿度的整小数,校验码
************************************************************/
void dht11_got()
{
if(dht11_ini()) //发送开始信号
{
TH_RH = dht11_read(); //湿度的整数
TL_RH = dht11_read(); //湿度的小数
TH_TMP = dht11_read(); //温度的整数
TL_TMP = dht11_read(); //温度的小数
CRC = dht11_read(); //读较验码
}
}
/************************************************************
函数名:tmprh_do()
功能 :温湿度显示处理
************************************************************/
void tmp_do()
{
tmprh[4]=TH_TMP/10+48; //温度十位
tmprh[5]=TH_TMP%10+48; //温度个位
tmprh[11]=TH_RH/10+48; //湿度十位
tmprh[12]=TH_RH%10+48; //湿度个位
}
/************************************************************
函数名:rhtb_do()
功能 :温度上下限调整界面显示处理
************************************************************/
void rhtb_do()
{
tmphl[4]=TMP_TOP/10+48; //温度上限十位
tmphl[5]=TMP_TOP%10+48; //温度上限个位
tmphl[11]=TMP_BOT/10+48; //温度下限十位
tmphl[12]=TMP_BOT%10+48; //温度下限个位
rhhl[4]=RH_TOP/10+48; //湿度上限十位
rhhl[5]=RH_TOP%10+48; //湿度上限个位
rhhl[11]=RH_BOT/10+48; //湿度下限十位
rhhl[12]=RH_BOT%10+48; //湿度下限个位
}
/*************************************************************
蜂鸣器
**************************************************************/
/***************************************************
函数名:baojin
功能 :蜂鸣器报警
****************************************************/
void baojin(uint8 yan)
{
if(yan)
BUZZER=1; //蜂鸣器不叫
else
BUZZER=0; //蜂鸣器叫
}
/**********************************************
函数名 :call waiting
功能 :显示侍机界面
************************************************/
void call_waiting()
{
uint8 i;
lcd_order(0x80); // LCD1602第一行显示的起始地址
for(i=0;i<=16;i++)
{
lcd_data(waiting1[i]); //侍机显示“毕业设计”
}
lcd_order(0xc0); // LCD1602第二行显示的起始地址
for(i=0;
wenshidu.rar_STM32F103_温湿度报警_温湿度检测_湿度_湿度检测
版权申诉
5星 · 超过95%的资源 155 浏览量
2022-09-24
04:20:40
上传
评论
收藏 31KB RAR 举报
御道御小黑
- 粉丝: 61
- 资源: 1万+
最新资源
- 蓝zapro.apk
- chromedriver-linux64.zip
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- python课程设计-基于tensorflow实现的图文生成程序,数据集flickr30k-images+源代码+文档说明+截图
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈