基于 STM32 的数字闹钟系统 Proteus 仿真设计与实现

发布于:2025-07-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

一、引言

        在嵌入式开发学习中,数字闹钟系统是一个经典的综合实践项目,既能巩固 STM32 微控制器、实时时钟(RTC)、外设交互等知识点,又能通过仿真工具快速验证设计合理性。本文将详细分享基于 STM32F103C6 的数字闹钟系统在 Proteus 中的仿真设计过程,包括系统架构、模块实现、仿真效果及核心代码解析,适合嵌入式初学者参考学习。

二、设计需求

1. 功能需求

基于 STM32 的数字闹钟系统需实现以下核心功能:

  • 实时显示:通过 LCD 屏幕显示日期(年 / 月 / 日)、时间(时 / 分 / 秒)及星期;
  • 交互控制:通过按键修改系统时间和设置闹钟;
  • 报警提示:到达设定闹钟时间时,蜂鸣器发声 + LED 闪烁报警;
  • 时间精度:依赖 RTC 芯片(DS1302)实现掉电仍能保持计时。

2. 仿真要求(Proteus)

  • 需在 Proteus 中搭建完整电路,包括 STM32 主控、LCD 显示、时钟模块、按键、报警电路;
  • 仿真过程中需验证时间显示、按键设置、闹钟触发等全流程功能;
  • 确保各模块引脚连接正确,时序逻辑无冲突(如 RTC 晶振频率 32.768kHz)。

三、系统总体设计

系统以 STM32F103C6 为核心,配合 5 大功能模块实现数字闹钟功能,整体架构如下:

STM32F103C6(主控) ←→ 时钟模块(DS1302)  // 提供实时时间
                   ←→ 显示模块(LM016L)   // 显示时间信息
                   ←→ 按键模块(4个按键)   // 时间/闹钟设置
                   ←→ 报警模块(蜂鸣器+LED)// 闹钟提示

各模块在 Proteus 中的设计细节如下:

3.1 主控模块(STM32F103C6)

  • 核心功能:处理时间数据、驱动外设、响应按键中断;
  • Proteus 配置:选择 STM32F103C6 芯片,配置外部晶振(8MHz)和 RTC 相关引脚(连接 DS1302 的 SCLK、I/O、RST);
  • 引脚分配:PA0~PA3 连接按键,PB 端口连接 LCD1602 的 8 位数据总线,PC13 控制报警 LED。

3.2 显示模块(LM016L LCD)

  • 功能:显示日期(如 2024-09-26)、时间(如 17:08:20)及设置界面;
  • Proteus 设计
    • 采用 16x2 字符型 LCD(LM016L),通过 8 位并行接口与 STM32 的 PB0~PB7 连接;
    • 控制引脚 RS(PB8)、RW(PB9)、E(PB10)用于指令 / 数据切换和读写控制;
    • 外接电位器调节 V0 引脚电压,优化显示对比度。
  • 仿真效果:通电后自动显示当前时间,设置模式下通过 “>” 符号指示可修改项(如年份、小时)。

3.3 时钟模块(DS1302)

  • 功能:提供高精度实时时钟,掉电后通过 3V 电池保持计时;
  • Proteus 设计
    • 选用 DS1302 芯片,外接 32.768kHz 晶振(X1)保证时间精度;
    • 电池(BAT1)接 VCC2 引脚,主电源接 VCC1,确保断电不丢数据;
    • 通过串行接口(SCLK、I/O、RST)与 STM32 的 PA1~PA3 通信,实现时间读写。

3.4 按键与报警模块

  • 按键模块
    • 4 个独立按键(设置时间、设置加、设置减、设置闹钟),通过 PA0~PA3 连接 STM32;
    • Proteus 中需添加下拉电阻(10kΩ),配合软件去抖(延迟 10ms)避免误触发。
  • 报警模块
    • 由蜂鸣器(BUZ1)、PNP 三极管(8550)和红色 LED(D1)组成;
    • STM32 通过 PB12 输出高电平时,三极管导通,蜂鸣器发声 + LED 点亮,实现声光报警。
  • 3.5 电路设计:

四、Proteus 仿真实现

1. 实时时间显示仿真

  • 启动 Proteus 仿真后,系统自动初始化 DS1302,LCD 显示当前日期(如 2024-09-26 Wed)和时间(如 15:08:54);
  • 时间每秒自动刷新,星期随日期联动更新(通过代码中RTC_Get_Week函数计算)。

2. 时间设置仿真

  • 按下 “设置时间” 键,LCD 进入设置界面,“>” 符号默认指向年份;
  • 再次按下 “设置时间” 键,“>” 依次切换到月份、日、时、分;
  • 通过 “设置加 / 减” 键调整对应数值(如年份从 2024 增至 2025),调整完成后再次按 “设置时间” 键保存退出。

3. 闹钟功能仿真

  • 按下 “设置闹钟” 键,LCD 显示 “Set Alarm” 界面,“>” 默认指向小时;
  • 调整完成后,当系统时间与闹钟时间(如 17:50)匹配时,蜂鸣器发声 + LED 闪烁,按下 “设置减” 键可关闭报警。

五、核心代码解析

以下为仿真中关键功能的代码片段(基于 STM32 标准库):

c

/***********************************************

***********************************************/
#include "delay.h"
#include "LCD1602.h" 
#include "key.h"


#include "led.h"
#include "ds1302.h"


#include "stdio.h" 	
#include "stdlib.h" 	

extern _Bool flag_timer;			//定时时间到标志位


int main(void)
{	

	_Bool Alarm = 0;
	unsigned char key_value = 0;					//按键返回值
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	Lcd1602_Init();									//液晶1602初始化
	LED_Init();
	KEY_Init();										//初始化端口

	DS1302_Init();  			   					//DS1302初始化
	KEY_Init();

 	while(1)
	{	
		
		DS1302_ReadTime();							//读取DS1302
		delay_ms(60);		

		key_value = KEY_Scan(0);		 			//按键单击
		switch(key_value)
		{
			case 1:
				KEY_Set();	
			break;
			case 2:
				BEEP = 1;							//取消报警
			break;
			
			case 4:
				KEY_Set_Alarm();					//设置闹钟	
			break;
			
			
		}
	
		DS1302_Time();							//显示时钟
			
		
		if(Timer_info.hou == Ahour&&Timer_info.min ==Amin )		//到达闹钟时间
		{
			if(Timer_info.sec==0)				//秒钟为0
			{
				if(Alarm==0)
				{
					Alarm = 1;
					BEEP = 0;					//开报警
			
				}
			}
			 
		}
		else
		{
			if(Alarm==1)
			{
				Alarm = 0;
				BEEP = 1;						//关报警
			
			}
		}
					
	}	
}

 另外附赠设计报告如下:

六、总结与展望

本设计通过 Proteus 完成了基于 STM32 的数字闹钟系统仿真,实现了时间显示、设置、闹钟等核心功能,验证了硬件电路与软件逻辑的合理性。后续可扩展温度显示(添加 DS18B20)或蓝牙同步功能,进一步提升实用性。对于嵌入式学习者,该项目是理解 “硬件 + 软件” 协同设计的绝佳案例,建议结合 Proteus 仿真逐步调试代码,加深对 STM32 外设的理解。

如果需要完整仿真工程文件或代码,可留言获取~


网站公告

今日签到

点亮在社区的每一天
去签到