基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解23354.pdf
《基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解23354.pdf》由会员分享,可在线阅读,更多相关《基于μPD78F0485单片机实验板的实时时钟程序设计与实现讲解23354.pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 基于PD78F0485 单片机实验板的实时时钟程序设计与实现 专业:计算机科学与技术 班级:11 级 学号:姓名:基于PD78F0485 单片机实验板的实时时钟程序设计与实现 1 实验环境 硬件:PC、PD78F0485 单片机。软件:Windows7 操作系统、开发环境支持软件NEC Electronics Microcomputer、Microsoft Visio 绘图 2 功能描述 a)液晶屏可切换显示日期和时间。b)具有日期和时间校对功能。c)用 LED1 LED12 模拟秒针走动。d)有闹钟功能。3 总体设计 3.1 显示设计 a)在 LCD 上显示年月日,分别用两位数表示年月日。
2、年的值从0099;月的值从 0112;日的值如果是2 月,闰年为0129,平年为0128,其他月份大月为0131,小月为0130。13.12.10年月日 图 3.1.1 年月日的显示 b)在 LCD 上显示星期时分,分别用两位数表示星期时分。星期的值从0006,其中 00 表示星期天,其它的则一一对应;时采用24 小时制,其值从0023;分的值从 0059。01.12.00星期时分 图 3.1.2 星期时分的显示 c)在 LCD 上显示时分秒。时采用24 小时制,其值从0023;分的值从0059;秒的 值从0059。12.00.00时分秒 图 3.1.3 时分秒的显示 3.2 时间显示切换设计
3、 设置一个全局变量i,初值为0。每按一下KEY1,i 的值加一。当 i=0,1,2,3 时,LCD 显示年月日。当 i=4,5,6 时,LCD 显示星期时分。当 i=7 时,LCD 显示时分秒。当 i 7 时,i 自动变为0。3.3 日期和时间校对设计 通过前面设置的全局变量i 和 KEY3 来实现。当 i=1 时,每按一下KEY3,年的值就 加一,直到大于99 时自动变为00。当i=2 时,每按一下KEY3,月的值就加一,直 到大于12 时自动变为01。当i=3 时,每按一下KEY3,日的值就加一,直到大于当 月天数时自动变为01。当i=4 时,每按一下KEY3,星期的值就加一,直到大于06
4、 时自动变为00。当i=5 时,每按一下KEY3,时的值就加一,直到大于23 时自动变 为 00。当i=6 时,每按一下KEY3,分的值就加一,直到大于59 时自动变为00。3.4 闹钟显示设计 当按下KEY2 时,LCD 显示闹钟设定的时间。00.00时分 图 3.4 闹钟的显示 3.5 闹钟调整设计 当按下KEY5 时,闹钟的时就加一,到23 时就归零。当按下KEY6 时,闹钟的分就 加一,到59 时就归零。3.6 闹钟开关设计 通过KEY4 控制闹钟的开关,并用LED 灯的亮灭来显示。将 LED 灯端口的输出信号 作为闹钟是否响铃的一个判断条件。按下KEY4,LED 灯的输出信号取反,输
5、出信号为 1 时灯亮并且闹钟打开,为0 时灯灭并且闹钟关闭。3.7 闹钟响铃设计 当闹钟设定的时分与时钟的时分相等并且闹钟处于打开状态时,蜂鸣器就会发出响声。3.8 用 LED1LED12 模拟秒针走动设计 将端口13、14、15 设置为输出模式,设置1 个全局变量s,初值为-1。当1 秒中断来 到时s 的值加一模12。根据s 的值亮相应的灯,并且灭上一个灯。实现一秒亮一个灯。4 功能模块设计 4.1 主模块 开始KEY=0?初始化KEY=1?KEY=2?KEY=3?闹钟函数Y调时函数闹钟显示切换时间显示函数闹钟开关显示时间KEY=0NYNKEY=7YNYKEY=4?NKEY=0YKEY=5?
6、NKEY=6?闹钟函数闹钟调时闹钟显示KEY=7Y闹钟调分NY闹钟显示N图 4.1 主模块流程图 当按键按下时,会改变KEY 的值。当 KEY1 按下时,KEY 的值就等于1,以此类推。主模块是一个无限循环,当 KEY 改变时,它就会转到相应的分支,执行相应的的功能。从而响应用户的操作。如KEY2 被按下,则主模块就会转到分支2,然后调用闹钟显示 函数,显示闹钟的当前设置值。4.2 初始化模块 选定cpu 的时钟为5.0Hz。将所有接LCD 的引脚指定为LCD 引脚,确定LCD 的显 示频率,打开LCD 显示。将P4 的六个端口设置为输出模式,接通上拉电阻,并且允 许六个按键中断。将P13、1
7、4、15 的所有端口设置为输出模式。将P3.3 和 P3.4 端 口设置为输出。选择8MHz 内部高速时钟作为主系统时钟,实时计数器时钟=fprs/28=32.768KHz。将周期性定时中断打开,设置为24 小时制,1 秒定时中断。将年的初值 设置为13,月初值为01,日初值为01,星期初值为00,时初值为12,分初值为00。4.3 实时时钟模块 利用实时计数器来实现实时时钟模块。实时计数器的秒计数寄存器、分计数寄存器、时计数寄存器、日计数寄存器、周计数寄存器、月计数寄存器、年计数寄存器在开启计 数模式后会自动计数。然后只要在一秒中断到来时,将寄存器中的值读入对应变量中,送到显示刷新模块刷新后
8、显示就能实现实时时钟了。4.4 闹钟设置模块 开始hour123?hour1=hour1+1NYhour1=0结束 开始minute159?minute1=minute1+1NYmInute1=0结束 图 4.4 闹钟设置模块流程图 利用变量hour1 和 minute1 来实现闹钟功能。当KEY5 或 KEY6 被按下就会分别调 用闹钟的调时、调分模块来设置闹钟的时间。Hour1 的值大于23 时归零,minute1 的 值大于59 时归零。4.5 INTRTC 中断处理模块 在一秒中断到来时,将实时计数器的秒计数寄存器、分计数寄存器、时计数寄存器、日计数寄存器、周计数寄存器、月计数寄存器、
9、年计数寄存器中的值从BCD 码转换为 十进制送入到相对应的变量中,等待显示刷新模块调用。4.6 显示刷新模块 主模块在循环中会不停的调用此模块,将实时时钟的最新值转换为LCD 的显示码,并送入到显示的缓存中,等待显示模块调用。4.7 时钟调时模块 开始i=0?关闭计数模式i=1?i=2?i=3?YMONTH=MONTH+1YEAR=YEAR+1YEAR=0NY计算天数YNYi=4?Yi=5?Ni=6?WEEK=WEEK+1YNDAY=1NYEAR 99?YNMONTH 12?NYMONTH=1NDAY天数?DAY=DAY+1NYWEEK 6?WEEK=0YHOUR23?YHOUR=HOUR+1
10、NHOUR=0NYMIN 59?YMIN=MIN+1MIN=0N开启计数模式结束图 4.7 时钟调时模块流程图 此模块根据全局变量i 的值,当KEY3 被按下时,分别对实时时钟的年、月、日、星 期、时、分、秒进行调整,达到调时目的。当各个寄存器的值达到所对应的最大值时,根据各自的性质归零或归一。4.8 按键中断模块 根据被按下的键,将KEY 设置成对应的值。KEY1 对应的值为1,以此类推。4.9 闹钟响铃模块 开始hOur1=HOUR?Y结束Nminute1=MIN?NYP3.4=1?NY打开蜂鸣器 图 4.9 闹钟响铃模块流程图 当闹钟设置的时、分与实时时钟的时分相等并且P3.4 端口的输
11、出值为1 即 LED 灯 亮时,打开蜂鸣器的输出。蜂鸣器就会发出声音提醒闹钟时间到了。4.10 显示模块 开始显示地址赋初值dp 6?bdp=对应缓冲区dpdp+NYdp=0显示结束 图 4.10 显示模块流程图 此模块根据全局变量i 的值,将对应的显示缓存区中的内容依次显示。4.11 流水灯模块 当一秒中断来到时,根据变量s 的值,LED 亮起对应的灯,并关闭上一个灯,s 的值加一模十二。5 操作说明 按下KEY1 键,改变LCD 的显示内容。按四下KEY1 键显示从年月日变为星期时分 再按三下KEY1 键显示又变为时分秒。按下KEY3 键,进行调时。当按了一下KEY1 键再按KEY3 键时
12、,对年进行调整;当按了两下KEY1 键再按KEY3 键时,对月进行调整;当按了三下KEY1 键再按KEY3 键时,对日进行调整;当按了四下KEY1 键再按KEY3 键时,对星期进行调整;当按 了五下KEY1 键再按KEY3 键时,对时进行调整;当按了六下KEY1 键再按KEY3 键 时,对分进行调整。按下KEY2 键,显示闹钟的设定时间。再按下KEY5 键,对闹钟的设定时间进行时 调整;再按下KEY6 键,对闹钟的设定时间进行分调整。按下KEY4 键,将 P3.4 LED 灯打开,并开启闹钟功能。再按一下关闭P3.4 LED 灯,并关闭闹钟功能。LED1LED12 每一秒依次亮一个灯。6 总结
13、 经过几周的单片机课程设计,已基本完成课题要求。功能上基本达标:时钟的显示,调时功能。时钟显示功能,精确度完全可以满足日常生活显示时间的需要;调时功能,方便快捷。本次设计是结合书本样例和老师给的样例,独立设计完成。另外,在本次设计的过程中,我发现很多的问题,虽然以前没有做过这样的设计但通过这次设计我学会了很多东西,单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉的写好一个程序并不是一件简单的事,比如写一个程序看其功能很少认为编写程序简单,但到编的时候才发现一些细微的知识或低级错误经常犯做不到最后常常失败,所以有些东西只有学精弄懂并且要细心才行,只学习
14、理论有些东西是很难理解的,更谈不上掌握。从这次的课程设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的练习的过程中才能提高,我想这就是我在这次课程设计中的最大收获。附录 程序清单:#pragma sfr /使用特殊功能寄存器#pragma access /使用绝对地址指令#pragma EI /使用开中断关中断功能#pragma DI#pragma interrupt INTKR inter RB1 /定义按键中断#pragma interrupt INTRTC RTC_INTRTC /定义周期性定时中断 cha
15、r SEC_Num;/定义一个秒单元 char MIN_Num;/定义一个分单元 char HOUR_Num;/定义一个时单元 char DAY_Num;/定义一个日单元 char WEEK_Num;/定义一个周单元 char MONTH_Num;/定义一个月单元 char YEAR_Num;/定义一个年单元 unsigned char hour1=0;/初始化闹钟时单元=0 unsigned char minute1=0;/初始化闹钟分单元=0 unsigned int numbercode10=0 x070d,0 x0600,0 x030e,0 x070a,0 x0603,0 x050b,
16、0 x050f,0 x0700,0 x070f,0 x070b;/数字“0”-“9”的显示码 unsigned char i=0;/显示转换标志,i=0,1,2,3 时显示年月日;i=4,5,6 时显示星期时分;i=7 时显示时分秒 unsigned char KEY=0;/定义全局变量key unsigned int s=-1;/定义全局变量s unsigned int buffy_m_d6;/年月日的数码显示缓存区 unsigned int buffw_h_m6;/星期时分的数码显示缓存区 unsigned int buffh_m_s6;/时分秒的数码显示缓存区 unsigned int
17、buffhm16;/闹钟的数码显示缓存区 void delay();/延时函数 unsigned int BCDtoDec(char bcd)/BCD 码转换十进制函数 char DectoBCD(int Dec)/十进制转换BCD 码函数 unsigned int m_days(unsigned int mmonth)/计算当月天数函数 void inter()/按键中断处理函数 void RTC_INTRTC()/INTRTC 中断处理函数 void noise()/闹钟响铃函数 void freshdisplaybuffer()/显示缓存区刷新函数 void d_c_inter()/切换
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 PD78F0485 单片机 实验 实时 时钟 程序设计 实现 讲解 23354
限制150内