基于51单片机的数码管万年历_第1页
基于51单片机的数码管万年历_第2页
基于51单片机的数码管万年历_第3页
基于51单片机的数码管万年历_第4页
基于51单片机的数码管万年历_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 单片机(期末)课程设计 宜宾学院物理与电子工程学院课题论文单片机(期末)课程设计 题 目:基于51单片机的数码管万年历 院 (系): 物理与电子工程学院 专业年级: 2012级硕勋励志班 指导老师: 文良华 姓 名: 陈志凤 学 号: 120303025 2014年6月目 录摘 要2第一章 绪论31、1 万年历的背景31、2 万年历的应用4第二章 设计原理5第三章 实现过程63、1 方案选择63、2 系统框图63、3 说明63、4 电路模块说明73、5 软件设计模块83、5、1 万年历的算法83、5、2 时间处理93、5、3 日期处理10第四章 最终结果11第五章 收获与体会135、1 设计

2、过程中遇到的问题及解决方法135、2 收获与体会13致谢14参考文献15摘 要随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。现在所使用的万年历,即:包括若干年或适用于若干年的历书。万年只是一种象征,表示时间跨度大。本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。关键字

3、:51单片机、万年历、数码管、动态显示、定时/计数T0第一章 绪论1、1 万年历的背景万年历是我国古代传说中最古老的一部太阳历。为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。 相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。可是,天阴雨雾,影响测量。后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。当时的国君叫祖乙,天气风云的不测,使他很苦恼。 一个名叫阿衡的大臣,为讨好皇上,奏称要设天台敬祭天神。祖乙认为有理

4、,便带领百官去祭天,却无济于事。万年知道后,忍不住就带着日晷和漏壶去见皇上,对 祖乙讲清了日月运行的道理。祖乙听后龙颜大悦,感到有道理。于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。并派了十二个童子服侍万年。祖乙对万年说:"希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。"有一次,祖乙传旨要阿衡去了解万年测试历法的进展情况。当他登上日月坛时,看见天坛边的石壁上刻着:日出日落三百六,周而复始从头来。草木枯荣分四时,一岁月有十二圆。阿衡见此,知道万年的历法已研究成功,心中忐忑不安。他万分惧怕万年因创建历法而得宠,国君会怪罪自己提出祭祀天神的

5、主意。于是,他阴谋策划,派了一个刺客去除掉万年。刺客攀上日月阁,见万年正在阁上观察星斗,便张弓搭箭,准备射死他。谁知,刺客被卫士发现,被当场缉拿。祖乙知后,惩处了阿衡,亲自登上日月阁看望万年。万年指着天象,对祖乙说:“现在正是十二个月满,旧岁已完,新春复始,祈请国君定个节吧。”祖乙说:“春为岁首,就叫春节吧。”冬去春来,年复一年。后来,万年经过长期观察,精心推算,制定出了准确的太阳历。当他把太阳历呈奉给继任的国君时,已是满面银须。国君深为感动,为纪念万年的功绩,便将太阳历命名为“万年历”,封万年为日月寿星。而现在所使用的万年历,即:包括若干年或适用于若干年的历书。万年只是一种象征,表示时间跨度

6、大。我在本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。1、2 万年历的应用随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。比如黄历的出版、挂历、电子表、手机万年历软件、电脑万年历软件等等。随着科技的发展,现代的万年历能同时显示公历、农历和干支历等多套历法,更能包含黄历相关吉凶宜忌、节假日、提醒等多种功能信息;而其载体更包括历书出版物、电子产品、电脑软件和手机应用等非常丰富,极为方便人们查询使用。阳历,可能是我们的祖先最早使用的历法,它根据太阳运行规律制定。古人以为太阳绕地球运行,

