万年历的单片机实现.docx
《万年历的单片机实现.docx》由会员分享,可在线阅读,更多相关《万年历的单片机实现.docx(34页珍藏版)》请在沃文网上搜索。
1、万年历的单片机实现一、 实验内容用单片机实现万年历二、 实验要求(1) 平时显示实时时钟与日历(2) 输入任意日子可显示对应的星期和阴历(3) 可设置的闹钟功能三、 实验器件DP-51PRO.NET综合实验箱微机一台(Keil软件)四、 设计任务分析本实验是基于51单片机的电子万年历的设计,其中包括当前时间与日期的显示,当前时间与日期的调整,闹铃的设置,任意日期的阴历查询以及星期查询的功能。可以依据功能,将显示分为三个界面,分别为当前时间与日期显示界面,闹铃设置界面,综合查询界面,可通过三个按键进行切换,按键时需要软件“去抖”。显示器件为型号为LCM12864的LCD液晶显示屏。具体实现过程如
2、下:五、 具体实现过程可以依据功能,将显示分为三个界面,分别为当前时间与日期显示与设置界面,闹铃设置界面,综合查询界面。由于LCM12864的配置文件中自带一个函数LCM_DispStr,可以直接将指定字符串显示于指定行列,故为了方便起见,也为了减少变量,将本实验中所需的时间与日期全部定义为字符串形式。事实证明,这样反而加大了程序代码的冗余。(一)、当前时间与日期显示与设置本界面中包含当前的时间与日期显示及设置功能,为主界面,即初始界面。1、当前时间与日期显示由于时间具有同步性,故时间应该是可以动态刷新的,又为了不被其它功能影响计时的准确性,可以用一个定时器中断予以实现。采用定时方式1,由于定
3、时器无法计时1S,故可以设置一个变量从而使其为2ms*500,不太清楚具体晶振频率,取TH=-2000/256,TL=-2000%256,即作12MHz处理,经测试平均约每分钟2s的误差。之所以设置值不大,也是为了后期的闹铃部分的闹钟能稍微响亮一些。同时每次更新完时间后,若秒钟达到了60秒,则会引起相应的时间甚至日期的进位。同时在日期的进位中,需要注意的是平闰年的2月只有28/29天,以及大月31天与小月30天。2、当前时间与日期修改在此过程中,需要有按键可以进入修改界面,以及退出界面,同时,在修改时需要移位以及数字的加减功能,为了方便表明修改的哪位,设置了一个周期约为0.2s的闪烁功能。另在
4、修改时,由于时间与日期有最大值限制,需要设置一个允许修改的范围。为了实用性,除年份可以4位都设置外,其它部分定义为只能设置个位,并因个位的变化而引起十位的进位或退位。调整时,不再计时。(二)、闹铃设置本界面包括闹铃的时间显示与设置,以及闹铃的开关,闹铃的执行。1、闹铃时间设置闹铃的时间设置类似于主界面中的时间设置功能,不同的是,增加了在每次时间更新后会与设定时间对比,若时间完全符合,且开关为On,即开启状态,会由定时器赋予蜂鸣器一个周期约为0.2s的方波,从而使其发出声音,闹铃执行过程中,其它功能正常进行,不影响计时,按下指定键后闹铃停止。2、闹铃开关闹铃的开关设置为仅可在设置闹铃时进行设置,
5、其中闹铃的开关标识符为一个全局变量,可通过指定按键修改,显示界面中会根据全局变量的值显示闹铃的开关状态。(三)、综合查询1、输入查询日期输入查询日期的过程与主界面中设置日期的过程类似,只是输入后会使查询的星期与阴历动态变化,而不需要确定键。2、显示查询的星期与阴历在输入查询的日期后,需要获得查询的星期几可以通过在网上查询到的一个公式:W=(Y-1)+(Y-1)/4-(Y-1)/100+(Y-1)/400+D其中Y是年份,D为累计的天数,然后W Mod 7即是当前星期几,若为0,则为星期天,即Sunday。阴历换算我确实不太懂,但经过网上搜索资料后,可以找到一个关于从1901年到2099年每年各
6、阴历月份的大小,春节所在的公历以及有无闰月等的表,则可以通过累计日期求出农历的日期,为了方便,未采用传统的天干地支计法,而直接采用了数字计法。六、 连线及实验配置准备1、软件设置:给出的拓展名.c的文件全部加入到Keil安装目录下的LIB文件夹里;给出的拓展名为.h的文件全部加入到INC文件夹里,并添加所有的c文件至工程中因为用到了外部I/O (RAM),所以调试时,要开放系统总线。点击工具栏的Project - Option for target target1 - debug - Settings,然后开放总线,即选择ALL BUS或者XBUS(推荐)。2、硬件连接a.将A2区J65的A0
7、-A3分别连接到B3区J75的A0-A2及/CS。b.将A2区J56的/WR、/RD分别连接到B3区J75的WR,WD。c.将A2区J51的P1.0连接到B3区J75的RSTd.将P1.4,P3.5,P3.4,P3.0,P3.1分别连接至D1区的K1-K5,P1.7连接至D4区的蜂鸣器七、 实验总结此次实验目的为设计一个电子万年历,并要求有一些指定功能。经过了好几天的编程,最后能实现一个基本没BUG的作品,看见自己的万年历可以正常运行了,还是挺欣慰的。通过这次实验给我最大的感受就是,不要着急写程序,架构最重要。因为我图一时方便用了字符串存储日期与时间,致使后面的程序复杂了不少,虽然最后还是达到
8、了一定的精确度,但是代码非常冗余。如果开始架构好,完全可以用单纯的数字存储,并通过编写通用的子函数来大大简化函数。如果在以后工作中,这点必须注意,不然代码维护性很差。另外,在实验过程中,有一个花了不少时间的在于,我不太懂LCM的内部连接,并且执意不采用周立功键盘而自行采用普通按键,致使花了很长时间才找出了可以正常用于与单片机交互可输入的I/O口。同时在实验中,我也学会了一些计算星期及阴历的算法,这样可以方便以后。另外,还有点很重要,只要自己愿意花时间去研究,在复杂的问题都可以解决。此次试验中,比较遗憾的一点,就是为图简单,未利用LCD的扫描函数,而使其完全为英文界面。八、 程序代码Code:#
9、include LCM_config.h#include #define uchar unsigned char#define uint unsigned intvoid window_now();void window_alarm();void window_search();void Delayms(uint ms);void T_delay();void TimeUpdate();void TimeShow();void DateUpdate();void DateShow();void AlarmShow();void SearchShow();void AlarmChanged();
10、void TimeDateChanged();void SearchDateChanged();void Sound();void LunarConversion(uchar Year);int JudgeRun(uchar Year);int JudgeWeek(uchar Year);int LunarBigOrSmall(uchar month_n, uint table_addr);uchar Date = 2014-07-10;uchar Time = 12:15:00;uchar Alarm = 13:27:40;uchar Input = 2014-07-09;uchar Lun
11、ar = 2014-02-08;uchar code Week710=Monday ,Tuesday ,Wednesday,Thursday ,Friday ,Saturday ,Sunday ;uchar code year_code = / 1901 - 2099/ 第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,/ BIT3-0 对应农历第1-4 月的大小/ 第二字节BIT7-0 对应农历第5-12 月大小,/ 第三字节BIT7 表示农历第13 个月大小/ 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天)/ BIT6-5 表示春节的公历月份,BIT4-0 表
12、示春节的公历日期 0x04,0xAe,0x53, /1901 0 0x0A,0x57,0x48, /1902 3 0x55,0x26,0xBd, /1903 6 0x0d,0x26,0x50, /1904 9 0x0d,0x95,0x44, /1905 12 0x46,0xAA,0xB9, /1906 15 0x05,0x6A,0x4d, /1907 18 0x09,0xAd,0x42, /1908 21 0x24,0xAe,0xB6, /1909 0x04,0xAe,0x4A, /1910 0x6A,0x4d,0xBe, /1911 0x0A,0x4d,0x52, /1912 0x0d,0x
13、25,0x46, /1913 0x5d,0x52,0xBA, /1914 0x0B,0x54,0x4e, /1915 0x0d,0x6A,0x43, /1916 0x29,0x6d,0x37, /1917 0x09,0x5B,0x4B, /1918 0x74,0x9B,0xC1, /1919 0x04,0x97,0x54, /1920 0x0A,0x4B,0x48, /1921 0x5B,0x25,0xBC, /1922 0x06,0xA5,0x50, /1923 0x06,0xd4,0x45, /1924 0x4A,0xdA,0xB8, /1925 0x02,0xB6,0x4d, /1926
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 单片机 实现
