|
Altium Designer画的单片机大棚温湿度检测原理图和PCB图如下:(51hei附件中可下载工程文件)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
制作出来的实物图如下:
单片机源程序如下:
- /*************************************************************
- 大棚温湿度检测
- 补充说明:
- ***************************************************************/
- #include<reg52.h> //头文件
- #include<LCD1602.h>
- #include<AT24C02.h>
- #include<DHT11.h>
- /*****************灯、蜂鸣器、按键引脚定义*******************/
- sbit led = P3^7; //超限指示灯
- sbit led1 = P3^2; //正常指示灯
- sbit buzz = P2^3; //蜂鸣器
- sbit key_set = P1^0; //设置键
- sbit key_jia = P1^3; //加键
- sbit key_jian= P1^6; //减键
- /************************变量定义***********************/
- uchar temp_old,humi_old;//存储上一次的温度、湿度
- uchar temp_up,temp_down;//存储温度上、下限值
- uchar humi_up,humi_down;//存储湿度上、下限值
- uchar set_f; //设置选择标记,=0非设置,=1设置湿度上限,=2设置湿度下限
- // =3设置温度上限,=4设置温度下限。
- uchar T0_num; //计数变量
- /********************************************************
- 函数名称:void display(void)
- 函数作用:LCD1602显示固定的内容
- 参数说明:
- ********************************************************/
- void fixed_display(void)
- {
- lcd1602_write_character(0,1,"Humi:");//0:表示第1列,1:表示第1行,所有关于显示都一样
- lcd1602_write_character(0,2,"Temp:");//0:表示第1列,2:表示第2行,所有关于显示都一样
- lcd1602_write_character(12,1,"%RH"); //12:表示第13列,2:表示第1行,所有关于显示都一样
- LCD_disp_char(12,2,0x00); //显示自定义字符‘°’
- LCD_disp_char(13,2,'C'); //显示‘C’
- }
- /********************************************************
- 函数名称:void display1(void)
- 函数作用:显示当前实际温湿度
- 参数说明:
- ********************************************************/
- void display1(void)
- {
- if(DHT11_Check()==1) //判断校验和是否正确
- {
- if(humi_old<Humi_H) //判断湿度是否上升
- {
- LCD_disp_char(15,1,0x01); //显示‘↑’
- Delay_ms(50); //延时
- humi_old=Humi_H; //记录当前湿度
- }
- else
- if(humi_old>Humi_H) //判断湿度是否下降
- {
- LCD_disp_char(15,1,0x02); //显示‘↓’
- Delay_ms(50); //延时
- humi_old=Humi_H; //记录当前湿度
- }
- if(temp_old<Temp_H) //判断温度是否上升
- {
- LCD_disp_char(15,2,0x01); //显示‘↑’
- Delay_ms(50); //延时
- temp_old=Temp_H; //记录当前温度
- }
- else
- if(temp_old>Temp_H) //判断温度是否下降
- {
- LCD_disp_char(15,2,0x02); //显示‘↓’
- Delay_ms(50); //延时
- temp_old=Temp_H; //记录当前温度
- }
- //显示实测湿度值
- LCD_disp_char(6,1,ASCII[Humi_H/10]);
- LCD_disp_char(7,1,ASCII[Humi_H%10]);
- LCD_disp_char(8,1,ASCII[12]);
- LCD_disp_char(9,1,ASCII[Humi_L%10]);
- LCD_disp_char(10,1,'0');
- //显示实测温度值
- LCD_disp_char(6,2,ASCII[Temp_H/10]);
- LCD_disp_char(7,2,ASCII[Temp_H%10]);
- LCD_disp_char(8,2,ASCII[12]);
- LCD_disp_char(9,2,ASCII[Temp_L%10]);
- LCD_disp_char(10,2,'0');
-
- if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判断是否超出设置的温湿度上下限
- {
- buzz=0; //超出的话蜂鸣器响起
- led=0; //点亮报警灯
- led1=1;
- }
- else //否者温湿度都处于限值范围内
- {
- buzz=1; //关闭蜂鸣器
- led=1;
- led1=0; //点亮正常灯
- }
- }
- }
- /********************************************************
- 函数名称:void display2(void)
- 函数作用:显示设置时温湿度上下限
- 参数说明:
- ********************************************************/
- void display2(void)
- {
- T0_num++;
- lcd1602_write_character(0,1,"Humi:Up");
- lcd1602_write_character(0,2,"Temp:Up");
- lcd1602_write_character(9,1,",Down");
- lcd1602_write_character(9,2,",Down");
- if(T0_num%2==0) //偶数次显示,奇数次不显示。这样就会有闪烁效果,可以清楚看到当前设置的是哪个值
- {
- LCD_disp_char(7,1,ASCII[humi_up/10]); //显示 湿度上限
- LCD_disp_char(8,1,ASCII[humi_up%10]);
- LCD_disp_char(14,1,ASCII[humi_down/10]); //显示 湿度下限
- LCD_disp_char(15,1,ASCII[humi_down%10]);
-
- LCD_disp_char(7,2,ASCII[temp_up/10]); //显示 温度上限
- LCD_disp_char(8,2,ASCII[temp_up%10]);
- LCD_disp_char(14,2,ASCII[temp_down/10]); //显示 温度下限
- LCD_disp_char(15,2,ASCII[temp_down%10]);
- Delay_ms(1);
- }
- else //奇数次不显示
- {
- switch(set_f)//根据当前设置的内容,对应位置闪烁
- {
- case 1:lcd1602_write_character(7,1," "); break;
- case 2:lcd1602_write_character(14,1," "); break;
- case 3:lcd1602_write_character(7,2," "); break;
- case 4:lcd1602_write_character(14,2," "); break;
- default: break;
- }
- }
- }
- /********************************************************
- 函数名称:void delayms(uint ms)
- 函数作用:毫秒延时函数
- 参数说明:
- ********************************************************/
- void delayms(uint ms)
- {
- unsigned char i=100,j;
- for(;ms;ms--)
- {
- while(--i)
- {
- j=10;
- while(--j);
- }
- }
- }
- /********************************************************
- 函数名称:void scan(void)
- 函数作用:按键检测函数
- 参数说明:
- ********************************************************/
- void scan(void)
- {
- //设置键,不支持连按
- if(key_set==0) //按键按下
- {
- delayms(7); //延时消抖
- if(key_set==0) //再次确认按键按下
- {
- led=1; //关闭报警灯
- led1=1;
- buzz=1; //关闭蜂鸣器
- if(set_f==0)//进入设置先清除屏幕,显示设置部分
- {
- LCD_write_command(0x01); //清除屏幕显示
- delay_n40us(100); //延时等待全部清除完毕
- }
- set_f++; //设置变量+1
- if(set_f==5)//全部设置完成,退出设置
- {
- set_f=0;//重置设置变量
- AT24C02_write_date(0,humi_up); //写入【湿度上限】数据保存
- AT24C02_write_date(1,humi_down);//写入【湿度下限】数据保存
- AT24C02_write_date(2,temp_up); //写入【温度上限】数据保存
- AT24C02_write_date(3,temp_down);//写入【温度下限】数据保存
-
- LCD_write_command(0x01); //清除屏幕显示
- delay_n40us(100); //延时等待全部清除完毕
- fixed_display(); //清除显示后显示固定部分
- }
- }
- while(!key_set);//检测按键松开
- }
- //加值键,支持连按
- if(key_jia==0&&set_f!=0)
- {
- delayms(7);
- if(key_jia==0)
- {
- if(set_f==1) //设置 湿度上限值
- {
- if(humi_up<99) //最大值可设置99%RH
- humi_up++; //湿度上限+1%RH
- }
-
- if(set_f==2) //设置 湿度下限值
- {
- if(humi_down<99&&humi_down+1<humi_up)//最大值可设置99%RH,并且下限不可超过上限
- humi_down++;//湿度下限+1%RH
- }
-
- if(set_f==3) //设置 温度上限值
- {
- if(temp_up<99) //最大值可设置99℃
- temp_up++; //湿度上限+1℃
- }
-
- if(set_f==4) //设置 温度下限值
- {
- if(temp_down<99&&temp_down+1<temp_up)//最大值可设置99℃,并且下限不可超过上限
- temp_down++;//温度下限+1℃
- }
- }
- }
- //减值键,支持连按
- if(key_jian==0&&set_f!=0)
- {
- delayms(7);
- if(key_jian==0)
- {
- if(set_f==1) //设置湿度上限值
- {
- if(humi_up!=0&&humi_up>humi_down+1)//最小值可设置0%RH,并且上限得比下限大
- humi_up--; //湿度上限值-1%RH
- }
-
- if(set_f==2) //设置湿度下限值
- {
- if(humi_down!=0)//最小值可设置0%RH
- humi_down--;//湿度下限值-1%RH
- }
-
- if(set_f==3) //设置温度上限值
- {
- if(temp_up!=0&&temp_up>temp_down+1)//最小值可设置0℃,并且上限得比下限大
- temp_up--; //温度上限值-1℃
- }
-
- if(set_f==4) //设置温度下限值
- {
- if(temp_down!=0)//最小值可设置0℃
- temp_down--;//温度下限值-1℃
- }
- }
- }
- }
- /********************************************************
- 函数名称:void main()
- 函数作用:主函数
- 参数说明:
- ********************************************************/
- void main()
- {
- if(key_jian==0)
- {
- delayms(100);
- if(key_jian==0)
- {
- AT24C02_write_date(0,75);//写入【湿度上限值】数据保存
- AT24C02_write_date(1,45);//写入【湿度下限值】数据保存
- AT24C02_write_date(2,30);//写入【温度上限值】数据保存
- AT24C02_write_date(3,16);//写入【温度下限值】数据保存
- }
- }
- humi_up=AT24C02_read_date(0); //读取存储的【湿度上限值】数据
- humi_down=AT24C02_read_date(1);//读取存储的【湿度下限值】数据
- temp_up=AT24C02_read_date(2); //读取存储的【温度上限值】数据
- temp_down=AT24C02_read_date(3);//读取存储的【温度下限值】数据
- LCD_init(); //初始化LCD1602
- lcd1602_write_pic(0x00,pic); //将自定义字符“°”写入到LCD1602中
- lcd1602_write_pic(0x01,zeng); //将自定义字符“↑”写入到LCD1602中
- lcd1602_write_pic(0x02,jian); //将自定义字符“↓”写入到LCD1602中
- fixed_display(); //显示固定内容
- while(1)
- {
- scan(); //按键检测处理
- if(set_f==0) //正常显示模式
- {
- DHT11_read(); //读取DHT11温湿度
- display1(); //显示当前温、湿度
- }
- else
- display2(); //显示设置温湿度上下限
- }
- }
复制代码
所有资料51hei提供下载:
大棚温湿度检测.7z
(2.2 MB, 下载次数: 147)
|
|