7、转动一周为一年今日我们知道是地球绕太阳公转的周期,但古人的认识却相反。据学者考证,战国时还有太阳历,一年十个月,以天干为名,每月三十六日,分三旬,旬以地支为名,如此十个月三百六十日,加上五至六天不入干支的“废日”,一年就是三百六十五日或三百六十六日。在那种情况下,节气的安排首先有“夏至”、“冬至”,继而又有“春分”、“秋分”,季节上的回归年先分春秋二季,后来再分出春夏秋冬四季,以至二十四节气。古代文献管子中有这种历法的痕迹,彝族和西南少数民族的火把节与之有关。岭南民间至今还流传“冬至大过年”的说法,就是民间对这种历法的记忆残留。古人确实曾经以“一阳更始”的冬至作为元旦。阴历是按月亮的盈亏变化来

8、制定的。一个朔望月的周期是二十九或三十天,年的长短只是月的整倍数,与回归年无关。月也与四季寒暑无关。希腊历和回历都属于这种历法。它的一年中,也不可能出现“双春”、“盲年”。 第二章 设计原理 一年365天,分成12个月,这12个月里有7个月是31天,4个月是30天,1个月是28天或29天。将这样的算法用软件编程语言描述出来,再用硬件电路实现功能并显示,便设计出了一个简单的电子万年历。本次设计的原理非常简单,即利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴

9、极数码管)显示(动态显示)。并增加时间调整功能(调整位选择、根据具体要求加或者减调整)其原理就是向单片机P口送人一个识别信号,由单片机软件对信号进行处理,并实现功能。本次设计采用的是14位共阴极数码管,由P0口作段选(P0.0-A,P0.1-B,.,P0.7-DP)、P1口和P2口部分位作位选的动态显示。显示的时候只需向数码管送入相应段码,并选通相应的位,利用余辉效应和视觉停留效应便可实现显示。 第3章 实现过程3、1 方案选择l 方案一:采用日历时钟芯片DS1302来产生时间,数据经单片开机处理后送到数码管显示。l 方案二:采用纯单片机制作,利用AT89C51单片机内部的定时/计数器和中断产

10、生时间,经单片机处理后送数码管显示。方案一虽然定时准确,软件部分设计简单,但电路复杂成本高不适合初学者。所以本次设计采用方案二。3、2 系统框图如图3-1所示: 单 片 机(定时/计数、中断、数据处理)显示 按键图3-1 系统框图3、3 说明系统由51系列单片机AT89C51、按键、数码显示三个模块构成。单片机包括时钟电路、复位电路;按键部分能实现对时间的调整,三个独立按键的功能分别是:调整选位、加、减。显示部分采用的是14位共阴极数码管,由P0口作段选、P1口和P2口部分位作位选的动态显示。3、4 电路模块说明3、4、1 复位、时钟电路(如图3-4-1所示)图3-4-1 复位、时钟电路如图3

11、-4-1,本次设计的晶振采用12MHZ的晶振(机器周期为1us),复位电路为按键复位。3、4、2 显示电路(如图3-4-2所示)图3-4-2 显示电路如图3-4-2所示,本次设计的显示模块采用的是用14位共阴极数码管动态显示。其中,P0口作段选(P0.0-A,P0.1-B,.,P0.7-DP)、P1口和P2口部分位作位选(P1.2-秒低位,P1.3-秒高位,P1.4-分低位,P1.5-分高位,P1.6-时低位,P1.7-时高位,P2.0-日低位,P2.1-日高位,P2.2-月低位,P2.3-月高位,P2.4、P2.5-年低位P2.6、P2.7-年高位)。3、4、3 按键调整电路(如图3-4-3

12、所示)图3-4-3按键调整电路如图3-4-3,系统外接三个独立按键,分别接入P3.0、P3.1、P3.2作用分别是调整选位、加、减(均为低电平有效)。3、4、4 完整的硬件电路图(如图3-4-4所示)图3-4-4 完整的硬件电路图3、5 软件设计模块3、5、1 万年历的算法 万年历的算法主要包括时间处理和日期处理,其软件大概框图如图3-5-1所示: 图3-5-1 软件算法流程图 图3-5-2 时间处理流程图3、5、2 时间处理 本次设计的时间处理十分简单,总结起来就一句话:定时计数满往前加一清零。流程图见图3-5-2所示,具体程序如下所示:3、5、3 日期处理 图3-5-3(a)闰年算法 图3

