#include "reg52.H"
#include "stdio.h"
#include "intrins.h"
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define DB P0//液晶并行数据接口
sbit RS = P2^0;//液晶指令数据信号
sbit RW = P2^1;//液晶读写信号
sbit E = P2^2;//液晶使能信号
sbit T_IO=P1^2; //clk为DS1302的时钟信号线
sbit T_CLK=P1^7; //DAT为DS1302的I/O数据线
sbit T_RST=P2^3; //RST为DS1302的RST信号线
uchar bdata datbyte;
sbit datbyte0=datbyte^0;
sbit datbyte7=datbyte^7;
uchar time_1302[7]={0x00,0x00,0x00,0x03,0x07,0x03,0x08};//设置时间初始值数组
// 秒 分 时 号 月份 星期 年
//DS1302函数声明
void get_1302(uchar time[]);
void write_ds1302(uchar dat);
uchar r_1302(uchar add);
void w_1302(uchar add,uchar dat);
uchar read_ds1302(void);
void init_1302(uchar *time);
void change();
uchar times[9];//保存时间
uchar date[11];//保存日期
unsigned char key_value;//获取到按键的值
sbit Data=P1^1; //温湿度IO
signed char humi_value;//湿度
signed char temp_value;//温度
unsigned char now_window;//当前显示窗口
unsigned char curr_menu;
#define normal_mode 0x10//显示模式
#define set_mode 0x20//设置模式
signed char AlarmTL=10; // 温度下限报警值
signed char AlarmTH=30; // 温度上限报警值
signed char AlarmHL=40; // 湿度下限报警值
signed char AlarmHH=80; // 湿度上限报警值
unsigned char i;
unsigned char cnt_100ms,cnt_500ms =0;
unsigned char time_100ms_flag;
//unsigned char open_del;//开锁成功延时计数
//unsigned char open_flag;//锁状态标志
sbit beep = P1^0;
sbit LedTL_P = P1^3; // 温度过低报警指示灯
sbit LedTH_P = P1^4; // 温度过高报警指示灯
sbit LedHL_P = P1^5; // 湿度过低报警指示灯
sbit LedHH_P = P1^6; // 湿度过高报警指示灯
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : cnt
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void delay_ms(unsigned int cnt) //
{
unsigned int x;
for( ; cnt>0; cnt--)
{
for(x=110; x>0; x--);//软件延时为1MS
}
}
#if 0
void delay_us(unsigned int cnt) //
{
while(cnt--);
}
#endif
/******************************************************
** 函数名:time_init
** 描述 :定时器初始化
** 输入 :无
** 输出 :无
******************************************************/
void time_init(void)
{
TMOD |= 0x01;//time0 工作方式为1
TH0 = 0xf8;//装载初值
TL0 = 0x2f;//装载初值,为2ms(65535-63535)
TR0 = 1;//开启定时器
ET0 = 1;//打开中断
EA=1;
}
/******************************************************
** 函数名:key_scan
** 描述 :按键扫描
** 输入 :无
** 输出 :无
******************************************************/
void key_scan(void)
{
static unsigned char key_in_flag = 0;//按键按下标志
unsigned char key_l;//存储扫描到行列值。
key_value = 20;//按键值清除
if((P3 & 0x0f) != 0x0f)//按键按下
{
delay_ms(1);//按键消抖动
if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
{
key_in_flag = 0;//松手检测防止一直触发
P3 = 0x0f;
//delay_ms(1);//按键消抖动
key_l = P3;//扫描得到按键值
switch(key_l)
{
//获取按键值
case 0x0e:
{
key_value = 1;
}
break;
case 0x0d:
{
key_value = 2;
}
break;
case 0x0b:
{
key_value = 3;
}
break;
//case 0x70:
//break;
}
}
}
else
{
key_in_flag = 1;//(按键松开标志)
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : u8com
* 输 出 : 无
*******************************************************************************/
void lcd_wri_com(unsigned char com) //写入命令
{
E = 0; //使能清零
RS = 0; //选择写入命令
RW = 0; //选择写入
DB = com;
delay_ms(1);
E = 1; //写入时序
delay_ms(5);
E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : u8dat
* 输 出 : 无
*******************************************************************************/
void lcd_wri_data(unsigned char dat)//写入数据
{
E = 0; //使能清零
RS = 1; //选择写入数据
RW = 0; //选择写入
DB = dat;
delay_ms(1);
E = 1; //写入时序
delay_ms(5);
E = 0;
}
/*******************************************************************************
* 函 数 名 : WriString
* 函数功能 : 刷新屏幕显示
* 输 入 : hang,add,*p
* 输 出 : 无
*******************************************************************************/
void wri_string(unsigned char y,unsigned char x,unsigned char *p)
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);//选中地址
else
lcd_wri_com(0xc0+x);//选中地址
while(*p)
{
lcd_wri_data(*p);//写入数据
p++;
}
}
/*******************************************************************************
* 函 数 名 : lcd_write_char
* 函数功能 :
* 输 入 :
* 输 出 : 无
*******************************************************************************/
void lcd_write_char(unsigned char y, unsigned char x, unsigned char dat) //列x=0~15,行y=0,1
{
unsigned char temp_l, temp_h;
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);//选中地址
else
lcd_wri_com(0xc0+x);//选中地址
temp_l = dat % 10;
temp_h = dat / 10;
lcd_wri_data(temp_h + 0x30); //convert to ascii
lcd_wri_data(temp_l + 0x30);
}
/*********************光标控制***********************/
void lcd1602_guanbiao(unsigned char y, unsigned char x,unsigned char on_off)
{
if(on_off == 1) //开光标
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//将光标移动到秒个位
lcd_wri_com(0x0f);//显示光标并且闪烁
}
else
{
if(y==1)//如果选择第一行
lcd_wri_com(0x80+x);
else
lcd_wri_com(0xc0+x);//将光标移动到秒个位
lcd_wri_com(0x0c); //关光标
}
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void lcd_init(void) //LCD初始化子程序
{
lcd_wri_com(0x38);//置功能8位双行
lcd_wri_com(0x0c);//显示开关光标
lcd_wri_com(0x06);//字符进入模式屏幕不动字符后移
delay_ms(5);//延时5ms
lcd_wri_com(0x01); //清屏
wri_string(1,0,times);//初始化显示
wri_string(1,6,date);
wri_string(2,0,"H: %RH T: C ");//初始化显示
}
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
unsigned char DHT11_rec_byte() //接收一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1、显示温湿度 2、按键设置温湿度上下限 3、温度高于温度上限,温度过高电机启动,进行降温 4、温度低于温度下限,温度过低电机启动,进行升温 5、湿度高于湿度上限,湿度过高电机启动,进行降湿 6、湿度低于湿度下限,湿度过低电机启动,进行加湿
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机 的DHT11温湿度控制系统.rar (22个子文件)
_DHT11最终版
程序
code
main.OBJ 30KB
ds1302.h 515B
code.build_log.htm 1KB
main.c 19KB
code.lnp 25B
code.M51 35KB
main.LST 31KB
code.uvgui.Amusement 70KB
code.uvproj 14KB
code.hex 6KB
code.uvopt 5KB
code.uvgui.稚于最初 安于情长 70KB
code 25KB
ds1302.c 2KB
code.uvgui.DELL 88KB
仿真
DHT11温湿度报警.pdsprj.LAPTOP-OHTQA5R4.稚于最初 安于情长.workspace 3KB
Last Loaded DHT11温湿度报警.pdsbak 35KB
DHT11温湿度报警.pdsprj.LAPTOP-OHTQA5R4.Amusement.workspace 3KB
DHT11温湿度报警.pdsprj.DESKTOP-1J5M7J2.DELL.workspace 3KB
Backup Of DHT11温湿度报警.pdsbak 35KB
DHT11温湿度报警.pdsprj 35KB
DHT11温湿度报警.pdsprj.LAPTOP-HAA3M04I.asus.workspace 3KB
共 22 条
- 1
森旺电子
- 粉丝: 6749
- 资源: 212
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页