基于51单片机的多路多点温度检测两种供电方式proteus仿真原理图PCB

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时循环显示多点温度值
2.当温度超过设定温度阈值范围时,蜂鸣器报警
3.按键可设定温度阈值范围/可控制报警开关

原理图:
在这里插入图片描述

PCB:
在这里插入图片描述

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "main.h"


unsigned char dispFlag = 0; //更新显示标志

enum _MODE_DF_ dispMode;
unsigned char num = 0;
int tempBuf = 0;                   //读取温度值
float temperature;              //实际温度值
int tempMin = 10;
int tempMax = 50;
bit alarmFlag = OFF;
bit alarmSwitch = ON;
unsigned char setIndex = 0;

char dis0[16]; //定义显示区域临时存储数组

void main(void)
{
    unsigned int channel = 0;

    Timer0_Init();
    LCD_Init();   //初始化液晶
    DelayMs(200); //延时有助于稳定
    LCD_Clear();  //清屏

    LCD_DispStr(0, 0, "    Welcome    ");
    DelayS(1);
    LCD_Clear();  //清屏

    DispNormal();

    num = DS18B20_SearchROM();

    while (1) //主循环
    {
        if (dispFlag == 1)
        {
            dispFlag = 0;
            
            if (dispMode == NORMAL)
            {
                TR0 = 0;
                if (channel == num)
                {
                    channel = 0;
                }
                DS18B20_Start();
                tempBuf = DS18B20_GetTemp(channel);
                channel++;

                temperature = (float)tempBuf * 0.0625; //温度值转换
                
                sprintf(dis0, "%01d", channel); //打印通道值
                LCD_DispStr(1, 1, dis0);
                
                sprintf(dis0, "%5.1f", temperature); //打印温度值
                LCD_DispStr(3, 1, dis0);
                
                TR0 = 1;

                if (temperature < tempMin || temperature > tempMax)
                {
                    alarmFlag = ON;
                }
                else
                {
                    alarmFlag = OFF;
                }

                if (alarmSwitch == ON)
                {
                    LCD_DispStr(11, 1, "ON "); //显示报警开关状态
                    if (alarmFlag == ON)
                    {
                        BUZZER_ON;
                        LCD_DispStr(14, 1, " !"); //显示报警标志
                    }
                    else
                    {
                        BUZZER_OFF;
                        LCD_DispStr(14, 1, "  ");
                    }
                }
                else
                {
                    LCD_DispStr(11, 1, "OFF  "); //显示报警开关状态
                    BUZZER_OFF;
                }
            }
        }
        KeyProcess();
    }
}

void DispNormal(void)
{
    LCD_WriteCommand(0x0C, 0); //关闭光标闪烁
    LCD_DispStr(0, 0, "  Temperature   ");
    LCD_DispStr(0, 1, "T0:       ");
    LCD_DispOneChar(8, 1, 0xdf);  //写入温度右上角点
    LCD_DispOneChar(9, 1, 'C');  //写入温度的C
}

void DispSetTemp(unsigned char setIndex)
{
    LCD_DispStr(0, 0, " Set Temp Limit "); 
    sprintf(dis0, "  L:%03d  H:%03d  ", tempMin, tempMax);
    LCD_DispStr(0, 1, dis0);
    
    switch (setIndex)
    {
        case 1: LCD_SetCursor(6, 1, 1); break;
        case 2: LCD_SetCursor(13, 1, 1); break;
        default:;
    } 
    
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
    TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
    TH0 = (65536 - 18432) / 256; //重新赋值 20ms
    TL0 = (65536 - 18432) % 256;
    EA = 1;  //总中断打开
    ET0 = 1; //定时器中断打开
    TR0 = 1; //定时器开关打开
}
/*------------------------------------------------
                定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
    static unsigned char time20ms  = 0;
    TH0 = (65536 - 18432) / 256; //重新赋值 20ms
    TL0 = (65536 - 18432) % 256;
    time20ms++;

    if (time20ms > 50)
    {
        time20ms = 0;
        dispFlag = 1; //读标志位置1
    }

}

仿真演示视频:
https://www.bilibili.com/video/BV1St4y1x79G/

实物演示视频:
https://www.bilibili.com/video/BV1YK411Q7x3/

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值