基于51单片机的数码管万年历.docx
- 文档编号:25713343
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:21
- 大小:257.31KB
基于51单片机的数码管万年历.docx
《基于51单片机的数码管万年历.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数码管万年历.docx(21页珍藏版)》请在冰豆网上搜索。
基于51单片机的数码管万年历
宜宾学院
物理与电子工程学院课题论文
单片机(期末)课程设计
题目:
基于51单片机的数码管万年历
院(系):
物理与电子工程学院
专业年级:
2012级硕勋励志班
指导老师:
文良华
姓名:
陈志凤
学号:
120303025
2014年6月
摘要
随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。
现在所使用的万年历,即:
包括若干年或适用于若干年的历书。
万年只是一种象征,表示时间跨度大。
本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。
利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。
关键字:
51单片机、万年历、数码管、动态显示、定时/计数T0
第一章绪论
1、1万年历的背景
万年历是我国古代传说中最古老的一部太阳历。
为纪念历法编撰者万年功绩,便将这部历法命名为“万年历”。
相传,在很久以前,有个名叫万年的青年,看到当时节令很乱,想把节令定准。
一天,他上山砍柴,坐在树阴下休息,树影的移动启发了他,他设计了一个测日影计天时的晷仪。
可是,天阴雨雾,影响测量。
后来,山崖上的滴泉引起了他的兴趣,他又动手做了一个五层漏壶。
天长日久,他发现每隔三百六十多天,天时的长短就会重复一遍。
当时的国君叫祖乙,天气风云的不测,使他很苦恼。
一个名叫阿衡的大臣,为讨好皇上,奏称要设天台敬祭天神。
祖乙认为有理,便带领百官去祭天,却无济于事。
万年知道后,忍不住就带着日晷和漏壶去见皇上,对祖乙讲清了日月运行的道理。
祖乙听后龙颜大悦,感到有道理。
于是把万年留下,在天坛前修建日月阁,筑起日晷台和漏壶亭。
并派了十二个童子服侍万年。
祖乙对万年说:
"希望你能测准日月规律,推算出准确的晨夕时间,创建历法,为天下的黎民百姓造福。
"有一次,祖乙传旨要阿衡去了解万年测试历法的进展情况。
当他登上日月坛时,看见天坛边的石壁上刻着:
日出日落三百六,周而复始从头来。
草木枯荣分四时,一岁月有十二圆。
阿衡见此,知道万年的历法已研究成功,心中忐忑不安。
他万分惧怕万年因创建历法而得宠,国君会怪罪自己提出祭祀天神的主意。
于是,他阴谋策划,派了一个刺客去除掉万年。
刺客攀上日月阁,见万年正在阁上观察星斗,便张弓搭箭,准备射死他。
谁知,刺客被卫士发现,被当场缉拿。
祖乙知后,惩处了阿衡,亲自登上日月阁看望万年。
万年指着天象,对祖乙说:
“现在正是十二个月满,旧岁已完,新春复始,祈请国君定个节吧。
”祖乙说:
“春为岁首,就叫春节吧。
”冬去春来,年复一年。
后来,万年经过长期观察,精心推算,制定出了准确的太阳历。
当他把太阳历呈奉给继任的国君时,已是满面银须。
国君深为感动,为纪念万年的功绩,便将太阳历命名为“万年历”,封万年为日月寿星。
而现在所使用的万年历,即:
包括若干年或适用于若干年的历书。
万年只是一种象征,表示时间跨度大。
我在本次课程设计中制作的“基于51单片机的数字万年历”便是以电子产品为载体的基于AT89C51单片机在数码管上显示(公历)年月日、时分秒功能的简易万年历。
1、2万年历的应用
随着人们时间观念的增强,万年历被广泛应用于生活中的各种场合。
比如黄历的出版、挂历、电子表、手机万年历软件、电脑万年历软件等等。
随着科技的发展,现代的万年历能同时显示公历、农历和干支历等多套历法,更能包含黄历相关吉凶宜忌、节假日、提醒等多种功能信息;而其载体更包括历书出版物、电子产品、电脑软件和手机应用等非常丰富,极为方便人们查询使用。
阳历,可能是我们的祖先最早使用的历法,它根据太阳运行规律制定。
古人以为太阳绕地球运行,转动一周为一年——今日我们知道是地球绕太阳公转的周期,但古人的认识却相反。
据学者考证,战国时还有太阳历,一年十个月,以天干为名,每月三十六日,分三旬,旬以地支为名,如此十个月三百六十日,加上五至六天不入干支的“废日”,一年就是三百六十五日或三百六十六日。
在那种情况下,节气的安排首先有“夏至”、“冬至”,继而又有“春分”、“秋分”,季节上的回归年先分春秋二季,后来再分出春夏秋冬四季,以至二十四节气。
古代文献《管子》中有这种历法的痕迹,彝族和西南少数民族的火把节与之有关。
岭南民间至今还流传“冬至大过年”的说法,就是民间对这种历法的记忆残留。
古人确实曾经以“一阳更始”的冬至作为元旦。
阴历是按月亮的盈亏变化来制定的。
一个朔望月的周期是二十九或三十天,年的长短只是月的整倍数,与回归年无关。
月也与四季寒暑无关。
希腊历和回历都属于这种历法。
它的一年中,也不可能出现“双春”、“盲年”。
第二章设计原理
一年365天,分成12个月,这12个月里有7个月是31天,4个月是30天,1个月是28天或29天。
将这样的算法用软件编程语言描述出来,再用硬件电路实现功能并显示,便设计出了一个简单的电子万年历。
本次设计的原理非常简单,即利用AT89C51单片机内部定时/计数器T0的模式2(8位自动重装初值)产生一个时间为250us的信号,再计数4000次产生1S的时间后发出中断,再由单片机进行数据处理后,送人数码管(共阴极数码管)显示(动态显示)。
并增加时间调整功能(调整位选择、根据具体要求加或者减调整)其原理就是向单片机P口送人一个识别信号,由单片机软件对信号进行处理,并实现功能。
本次设计采用的是14位共阴极数码管,由P0口作段选
(P0.0-A,P0.1-B,...,P0.7-DP)、P1口和P2口部分位作位选的动态显示。
显示的时候只需向数码管送入相应段码,并选通相应的位,利用余辉效应和视觉停留效应便可实现显示。
第3章实现过程
3、1方案选择
●方案一:
采用日历时钟芯片DS1302来产生时间,数据经单片开机处理后送到数码管显示。
●方案二:
采用纯单片机制作,利用AT89C51单片机内部的定时/计数器和中断产生时间,经单片机处理后送数码管显示。
方案一虽然定时准确,软件部分设计简单,但电路复杂成本高不适合初学者。
所以本次设计采用方案二。
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-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所示)
图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-5-3(b)闰年及大小月算法流程图
日期处理主要包括大小月处理,及闰年(二月)处理,处理方法见图3-5-3(a\b),具体程序如下:
第四章最终结果
本次设计采用在Proteus中仿真来验证结果,具体仿真电路图及结果见图4-1、4-2、4-3、4-4所示:
图4-1仿真电路图
图4-2仿真初始化显示
图4-3重设初值仿真
图4-4调整选位仿真
第五章收获与体会
5、1设计过程中遇到的问题及解决方法
设计过程中遇到很多问题,具体问题及解决方法如下:
问题一:
程序编译的时候170多个错误。
解决办法:
检查问题时发现,很多问题都是出在有P口出现的地方,经过多次修改后发现原来在Keil编译环境下不区分大小写,但是编译C程序时定义端口时P必须要大写。
问题二:
仿真的时候根本没有结果。
解决办法:
通过对程序的进一步分析以及对电路图的核对发现自己犯了一个非常低级的错误。
那就是使用P0口作的通用I/O口但却没有接上拉电阻,导致作段选驱动的P0不能正常驱动数码管。
所以根本没有结果。
于是便加上了上拉电阻。
问题三:
终于有结果,但是乱码了。
解决办法:
加了上拉电阻以后,终于有了结果,但是显示不正确。
通过分析以后得出可能是选择的数码管不是共阴极的,然后在Proteus元件库中找出了多个二极管并将引脚随意接高低电平后进行仿真判断。
最终选出了共阴极的数码管,并接入电路后得出了仿真结果。
问题四:
这个完全是经验问题。
解决办法:
当所有仿真和PPT都做好以后,我就打包存档到了U盘,同时将电脑上的数据清空了。
结果U盘坏了,唯一的解决办法就是重做。
还好,源程序还在!
5、2收获与体会
在整个过程中,我犯了很多低级错误,这些错误其实我都知道是怎么回事。
也许把它们出成试卷或者作业题的形式我一个都不会错,但就是在实际应用中就会把这些平时看书时看过、记过甚至背过的注意事项变成一个个错误,导致设计不能成功。
所以说,真正想把专业学好就必须实际动手去做。
最后个问题可以归结为习惯问题,也可以归结于经验问题。
虽然我重做时话费了很多时间,但我至少积累了一个经验。
那就是,设计数据一定要存档,以防意外发生。
致谢
历时将近两个月的时间终于将这篇论文写完,在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。
尤其要强烈感谢我的论文指导老师—文良华老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。
在此向帮助和指导过我的各位老师表示最中心的感谢!
感谢这篇论文所涉及到的各位学者。
本文引用了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。
感谢我的同学和朋友,在我写论文的过程中给予我了很多你问素材,还在论文的撰写和排版灯过程中提供热情的帮助。
由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正!
参考文献
1何立民.单片机应用文集.北京航空航天大学出版社,1992.
2张毅刚,彭喜元.单片机原理及接口技术.人民邮电出版社,2008.
3胡景华,童淑敏,毕玉革,武佩.基于Proteus的温室温度自动控制系统的设计与仿真.中国农机化.2012年,5期.
附录:
具体程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineDQP3_7
uintsec=00;//系统初始时间2014.4.1.12:
00:
00
uintmin=00;
uinthour=12;
uintday=1;
uintmonth=4;
uintyearl=14;//低位年份可调
uintyearh=20;//高位年份不可调
uinttcnt;
uintcursor=0;//循环变量用于调整模式时计数,最大为7
uchara=0xff;
ucharcodeSeg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管数字对应数组
voiddelay(uintt)//延时函数delay
{
uinti;
while(t--)
{for(i=0;i<125;i++);}
}
voidTdelay(unsignedinti)//延时函数Tdelay
{
while(i--);
}
voidKdelay()//延时子程序Kdelay,用于按键时延时消抖
{
uchari,j;
for(i=200;i>0;i--)
for(j=248;j>0;j--);
}
//显示函数:
用于对应数字送人数码管显示,对应为动态显示
voiddisplay(ucharL1,ucharL2,ucharL3,ucharL4,ucharL5,ucharL6,ucharL7,ucharL8,
ucharL9,ucharL10,ucharL11,ucharL12,ucharL13,ucharL14,ucharL15,ucharL16)
{
P2=0x7f;P0=L1;delay
(1);//年高位
P2=0xbf;P0=L2;delay
(1);//年高位
if(cursor==6){P2=0xdf|a;P0=L3;delay
(1);}else{P2=0xdf;P0=L3;delay
(1);}//低位年
if(cursor==6){P2=0xef|a;P0=L4;delay
(1);}else{P2=0xef;P0=L4;delay
(1);}//低位年
if(cursor==5){P2=0xf7|a;P0=L5;delay
(1);}else{P2=0xf7;P0=L5;delay
(1);}//月
if(cursor==5){P2=0xfb|a;P0=L6;delay
(1);}else{P2=0xfb;P0=L6;delay
(1);}//月
if(cursor==4){P2=0xfd|a;P0=L7;delay
(1);}else{P2=0xfd;P0=L7;delay
(1);}//日
if(cursor==4){P2=0xfe|a;P0=L8;delay
(1);}else{P2=0xfe;P0=L8;delay
(1);}//日
P2=0xff;
if(cursor==3){P1=0x7f|a;P0=L9;delay
(1);}else{P1=0x7f;P0=L9;delay
(1);}//时
if(cursor==3){P1=0xbf|a;P0=L10;delay
(1);}else{P1=0xbf;P0=L10;delay
(1);}//时
if(cursor==2){P1=0xdf|a;P0=L11;delay
(1);}else{P1=0xdf;P0=L11;delay
(1);}//分
if(cursor==2){P1=0xef|a;P0=L12;delay
(1);}else{P1=0xef;P0=L12;delay
(1);}//分
if(cursor==1){P1=0xf7|a;P0=L13;delay
(1);}else{P1=0xf7;P0=L13;delay
(1);}//秒
if(cursor==1){P1=0xfb|a;P0=L14;delay
(1);}else{P1=0xfb;P0=L14;delay
(1);}//秒
P1=0xfd;P0=L15;delay
(1);//缓存
P1=0xfe;P0=L16;delay
(1);//缓存
}
main()
{
uinti;
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;}//若循环变量cursor>=7。
则赋值为0,对应于确认(即年的高位)
}
}
if(P3_1==0)//若P3_1为低电平,对应+模式
{
Kdelay();//消抖
if(P3_1==0)//对应调整以下各位,如果cursor=1时应对应SEC秒加1
{
if(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){month--;}
if(cursor==6){yearl--;}
if(cursor==7){yearh--;}
}
}
//显示万年历数据
display(Seg[yearh/10],Seg[yearh%10],Seg[yearl/10],Seg[yearl%10],Seg[month/10],Seg[month%10],Seg[day/10],Seg[day%10],
Seg[hour/10],Seg[hour%10],Seg[min/10],Seg[min%10],Seg[sec/10],Seg[sec%10],Seg[i/100],Seg[i/10%10]);
}
}
voidt0(void)interrupt1using0//T0的中断程序
{
tcnt++;
if(tcnt==4000)//定时器的定时计数,4000次250US为1S
{
tcnt=0;//循环变量TCNT
P3_3=~P3_3;
a=~a;
sec++;
if(sec==60)//以下为万年历算法
{
sec=0;
min++;//每60秒分钟加1,并清零秒
if(min==60)
{
min=0;
hour++;//每60分小时加1,并清零分钟
if(hour==24)
{
hour=0;
day++;//每24小时天加1,并清零小时
//以下为闰年和大小月的算法
if(month==2&&((yearl==0&&yearh%4==0)||(yearl!
=0&&yearl%4==0))&&day==30)day=1;
elseif(month==2&&day==29)day=1;
elseif((month==4||month==6||month==9||month==11)&&day==31)day=1;
elseif(day==32)day=1;
if(day==1)
{
month++;
if(month==13)
{
month=1;
yearl=0;
yearh++;
if(yearh==100)
{yearh=20;
}
}
}
}
}
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 数码管 万年历