STM32电子钟万年历时钟闹钟LCD1602仿真设计

STM32电子钟万年历Proteus仿真_LCD1602液晶屏 (仿真+原理图+PCB+源码)

仿真: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);//延时

}

}

审核编辑:刘清

发表评论