
文章目录摘要设计内容实物图原理图程序清单资源获取摘要为了研究智能空调更简便的智能控制与管理操作实现空调节能环保效果对空调温度控制、感知人数等各个方面技术进行完善利用数字[1]和模拟电路控制技术[2]以及微处理器控制技术实现了硬件和软件的集成。以STC89C52单片机为核心温度传感器、红外传感器、继电器加以辅助进行设计使设计运行稳定。温度控制系统的设计是为了处理社会上存在的某些浪费现象从而节省能源。空调设置为手动和自动两种模式其中自动模式是利用红外传感器检测人体信号实时显示室内人数根据室内人数控制空调的开关手动模式是设置温度的上、下限值根据当前室内温度空调自动制冷或者制热风扇转动或者加热片发热。结果表明微机控制技术的应用使硬件与软件相结合大大提高了室内空调的使用功能大大简化了温度控制及其日常运行不仅不同区域的用户完全满足了房间内环境温度调节的不同要求而且空调能够完全智能自动调节室内的环境温度使得室内空调系统具有环保节能、操作更简单、无任何机械控制装置、安全防护性能更强等五大特点采用单片机控制技术降低了系统成本方便了实际的控制操作提高了室内空调所用能源的综合利用率。设计内容本设计以STC89C52单片机为核心控制设计应用了测温技术、红外感知技术、LCD显示设计技术、继电器控制设计技术和按键功能设计技术。单片机连接各类传感器和控制电路设备进而实现各种功能运行。总体设计框图如图1.1所示。图1.1 系统总体设计框图DS18B20温度传感器实时检测室内温度传送数字信号给STC89C52单片机红外计数传感器自动检测室内人体活动信号实时显示室内使用人数根据室内人数自动控制空调开关。室内有人时温度传感器实时检测室内温度达到低于系统设置的室内温度下限值时继电器控制空调制热加热片自动发热温度传感器实时检测室内温度达到高于系统设置的室内温度上限值时继电器控制空调制冷风扇转动降温。当室内无人时空调自动关闭达到节能的主要效果。按键模块可以手动设置温度的上限值和下限值过程中检测到的实时温度和人数都在LCD液晶显示器上显示出来。实物图原理图程序清单#include reg52.h#include lcd1602.h#include eepom52.h#define uchar unsigned char#define uint unsigned intsbit RelayP3^7;//制热IO口的定义 sbit zhilengP3^6;//制冷IO口的定义 sbit dqP1^3;//18b20 IO口的定义 uchar a_a;uint temperature;bit flag_300ms;uchar key_can;//按键值的变量 uchar menu_1;//菜单设计的变量 uint t_high500,t_low400;bit flag_lj_en;//按键连加使能 bit flag_lj_3_en;//按键连3次连加后使能 加的数就越大了 uchar key_time,flag_value;//用做连加的中间变量 bit key_500ms;uchar flag_clock;//温度报警变量 uchar zd_break_en,zd_break_value;//自动退出设置界面 uchar menu_shudu20;//用来控制连加的速度 sbit jin_1P3^2;//进来传感器1 sbit chu_1P3^3;//出去传感器1 uint zong_rs;//总人数 uint tongd1_jl;//通道1进来的人数 uint tongd1_cq;//通道1出去的人数 uchar t1_value;//通道1用做判断是进来还是出去的变量 uchar t1_zk;//通道1人走开 uchar t1_j_xd;//通道1进消抖 uchar t1_c_xd;//通道1出消抖 uchar t1_qans_qx;//通道1延时取消 uint t1_qans_value;//通道1延时取消 /***********************1ms延时函数*****************************/ void delay_1ms(uint q){uint i,j;for(i0;iq;i)for(j0;j110;j);}/******************把数据保存到单片机内部eepom中******************/ voidwrite_eepom(){SectorErase(0x2000);byte_write(0x2000, t_high %256);byte_write(0x2001, t_high /256);byte_write(0x2002, t_low %256);byte_write(0x2003, t_low /256);byte_write(0x2055, a_a);}/******************把数据从单片机内部eepom中读出来*****************/ voidread_eepom(){t_highbyte_read(0x2001);t_high8;t_high|byte_read(0x2000);t_lowbyte_read(0x2003);t_low8;t_low|byte_read(0x2002);a_abyte_read(0x2055);}/***********************18b20初始化函数*****************************/ voidinit_18b20(){bit q;dq1;//把总线拿高 delay_uint(1);//15us dq0;//给复位脉冲 delay_uint(80);//750us dq1;//把总线拿高 等待 delay_uint(10);//110us qdq;//读取18b20初始化信号 delay_uint(20);//200us dq1;//把总线拿高 释放总线}/*************写18b20内的数据***************/ void write_18b20(uchar dat){uchar i;for(i0;i8;i){//写数据是低位开始 dq0;//把总线拿低写时间隙开始 dqdat0x01;//向18b20总线写数据了 delay_uint(5);// 60us dq1;//释放总线 dat1;}}/*************读取18b20内的数据***************/ ucharread_18b20(){uchar i,value;for(i0;i8;i){dq0;//把总线拿低读时间隙开始 value1;//读数据是低位开始 dq1;//释放总线 if(dq1)//开始读写数据 value|0x80;delay_uint(5);//60us 读一个时间隙最少要保持60us的时间}returnvalue;//返回数据}/*************读取温度的值 读出来的是小数***************/ uintread_temp(){uint value;uchar low;//在读取温度的时候如果中断的太频繁了就应该把中断给关了否则会影响到18b20的时序 init_18b20();//初始化18b20 write_18b20(0xcc);//跳过64位ROM write_18b20(0x44);//启动一次温度转换命令 delay_uint(50);//500us init_18b20();//初始化18b20 EA0;write_18b20(0xcc);//跳过64位ROM write_18b20(0xbe);//发出读取暂存器命令 EA1;lowread_18b20();//读温度低字节 valueread_18b20();//读温度高字节 value8;//把温度的高位左移8位 value|low;//把读出的温度低位放到value的低八位中 value *0.625;//转换到温度值 小数returnvalue;//返回读出的温度 带小数}voidtongd1_display(){/*******************通道1处理********************/ if(t1_value0){if(jin_10){t1_j_xd ;if(t1_j_xd3){t1_j_xd0;t1_value1;t1_zk0;t1_qans_qx1;t1_qans_value0;}}elset1_j_xd0;if(chu_10){t1_c_xd ;if(t1_c_xd3){t1_c_xd0;t1_value2;t1_zk0;t1_qans_qx1;t1_qans_value0;}}elset1_c_xd0;}else{if(t1_qans_qx1){t1_qans_value ;//5ms if(t1_qans_value400)//2s t1_value0;}if(t1_value1){if((chu_10)(t1_zk0)){tongd1_jl ;//通道1进来的人数加1 zong_rstongd1_jl - tongd1_cq;t1_zk1;t1_qans_value0;t1_qans_qx0;}if(t1_zk1)//人走开{if(chu_11){t1_value0;t1_zk0;}}}if(t1_value2){if((jin_10)(t1_zk0)){if(tongd1_jltongd1_cq)tongd1_cq ;//通道1出去的人数加1 zong_rstongd1_jl - tongd1_cq;//计算总人数 t1_zk1;t1_qans_value0;t1_qans_qx0;}if(t1_zk1)//人走开{if(jin_11){t1_value0;t1_zk0;}}}}}/*************定时器0初始化程序***************/ voidtime_init(){EA1;//开总中断 TMOD0X01;//定时器0、定时器1工作方式1 ET01;//开定时器0中断 TR01;//允许定时器0定时}/****************独立按键处理函数************************/ voidkey(){static uchar key_new0,key_old0,key_value0;if(key_new0){//按键松开的时候做松手检测if((P10xf0)0xf0)key_value;else key_value0;if(key_value10){ write_eepom();key_value0;key_new1;flag_lj_en0;//关闭连加使能 flag_lj_3_en0;//关闭3秒后使能 flag_value0;//清零 } } else { if((P10xf0)!0xf0)key_value;//按键按下的时候 else key_value0;if(key_value7){ key_value0;key_new0;flag_lj_en1;//连加使能 zd_break_en1;//自动退出设置界使能 zd_break_value0;//自动退出设置界变量清零 key_time0;} } key_can20;if(key_500ms1){ key_500ms0;key_new0;key_old1;} if((key_new0)(key_old1)){switch(P10xf0){case0xe0: key_can4;break;//得到k1键值case0xd0: key_can3;break;//得到k2键值case0xb0: key_can2;break;//得到k3键值case0x70: key_can1;break;//得到k4键值}}key_oldkey_new;}/****************按键处理数码管显示函数***************/ voidkey_with(){if(key_can4){menu_1 ;if(menu_13){menu_10;}if(menu_10){write_com(0x0c);//关闭光标}if(menu_11){write_sfm3_18B20(2,2,t_high);write_com(0x800x405);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}if(menu_12){write_sfm3_18B20(2,10,t_low);write_com(0x800x4013);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}menu_shudu20;}if(menu_11)//设置高温报警{if(key_can3){if(flag_lj_3_en0)t_high ;//按键按下未松开自动加三次elset_high10;//按键按下未松开自动加三次之后每次自动加10 if(t_high990)t_high990;write_sfm3_18B20(2,2,t_high);write_com(0x800x405);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}if(key_can2){if(flag_lj_3_en0)t_high --;//按键按下未松开自动加三次elset_high -10;//按键按下未松开自动减三次之后每次自动减10 if(t_hight_low)t_hight_low 1;write_sfm3_18B20(2,2,t_high);write_com(0x800x405);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}write_eepom();}if(menu_12)//设置低温报警{if(key_can3){if(flag_lj_3_en0)t_low ;elset_low10;if(t_lowt_high)t_lowt_high -1;write_sfm3_18B20(2,10,t_low);write_com(0x800x4013);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}if(key_can2){if(flag_lj_3_en0)t_low --;elset_low -10;if(t_low10)t_low10;write_sfm3_18B20(2,10,t_low);write_com(0x800x4013);//将光标移动到秒个位 write_com(0x0f);//显示光标并且闪烁}write_eepom();}}/********************菜单对应的处理函数***********************/ voidmenu_dispaly(){if((menu_11))//对光标不处理要不然光标不会显示在正确的位置{write_com(0x800x45);//将光标移动到 write_com(0x0f);//显示光标并且闪烁}elseif((menu_12)){write_com(0x800x4d);//将光标移动到 write_com(0x0f);//显示光标并且闪烁}}/****************控制函数***************/ voidclock_h_l(){if(zong_rs1){if(temperaturet_low){Relay0;zhileng1;//关闭制冷装置 打开加热装置}elseif(temperaturet_high){Relay1;//停止加热装置 zhileng0;//打开制冷装置}}else{Relay1;//停止加热装置 zhileng1;//停止制冷装置}}voidmain(){init_1602();init_1602_dis_csf();temperatureread_temp();//先读出温度的值 time_init();//初始化定时器 read_eepom();write_sfm3_18B20(2,2,t_high);write_sfm3_18B20(2,10,t_low);if(a_a0xff)//新的单片机初始单片机内问EEPOM{t_high500;t_low400;a_a1;write_eepom();}Relay1;//停止加热装置 zhileng1;//停止制冷装置 delay_1ms(650);temperatureread_temp();//先读出温度的值 write_sfm3_18B20(1,2,temperature);while(1){tongd1_display();if(flag_300ms1)//300ms 处理一次温度程序{temperatureread_temp();//先读出温度的值 clock_h_l();//报警函数 flag_300ms0;write_sfm3_18B20(1,2,temperature);write_renshu(1,10,zong_rs);if(zd_break_en1)//自动退出设置界面程序{zd_break_value ;//每300ms加一次 if(zd_break_value80)//20秒后自动退出设置界面{menu_10;zd_break_en0;zd_break_value0;write_com(0x0c);//关闭光标}}menu_dispaly();//不同级的菜单对应显示1602对应显示不同}key();//按键程序 if(key_can10){key_with();//设置控制温度}}}/*************定时器0中断服务程序***************/ void time0_int()interrupt1{static uchar value;TH00x3c;TL00xb0;// 50ms value ;if(value %60){flag_300ms1;//300ms value0;}if(flag_lj_en1)//按下按键使能{key_time ;if(key_time5)//250ms{key_time0;key_500ms1;//500ms flag_value ;if(flag_value3){flag_value10;flag_lj_3_en1;//3次后1.5秒后连加大些}}}}资源获取下方名片联系我即可博主联系方式点击我获取资料--进我个人主页–获取博主联系方式大家点赞、收藏、关注、评论啦 、查看获取联系方式