51单片机快速电热水器设计实现
51单片机快速电热水器设计实现
本项目使用51单片机设计一个快速家用电热水器,实现以下功能:
- 使用两位数码管显示出水温度,并显示设定功率档位。
- 温度检测范围是0-99℃,精确度为±1℃。
- 设置三个功率档位指示灯,1~4档亮一个灯,5~8档亮两个灯,9档亮三个灯。0档无功率输出,所有指示灯不亮。
- 设置三个按键,分别为电源开关键、'+'键、'-'键。加热功率0~9档按'+'键依次递增,按'-'键一次递减。0~9档分别对应0, 1/9P、2/9P...。
- 出水温度超过65℃时停止加热,并蜂鸣报警,温度降到45℃以下时恢复。
- 内胆温度超过105℃时停止加热,防止干烧。
Keil软件代码
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1 = P0 ^ 0; //数码管第一位
sbit D2 = P0 ^ 1; //数码管第二位
sbit S1 = P1 ^ 0; //电源开关键
sbit S2 = P1 ^ 1; //加热功率加键
sbit S3 = P1 ^ 2; //加热功率减键
sbit L1 = P1 ^ 3; //功率档位指示灯1
sbit L2 = P1 ^ 4; //功率档位指示灯2
sbit L3 = P1 ^ 5; //功率档位指示灯3
sbit BEEP = P3 ^ 5; //蜂鸣器
uint temp; //水温
uint set_power = 0; //设定功率档位
uint real_power = 0; //实际功率档位
uchar flag = 0; //温度超限标志
uchar count = 0; //定时器计数器
void delay(uint xms) //延时函数
{
uint i, j;
for (i = xms; i > 0; i--)
for (j = 100; j > 0; j--);
}
void Display(uint num) //数码管显示函数
{
uchar s1, s2;
s1 = num % 10; //计算个位数
s2 = num / 10; //计算十位数
D1 = 1; //显示第一位
P2 = s1; //数码管段选
delay(5); //延时
D1 = 0; //关闭第一位
D2 = 1; //显示第二位
P2 = s2; //数码管段选
delay(5); //延时
D2 = 0; //关闭第二位
}
void Timer0() interrupt 1 //定时器0中断服务函数
{
TH0 = 0xFC; //重新赋初值
TL0 = 0x67;
count++; //计数器加1
if (count == 20) //500ms
{
count = 0;
temp = rand() % 100; //模拟温度检测
if (temp > 65) //水温超过65℃
{
flag = 1; //标志位置1
BEEP = 1; //蜂鸣器响
}
else if (temp < 45) //水温低于45℃
{
flag = 0; //标志位清零
BEEP = 0; //蜂鸣器停止响
}
Display(temp); //显示水温
if (set_power == 0) //设定功率档位为0
{
real_power = 0; //实际功率档位为0
L1 = 0; //功率档位指示灯1不亮
L2 = 0; //功率档位指示灯2不亮
L3 = 0; //功率档位指示灯3不亮
}
else if (set_power <= 4) //设定功率档位为1~4
{
real_power = set_power; //实际功率档位为设定功率档位
L1 = 1; //功率档位指示灯1亮
L2 = 0; //功率档位指示灯2不亮
L3 = 0; //功率档位指示灯3不亮
}
else if (set_power <= 8) //设定功率档位为5~8
{
real_power = set_power - 4; //实际功率档位为设定功率档位减4
L1 = 0; //功率档位指示灯1不亮
L2 = 1; //功率档位指示灯2亮
L3 = 0; //功率档位指示灯3不亮
}
else if (set_power == 9) //设定功率档位为9
{
real_power = 5; //实际功率档位为5
L1 = 0; //功率档位指示灯1不亮
L2 = 0; //功率档位指示灯2不亮
L3 = 1; //功率档位指示灯3亮
}
}
}
void main()
{
TMOD = 0x01; //定时器0,模式1
TH0 = 0xFC; //赋初值,500ms中断一次
TL0 = 0x67;
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
TR0 = 1; //启动定时器0
while (1)
{
if (S1 == 0) //电源开关键按下
{
while (S1 == 0); //等待按键弹起
set_power = 0; //设定功率档位为0
real_power = 0; //实际功率档位为0
L1 = 0; //功率档位指示灯1不亮
L2 = 0; //功率档位指示灯2不亮
L3 = 0; //功率档位指示灯3不亮
BEEP = 0; //蜂鸣器停止响
flag = 0; //标志位清零
Display(0); //显示温度为0℃
}
if (S2 == 0) //加热功率加键按下
{
while (S2 == 0); //等待按键弹起
set_power++; //设定功率档位加1
if (set_power > 9) set_power = 9; //设定功率档位不能超过9
}
if (S3 == 0) //加热功率减键按下
{
while (S3 == 0); //等待按键弹起
set_power--; //设定功率档位减1
if (set_power > 9) set_power = 0; //设定功率档位不能小于0
}
if (real_power != 0 && flag == 0) //实际功率档位不为0且水温未超过65℃
{
//加热操作
}
}
}
说明:
- 代码中温度检测部分使用了
rand() % 100模拟温度传感器。实际应用中需要连接真实的温度传感器,并修改代码以读取传感器数据。 - 代码中的
//加热操作部分需要根据实际电路进行修改。 - 为了简化代码,本项目没有实现内胆温度超过105℃停止加热的功能。实际应用中需要添加相应的温度传感器和控制逻辑。
后续工作:
- 连接真实的温度传感器和加热器,实现实际的温度控制和加热功能。
- 添加内胆温度检测功能,防止干烧。
- 优化代码结构,提高程序效率。
- 完善程序功能,例如加入用户界面,提高用户体验。
本项目只是一个简单的示例,仅供参考。实际应用中需要根据具体需求进行设计和改进。
原文地址: https://www.cveoy.top/t/topic/oBMr 著作权归作者所有。请勿转载和采集!