仿真:protues 8.9
程序编译器:keil 5
编程语言:C语言
编号C0003
题目要求:
1.具有显示年、月、日、时、分、秒功能;
2.能计算并显示星期;
3.能手动调整时间,设置闹钟;
4.具有闹钟功能,时间到声光报警(蜂鸣器嘟嘟嘟,LED灯闪烁)。
讲解视频:
仿真图(提供源文件):
原理图(提供源文件):
PCB(提供源文件):
程序(提供源文件源码):
以下为部分程序:
int main(void)
{
bool i = 0;
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();//系统时钟初始化
delay_init(10);//初始化延时函数
TIM3_Init(2400-1, 72-1);// 10ms 定时器初始化
MX_RTC_Init(); //STM32内部RTC初始化
Key_Init();//按键初始化
Beep_Init();//声光报警初始化
LCD_Init();//LCD1602初始化
sAlrm_g.Alm_Hour = 0;//闹钟时间 时
sAlrm_g.Alm_Min = 0;//闹钟时间 分
sAlrm_g.Alm_Sec = 10;//闹钟时间 秒
while(1)
{
switch(set_mode)//设置模式
{
case 0:
HAL_RTC_GetDate(&hrtc, &sDate_g, RTC_FORMAT_BIN);//得到RTC的年月日
HAL_RTC_GetTime(&hrtc, &sTime_g, RTC_FORMAT_BIN); //得到RTC的时分秒
Conv_Disp_Data(0);//参数0 得到全部显示数据
LCD_write_string(0, 0, (char*)temp_line_one);//LCD1602第一行显示
LCD_write_string(0, 1, (char*)temp_line_two);//LCD1602第二行显示
break;
case 1://设置年份
Conv_Disp_Data(i*1);//i是1 屏蔽掉年份显示。i是0,显示年份。通过对i的取反实现年份闪缩
i = !i;//i取反
LCD_write_string(0, 0, (char*)temp_line_one);//LCD1602第一行显示
break;
case 2://设置月份
Conv_Disp_Data(i*2);
i = !i;
LCD_write_string(0, 0, (char*)temp_line_one);
break;
case 3://设置日份
Conv_Disp_Data(i*3);
i = !i;
LCD_write_string(0, 0, (char*)temp_line_one);
break;
case 4://设置时间
Conv_Disp_Data(i*4);
i = !i;
LCD_write_string(0, 0, (char*)temp_line_one);
break;
case 5://设置分钟
Conv_Disp_Data(i*5);
i = !i;
LCD_write_string(0, 0, (char*)temp_line_one);
break;
case 6://设置秒
Conv_Disp_Data(i*6);
i = !i;
LCD_write_string(0, 0, (char*)temp_line_one);
break;
case 7://设置闹钟时钟
Conv_Disp_Data(i*7);
i = !i;
LCD_write_string(0, 1, (char*)temp_line_two);
break;
case 8://设置闹钟分钟
Conv_Disp_Data(i*8);
i = !i;
LCD_write_string(0, 1, (char*)temp_line_two);
break;
case 9://设置闹钟秒钟
Conv_Disp_Data(i*9);
i = !i;
LCD_write_string(0, 1, (char*)temp_line_two);
break;
default:
break;
}
if( (sTime_g.Hours == sAlrm_g.Alm_Hour) && (sTime_g.Minutes == sAlrm_g.Alm_Min) && (sTime_g.Seconds == sAlrm_g.Alm_Sec) )//判断闹钟时间
{
for(uint8_t j = 0; j < 10; j++)//执行十次
{
LED2_TOG();//LED2翻转,蜂鸣器嘟嘟嘟报警
HAL_Delay(300);
}
}
HAL_Delay(100);//延时
}
}