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


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

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

    PCB :
    在这里插入图片描述

    主程序:

    #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;
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136

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

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

  • 相关阅读:
    《Nuitka打包实战指南》实战打包Playwright
    期货开户应该了解的行内知识
    【ZYNQ】IP核_DDR4_SDRAM(MIG)的详细介绍
    比较复杂的策略路由综合实验
    2023NOIP A层联测14 修路
    React + hooks + Ts 实现将后端响应的文件流(如Pdf)输出到浏览器下载
    Doris入门了解
    软件设计原则-开闭原则讲解以及代码示例
    毕业旅行 | 伦敦5日游行程推荐
    STM32 CAN使用记录:FDCAN基础通讯
  • 原文地址:https://blog.csdn.net/jimo167913/article/details/127824615