最近在做51單片機的設計,要求用定時器中斷來做個電子時鐘,用protues進行仿真。有鬧鐘、菜單、萬年歷、時間制式轉化(12小時制,24小時制)、掉電保存等功能。
TIM截圖20200702192208.png (146.81 KB, 下載次數: 79)
下載附件
2020-7-2 19:22 上傳
設計一個完整的鬧鐘程序,實現以下功能: 1. 具有4個以上按鍵,具有確定鍵,返回鍵,上移鍵,下移鍵,保存鍵等,可以通過按鍵設定時間的時鐘,分鐘,年,月,日 2. 設定能實現秒鐘的自動計時相加(利用定時器) 3. 具有萬年歷功能,能自動識別潤年與非潤年進行日期疊加 4. 具有12小時制和24小時制的切換 5. 采用LCD1602進行顯示,上電后先顯示學生學號,姓名,然后延遲5秒后進入日期和時鐘界面。 6. 可以設置鬧鐘,當時間到鬧鐘時候,具有設置提出鬧鈴(可以用其中一個led燈或者其他指示設備表示) 7. 鬧鈴設置能按周進行設置,可設計工作日,周末和每天 8. 設計小型操作系統實現各個數字字段的修改與確定 9. 能通過i2c外接一個E2ROM,將鬧鐘設置的數據保存,確保掉電重啟后數據不會丟失。
#include <reg51.h> //51頭文件
#include "lcd.h"
#include "Menu.h"
#include "Clock.h"
#include "E2ROM.h"
#include "I2C.h"
#include "Key.h"
extern char second;
extern unsigned char year;
extern unsigned char alarm_set_flag;
unsigned char menu_select = 0;
unsigned int timer_cnt = 0;
void interrupt_init();
void main()
{
interrupt_init();
Lcd_Init();
LcdClean();
i2c_init();
data_rece();
while(1)
{
switch(menu_select)
{
case 0: Calendar_display(); break;
case 1: alarm_displaya(); break;
case 2: Lunar_Calendar(); break;
case 3: menu_display(); break;
}
clock();
Calendar();
data_send();
}
}
/**********鍵盤掃描中斷服務函數*********/
void Key_interrupt() interrupt 2
{
key_scanf();
}
/**********時鐘中斷服務函數*********/
void TIME_interrupt() interrupt 1
{
TH0 = (65536-10000)/256; //重設初值
TH1 = (65536-10000)%256;
timer_cnt++;
if(timer_cnt>=100)
{
second++;
timer_cnt = 0;
}
alarm();
}
/**********中斷初始化配置*********/
void interrupt_init()
{
EA = 1;//全局中斷打開
EX1 = 1;//INT1中斷允許
EX1 = 1;//INT0中斷允許
IT1 = 1;//觸發方式為下降沿觸發
TMOD = 0x01;
TH0 = (65536-10000)/256;
TH1 = (65536-10000)%256;
ET0 = 1;
TR0 = 1; //計時開始
}
protues.zip
(42.7 KB, 下載次數: 91)
2020-7-2 19:26 上傳
點擊文件名下載附件
protues電路圖 下載積分: 黑幣 -5
keil.zip
(101.57 KB, 下載次數: 87)
2020-7-2 19:26 上傳
點擊文件名下載附件
keil4代碼 下載積分: 黑幣 -5
|