基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB

功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示时间/当前温度
2.按键可进行闹钟设置和温度上下限设置
3.到达闹钟时间或温度超过阈值范围,蜂鸣器报警
4.到达闹钟时间,蜂鸣器将报警30s,可手动提前停止报警
5.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB_第1张图片

PCB :
基于51单片机的时钟闹钟温度计LCD1602显示proteus仿真原理图PCB_第2张图片

主程序:

#define __MAIN_C
#include 
#include "main.h"

enum DISP_MODE_DF DispMode; //显示模式

unsigned char setIndex = 0; //设置位置标志
unsigned char alarmTime[3] = {21, 0, 0}; //闹钟时间
bit dispFlag = 1; //显示标志
bit setFlag = 0; //设置标志
bit alarmSwitch = 0; //闹钟开关
bit buzzerFlag1 = 0; //蜂鸣器报警标志1
bit buzzerFlag2 = 0; //蜂鸣器报警标志2
unsigned char buzzerDelay = 0; //蜂鸣器报警倒计时
int tempBuf = 0; //温度
float f_temperature = 0.0; //温度
int minTemp = 15; //温度阈值下限
int maxTemp = 35; //温度阈值上限

void main()
{
    //初始化
    DispMode = NORMAL;
    setFlag = 0;
    Timer0_Init();
    LCD_Init();
    DS1302_Init();
    DelayMs(20);

    if (!KEY_ENTER) //启动过程中确定键按下,初始化时间
    {
        DelayMs(10);
        if (!KEY_ENTER)
        {
            DS1302_WriteTime(); //写入时间
        }
    }

    //开机显示
    LCD_DispStr(0, 0, "    Welcome!    ");
    DS18B20_Start(); 
    DS18B20_GetTemp(&tempBuf);
    f_temperature = (float)tempBuf * 0.0625;
    DelayS(2);
    LCD_Clear();
    


    while(1)
    {
        // LCD1602液晶显示
        if ((dispFlag == 1) && (setFlag == 0))
        {
            dispFlag = 0;
            
            DS1302_ReadTime(); //读取时间
            //检测温度
            DS18B20_Start(); 
            DS18B20_GetTemp(&tempBuf);
            f_temperature = (float)tempBuf * 0.0625;

            if (DispMode == NORMAL)
            {
                DispNormal(setIndex);
            }

            if (alarmSwitch == 1) //闹钟开关打开
            {
                if (alarmTime[0] == timeBufDec[4] && alarmTime[1] == timeBufDec[5] && alarmTime[2] == timeBufDec[6])
                {
                    buzzerFlag1 = 1;
                    buzzerDelay = 120; //报警30s 250ms*120
                    //buzzerDelay = 20; //报警5s 250ms*20
                }
            }

            if (f_temperature < minTemp || f_temperature > maxTemp)
            {
                buzzerFlag2 = 1;
                buzzerDelay = 20; //报警5s 250ms*20
            }
            else
            {
                buzzerFlag2 = 0;
            }

            if (buzzerFlag1 == 1 || buzzerFlag2 == 1)
            {
                if (buzzerDelay != 0)
                {
                    BUZZER = ON;
                    buzzerDelay--;
                }
                else
                {
                    BUZZER = OFF;
                }
                
            }
            else
            {
                BUZZER = OFF;
            }
        }

        KeyProcess(); //按键处理
    }
}

void Timer0_Init(void)
{
    TMOD &= 0xF0;
    TMOD |= 0x01;
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x4C;		//设置定时初始值 50ms
    TR0 = 1; //启动T0计时
    ET0 = 1; //打开T0中断
    EA = 1;  //打开总中断
}

void Timer0_Intterupt(void) interrupt 1
{
    static unsigned char time50ms = 0;

	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x4C;		//设置定时初始值 50ms

    time50ms++;
    
    if (time50ms >= 5) //250ms刷新一次状态
    {
        time50ms = 0;
        dispFlag = 1;
    }
    
}

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

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

你可能感兴趣的:(51单片机,proteus,单片机)