1.1软件开发环境与编程语言
在基于STM32F103C6的数字闹钟系统开发中,常选用Keil MDK作为软件开发环境,它集成度高,拥有完善的编译、调试等功能,能便捷高效地对STM32F103C6项目进行开发与管理;而编程语言方面,采用C语言,因其语法简洁、执行效率高、可直接操控硬件寄存器且有着丰富的库函数支持,便于开发者编写如系统初始化、各功能模块实现等代码,二者相互配合,为实现数字闹钟系统稳定且功能完备的软件程序奠定坚实基础。
1.2系统初始化程序设计
在基于STM32F103C6的数字闹钟系统中,系统初始化程序设计至关重要。它主要对STM32F103C6芯片的关键资源进行初始化配置,先是设置系统时钟,依据所选晶振频率及系统性能需求,通过配置相应寄存器确定合适的时钟源、倍频系数等,保障系统稳定且高效运行;接着初始化GPIO引脚,明确各引脚的输入输出模式、上下拉状态,使其适配后续连接的显示、按键等模块;还要配置定时器相关参数,如预分频值、自动重装载值等,为精准计时打基础,同时对中断系统进行设置,确定中断优先级和使能相应中断,以便能及时响应按键操作、定时触发等各类事件,为整个数字闹钟系统各功能的有序开展做好准备工作。
4.3时间处理模块程序设计
时间处理模块程序设计是基于STM32F103C6的数字闹钟系统软件核心部分之一。该模块首先依据时钟源及定时器产生的中断信号进行计时,精确计算时、分、秒的流逝,并对计时数据进行合理存储与更新。在时间显示方面,将计算所得的时间数据按照预设格式转换为适合显示模块输出的形式,例如将二进制数据转换为可在LCD屏上直观呈现的十进制时间字符。同时,还需处理闰年、闰月等特殊时间规则,以确保长期计时的准确性,为整个数字闹钟系统提供精准可靠的时间基准信息,保障其正常运行与时间相关功能的有效实现。
1.4闹钟功能模块程序设计
闹钟功能模块程序设计在基于STM32F103C6的数字闹钟系统里起着关键作用。该模块允许用户通过按键操作设置闹钟时间,并将其存储在特定的存储区域。程序以系统实时时间为参照,不断比对当前时间与所设闹钟时间,当二者匹配时,立即触发提醒机制,向提醒模块发送指令以启动声音、震动和灯光闪烁等提醒动作。同时,提供闹钟修改与删除功能,用户可根据需求灵活调整闹钟设置,相应的操作会更新存储的闹钟时间数据或清除对应闹钟信息,确保闹钟功能精准、便捷且可定制化地服务于用户日常时间提醒需求。
1.5按键处理模块程序设计
按键处理模块程序设计对于基于STM32F103C6的数字闹钟系统的人机交互至关重要。该模块通过轮询或中断触发方式检测按键动作,当有按键按下时,先对软件进行消抖处理以排除抖动干扰导致的误判,然后依据不同按键对应的功能逻辑进行响应。例如,针对时间设置按键,触发后进入时间调整模式,通过特定按键实现时、分数值的增减,并在显示屏上实时更新;对于闹钟设置按键,则引导进入闹钟相关操作流程,包括设置闹钟时间、选择提醒方式等,从而使系统能准确理解用户意图并执行相应操作,提升用户操作的流畅性与便捷性。
主程序如下:
#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; //关报警
}
}
}
}
完整代码和仿真链接