最近在做51单片机的设计,要求用定时器中断来做个电子时钟,用protues进行仿真。有闹钟、菜单、万年历、时间制式转化(12小时制,24小时制)、掉电保存等功能。
设计一个完整的闹钟程序,实现以下功能: 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)
keil.zip
(101.57 KB, 下载次数: 87)
|