51单片机快速电热水器设计实现

本项目使用51单片机设计一个快速家用电热水器,实现以下功能:

  1. 使用两位数码管显示出水温度,并显示设定功率档位。
  2. 温度检测范围是0-99℃,精确度为±1℃。
  3. 设置三个功率档位指示灯,1~4档亮一个灯,5~8档亮两个灯,9档亮三个灯。0档无功率输出,所有指示灯不亮。
  4. 设置三个按键,分别为电源开关键、'+'键、'-'键。加热功率0~9档按'+'键依次递增,按'-'键一次递减。0~9档分别对应0, 1/9P、2/9P...。
  5. 出水温度超过65℃时停止加热,并蜂鸣报警,温度降到45℃以下时恢复。
  6. 内胆温度超过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℃
        {
            //加热操作
        }
    }
}

说明:

  1. 代码中温度检测部分使用了 rand() % 100 模拟温度传感器。实际应用中需要连接真实的温度传感器,并修改代码以读取传感器数据。
  2. 代码中的 //加热操作 部分需要根据实际电路进行修改。
  3. 为了简化代码,本项目没有实现内胆温度超过105℃停止加热的功能。实际应用中需要添加相应的温度传感器和控制逻辑。

后续工作:

  1. 连接真实的温度传感器和加热器,实现实际的温度控制和加热功能。
  2. 添加内胆温度检测功能,防止干烧。
  3. 优化代码结构,提高程序效率。
  4. 完善程序功能,例如加入用户界面,提高用户体验。

本项目只是一个简单的示例,仅供参考。实际应用中需要根据具体需求进行设计和改进。

51单片机快速电热水器设计实现

原文地址: https://www.cveoy.top/t/topic/oBMr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录