13、-5-3(b)闰年及大小月算法流程图 日期处理主要包括大小月处理,及闰年(二月)处理,处理方法见图3-5-3(ab),具体程序如下:第四章 最终结果 本次设计采用在Proteus中仿真来验证结果,具体仿真电路图及结果见图4-1、4-2、4-3、4-4所示:图4-1 仿真电路图 图4-2 仿真初始化显示图4-3 重设初值仿真图4-4 调整选位仿真第五章 收获与体会5、1 设计过程中遇到的问题及解决方法 设计过程中遇到很多问题,具体问题及解决方法如下: 问题一:程序编译的时候170多个错误。 解决办法:检查问题时发现,很多问题都是出在有P口出现的地方,经过多次修改后发现原来在Keil编译环境下不区

14、分大小写,但是编译C程序时定义端口时P必须要大写。 问题二:仿真的时候根本没有结果。 解决办法:通过对程序的进一步分析以及对电路图的核对发现自己犯了一个非常低级的错误。那就是使用P0口作的通用I/O口但却没有接上拉电阻,导致作段选驱动的P0不能正常驱动数码管。所以根本没有结果。于是便加上了上拉电阻。 问题三:终于有结果,但是乱码了。 解决办法:加了上拉电阻以后,终于有了结果,但是显示不正确。通过分析以后得出可能是选择的数码管不是共阴极的,然后在Proteus元件库中找出了多个二极管并将引脚随意接高低电平后进行仿真判断。最终选出了共阴极的数码管,并接入电路后得出了仿真结果。 问题四:这个完全是经

15、验问题。 解决办法:当所有仿真和PPT都做好以后,我就打包存档到了U盘,同时将电脑上的数据清空了。结果U盘坏了,唯一的解决办法就是 重做。还好,源程序还在!5、2 收获与体会 在整个过程中,我犯了很多低级错误,这些错误其实我都知道是怎么回事。也许把它们出成试卷或者作业题的形式我一个都不会错,但就是在实际应用中就会把这些平时看书时看过、记过甚至背过的注意事项变成一个个错误,导致设计不能成功。所以说,真正想把专业学好就必须实际动手去做。最后个问题可以归结为习惯问题,也可以归结于经验问题。虽然我重做时话费了很多时间,但我至少积累了一个经验。那就是,设计数据一定要存档,以防意外发生。致谢历时将近两个月

16、的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。尤其要强烈感谢我的论文指导老师文良华老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。在此向帮助和指导过我的各位老师表示最中心的感谢! 感谢这篇论文所涉及到的各位学者。本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。 感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。 由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正! 参考文献1 何立民.单片机应

17、用文集.北京航空航天大学出版社,1992.2 张毅刚,彭喜元.单片机原理及接口技术.人民邮电出版社,2008.3 胡景华,童淑敏,毕玉革,武佩.基于Proteus的温室温度自动控制系统的设 计与仿真.中国农机化.2012年,5期.附录:具体程序#include<AT89X51.H>#define uchar unsigned char#define uint unsigned int#define DQ P3_7uint sec=00;/系统初始时间2014.4.1 .12:00:00uint min=00;uint hour=12;uint day=1;uint month=4;

18、uint yearl=14;/低位年份可调uint yearh=20;/高位年份不可调uint tcnt;uint cursor=0;/循环变量用于调整模式时计数,最大为7uchar a=0xff;uchar code Seg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴数码管数字对应数组 void delay(uint t)/延时函数delayuint i;while(t-)for(i=0;i<125;i+);void Tdelay(unsigned int i)/延时函数Tdelaywhile(i-);void Kdela

