【Proteus仿真】【51单片机】定时智能插座开关
2023-12-13 06:54:10
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使LCD1602液晶,DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。
主要功能:
系统运行后,LCD1602显示温度、温度阈值,定时时间及状态信息等;如果温度高于阈值,则开关关闭,且蜂鸣器报警。
如果温度低于阈值,当定时器状态开启,定时结束,开关关闭,发出提示音。正常模式下,可通过K1键对开关的开和关控制。
通过K3键进入阈值设置模式,可通过K3选择需修改的数据位置,K1和K2调节,当需要开启定时器时,需将状态由N设置为Y,K4键确定并返回正常模式。可通过蓝牙发送字符’O’远程打开开关,发送字符’C’关闭。
二、软件设计
/*
作者:嗨小易(QQVIP群2:570487280)
*/
//系统数据显示
void sys_data_show(void)
{
while(1)
{
//正常模式显示
if(sys_ctrl.mode==0)
{
//温度显示
lcd1602_show_nums(3,0,sys_ctrl.temp,2,0);
//温度阈值显示
lcd1602_show_nums(7,0,sys_ctrl.temph,2,0);
//时间显示
lcd1602_show_nums(5,1,sys_ctrl.time[0],2,0x80);
lcd1602_show_nums(8,1,sys_ctrl.time[1],2,0x80);
lcd1602_show_nums(11,1,sys_ctrl.time[2],2,0x80);
//开关状态显示
if(sys_ctrl.onoff==0)lcd1602_show_string(13,0,"OFF");
else lcd1602_show_string(13,0," ON");
//定时开关显示
if(sys_ctrl.time_onoff==0)lcd1602_show_string(15,1,"N");
else lcd1602_show_string(15,1,"Y");
}
//设置模式显示
else
{
//温度阈值显示
lcd1602_show_nums(7,0,sys_ctrl.temph,2,0);
//时间显示
lcd1602_show_nums(5,1,sys_ctrl.time[0],2,0x80);
lcd1602_show_nums(8,1,sys_ctrl.time[1],2,0x80);
lcd1602_show_nums(11,1,sys_ctrl.time[2],2,0x80);
switch(sys_ctrl.mode)
{
case 1://温度
lcd1602_show_string(7,0," ");
delay_ms(100);
lcd1602_show_nums(7,0,sys_ctrl.temph,2,0);
break;
case 2://小时
lcd1602_show_string(5,1," ");
delay_ms(100);
lcd1602_show_nums(5,1,sys_ctrl.time[0],2,0x80);
break;
case 3://分钟
lcd1602_show_string(8,1," ");
delay_ms(200);
lcd1602_show_nums(8,1,sys_ctrl.time[1],2,0x80);
break;
case 4://开关
lcd1602_show_string(15,1," ");
delay_ms(200);
if(sys_ctrl.time_onoff==0)lcd1602_show_string(15,1,"N");
else lcd1602_show_string(15,1,"Y");
break;
}
}
break;
}
}
//系统数据设置
void sys_data_set(void)
{
u8 key=0;
key=key_scan(0);
//模式设置
if(key==KEY3_PRESS)
{
sys_ctrl.mode++;
if(sys_ctrl.mode>4)sys_ctrl.mode=1;
}
//正常模式
if(sys_ctrl.mode==0)
{
//开
if(key==KEY1_PRESS)
{
sys_ctrl.onoff=!sys_ctrl.onoff;
}
}
//设置模式
else
{
//加
if(key==KEY1_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://温度
sys_ctrl.temph++;
if(sys_ctrl.temph>99)sys_ctrl.temph=0;
break;
case 2://小时
sys_ctrl.time[0]++;
if(sys_ctrl.time[0]>23)sys_ctrl.time[0]=0;
break;
case 3://分钟
sys_ctrl.time[1]++;
if(sys_ctrl.time[1]>59)sys_ctrl.time[1]=0;
break;
case 4://开关
sys_ctrl.time_onoff=!sys_ctrl.time_onoff;
break;
}
}
//减
else if(key==KEY2_PRESS)
{
switch(sys_ctrl.mode)
{
case 1://温度
sys_ctrl.temph--;
if(sys_ctrl.temph<0)sys_ctrl.temph=99;
break;
case 2://小时
sys_ctrl.time[0]--;
if(sys_ctrl.time[0]<0)sys_ctrl.time[0]=23;
break;
case 3://分钟
sys_ctrl.time[1]--;
if(sys_ctrl.time[1]<0)sys_ctrl.time[1]=59;
break;
case 4://开关
sys_ctrl.time_onoff=!sys_ctrl.time_onoff;
break;
}
}
//确定
else if(key==KEY4_PRESS)
{
sys_ctrl.mode=0;
}
}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619
联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
文章来源:https://blog.csdn.net/Hello_Muyi/article/details/134941318
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!