STM32電子鐘萬年歷Proteus仿真_LCD1602液晶屏 (仿真+原理圖+PCB+源碼)
仿真:protues 8.9
程序編譯器:keil 5
編號C0003
題目要求:
1.具有顯示年、月、日、時、分、秒功能;
2.能計算并顯示星期;
3.能手動調(diào)整時間,設(shè)置鬧鐘;
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();//系統(tǒng)時鐘初始化 delay_init(10);//初始化延時函數(shù) TIM3_Init(2400-1, 72-1);// 10ms 定時器初始化 MX_RTC_Init(); //STM32內(nèi)部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)//設(shè)置模式 { 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);//參數(shù)0 得到全部顯示數(shù)據(jù) LCD_write_string(0, 0, (char*)temp_line_one);//LCD1602第一行顯示 LCD_write_string(0, 1, (char*)temp_line_two);//LCD1602第二行顯示 break; case 1://設(shè)置年份 Conv_Disp_Data(i*1);//i是1 屏蔽掉年份顯示。i是0,顯示年份。通過對i的取反實(shí)現(xiàn)年份閃縮 i = !i;//i取反 LCD_write_string(0, 0, (char*)temp_line_one);//LCD1602第一行顯示 break; case 2://設(shè)置月份 Conv_Disp_Data(i*2); i = !i; LCD_write_string(0, 0, (char*)temp_line_one); break; case 3://設(shè)置日份 Conv_Disp_Data(i*3); i = !i; LCD_write_string(0, 0, (char*)temp_line_one); break; case 4://設(shè)置時間 Conv_Disp_Data(i*4); i = !i; LCD_write_string(0, 0, (char*)temp_line_one); break; case 5://設(shè)置分鐘 Conv_Disp_Data(i*5); i = !i; LCD_write_string(0, 0, (char*)temp_line_one); break; case 6://設(shè)置秒 Conv_Disp_Data(i*6); i = !i; LCD_write_string(0, 0, (char*)temp_line_one); break; case 7://設(shè)置鬧鐘時鐘 Conv_Disp_Data(i*7); i = !i; LCD_write_string(0, 1, (char*)temp_line_two); break; case 8://設(shè)置鬧鐘分鐘 Conv_Disp_Data(i*8); i = !i; LCD_write_string(0, 1, (char*)temp_line_two); break; case 9://設(shè)置鬧鐘秒鐘 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++)//執(zhí)行十次 { LED2_TOG();//LED2翻轉(zhuǎn),蜂鳴器嘟嘟嘟報警 HAL_Delay(300); } } HAL_Delay(100);//延時 } }
?
審核編輯:劉清
評論