19、y()/延时子程序Kdelay,用于按键时延时消抖uchar i,j;for(i=200;i>0;i-)for(j=248;j>0;j-);/显示函数:用于对应数字送人数码管显示,对应为动态显示 void display(uchar L1,uchar L2,uchar L3,uchar L4,uchar L5,uchar L6,uchar L7,uchar L8, uchar L9,uchar L10,uchar L11,uchar L12,uchar L13,uchar L14,uchar L15,uchar L16) P2=0x7f;P0=L1;delay(1);/ 年高位 P

20、2=0xbf;P0=L2;delay(1);/年高位 if(cursor=6)P2=0xdf|a;P0=L3;delay(1);elseP2=0xdf;P0=L3;delay(1);/低位年 if(cursor=6)P2=0xef|a;P0=L4;delay(1);elseP2=0xef;P0=L4;delay(1);/低位年 if(cursor=5)P2=0xf7|a;P0=L5;delay(1);elseP2=0xf7;P0=L5;delay(1);/月 if(cursor=5)P2=0xfb|a;P0=L6;delay(1);elseP2=0xfb;P0=L6;delay(1);/月 i

21、f(cursor=4)P2=0xfd|a;P0=L7;delay(1);elseP2=0xfd;P0=L7;delay(1);/日 if(cursor=4)P2=0xfe|a;P0=L8;delay(1);elseP2=0xfe;P0=L8;delay(1);/日 P2=0xff; if(cursor=3)P1=0x7f|a;P0=L9;delay(1);elseP1=0x7f;P0=L9;delay(1);/时 if(cursor=3)P1=0xbf|a;P0=L10;delay(1);elseP1=0xbf;P0=L10;delay(1);/时 if(cursor=2)P1=0xdf|a;

22、P0=L11;delay(1);elseP1=0xdf;P0=L11;delay(1);/分 if(cursor=2)P1=0xef|a;P0=L12;delay(1);elseP1=0xef;P0=L12;delay(1);/分 if(cursor=1)P1=0xf7|a;P0=L13;delay(1);elseP1=0xf7;P0=L13;delay(1);/秒 if(cursor=1)P1=0xfb|a;P0=L14;delay(1);elseP1=0xfb;P0=L14;delay(1);/秒 P1=0xfd;P0=L15;delay(1);/缓存 P1=0xfe;P0=L16;del

23、ay(1);/缓存 main() uint i; TMOD=0X02;/设置模式为定时器TO的模式2(8位自动重装初值) TH0=0X06;/ 设置计数器初值,靠THO存储重装的计数值X0=256-250=6 TL0=0X06; TR0=1;/启动T0 ET0=1;/开启定时器0中断允许 EA=1;/开启中断总控位while(1)if(P3_0=0)/判断是否为调整模式=0是;=1不是Kdelay();/ 延时消抖if(P3_0=0)/再次判断是否为调整模式,若是折执行以下操作cursor+;/循环变量加1,对应调整,如果前面是秒,此时调整为分if(cursor>=7)cursor=0;

24、/若循环变量cursor>=7。则赋值为0,对应于确认(即年的高位)if(P3_1=0)/若P3_1为低电平,对应+模式Kdelay();/消抖if(P3_1=0)/对应调整以下各位,如果cursor=1时应对应SEC秒加1if(cursor=1)sec+;if(sec=60)sec=0; if(cursor=2)min+;if(min=60)min=0; if(cursor=3)hour+;if(hour=24)hour=0; if(cursor=4)day+;if(day=31)day=0; if(cursor=5)month+;if(month=12)month=0; if(cursor=6)yearl+;if(yearl=100)yearl=0; if(cursor=7)yearh+;if(yearh=30)yearh=20;if(P3_2=0)/若P3_1为低电平,对应-模式Kdelay();/消抖if(P3_2=0) if(cursor=1)sec-; if(cursor=2)min-; if(cursor=3)hour-; if(cursor=4)day-; if(cursor=5)m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论