找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4993|回复: 0
打印 上一主题 下一主题
收起左侧

单片机设计电子时钟闹钟,lcd1602显示日期时间、万年历

[复制链接]
跳转到指定楼层
楼主
    最近在做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)





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表