基于单片机设计的万年历.docx
- 文档编号:30562431
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:33
- 大小:290.43KB
基于单片机设计的万年历.docx
《基于单片机设计的万年历.docx》由会员分享,可在线阅读,更多相关《基于单片机设计的万年历.docx(33页珍藏版)》请在冰豆网上搜索。
基于单片机设计的万年历
辽东学院信息技术学院
《单片机原理与接口技术》课程设计报告
电子万年历的设计
学生姓名:
学号:
班级:
B1106班
专业:
电子信息工程
指导教师:
2014年07月
【摘要】
随着时代的进步,越来越多的电子厂品趋向于低成本,高性能,耐用性好的方向发展。
特别是趋向于自动化控制的方向走。
89C51作为控制芯片具有强大的功能,并且简单易于操作,安全性与稳定性较高,价格便宜,适合中小型电子厂品开发中的控制器。
这款课程设计的万年历由89C51,BUTTON,液晶屏等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。
1602做为显示电路不仅操作上简单许多,而且使用1602能在很大程度上是电路图尽量简化,便于操作与错误的检修。
基于89c51万年历的设计,利用了单片机内部的一个自带定时/计数器来实现定时功能,并通过内部程序,实现对时分秒,年月日这几个输出数值的自增,并且通过编写程序,实现通过键盘控制时分秒,年月日大小的调整,这是必要的功能。
最后通过1602液晶显示电路将日期、时间显示在其上。
这样的万年历比较精准,其主要误差来源与晶振的误差,即使是这样,他的误差也只是微妙级别,对于日常生活中的时间计数是足够的。
关键词:
单片机、万年历、键盘控制
绪论
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
现在的万年历不仅可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,可以同时显示年、月、日、周日、时、分、秒等信息,还具有时间校准等功能。
该电路采用STC89C51单片机作为核心,功耗小,能在5V的低压工作,电压可选用3~5V电压供电。
综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。
本电路为实现电子万年历的功能,采用单片机STC89C51,辅助以必要的外围电路,用C语言编写程序,并进行模块化设计而成的电子万年历系统,有功能稳定,精确度高和可调的特点。
1系统工作原理
1.1功能说明
1、计时功能:
准确计时,以数字形式显示时、分、秒的时间。
2、日期功能:
年以12个月计时形成,月以28(或29或30或31)日计时形成,日以24小时计时形式,分秒计时为60进位。
3、校正时间功能:
能随意设定走时时间。
4、闹钟功能:
一旦走时到该时间,能以声形式告警提示。
5、秒表功能:
按键控制启动、暂停、清零。
1.2基本原理
它是利用单片机的内部的定时/计数器工作与定时方式,对机器周期计数形成基准时间(如10ms)然后用另外一个计数器或软件计数的形式对基准时间进行计数形成秒(如对10ms计数100次),“秒”计数60次“分”,“分”计数60次形成“时”,“时”计数24次形成“日”,“日”计数为28(或29或30或31)次形成“月”,“月”计数12次形成“年”,年计数999次就清零,然后通过译码器,数码管把他们的内容在相应的位置显示出来。
在具体的设计时定时器采用中断方式工作,对时钟的形成在终中断序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。
另外为了使用的方便,也设计了按键,可以通过按键对时分秒进行调整,这样程序就加了按键程序。
1.3电路总体原理框图
本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的年、月、日、时、分、秒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:
键盘、芯片、LCD液晶屏显示即可满足设计要求。
总设计原理框图如下图所示:
1.4实现时钟计时的基本方法
利用STC系列单片机的可编程定时/计数器、中断系统来实现时钟计数。
(1)计数初值计算:
把定时器设为工作方式1,定时时间为50ms,则计数溢出20次即得时钟计时最小单位秒,而100次计数可用软件方法实现。
假设使用T/C0,方式1,50ms定时,fosc=12MHz。
则初值X满足(216-X)×1/12MHz×12μs=50000μs
X=15536→0011110010110000→3CB0H
(2)采用中断方式进行溢出次数累计,计满20次为秒计时(1秒);
(3)从秒到分、从分到时、从时到日、从日到月、从月到年的计时是通过累加和数值比较实现。
1.5总体方案
1.5.1计时方案
利用STC89C51单片机内部的定时/计数器进行中断时,配合软件延时实现年、月、日、时、分、秒的计时。
该方案节省硬件成本,且能使读者在定时/计数器的使用、中断及程序设计方面得到锻炼与提高,对单片机的指令系统能有更深入的了解,从而对学好单片机技术这门课程起到一定的作用。
1.5.2控制方案
STC89C51的P0口和P1口外接由八个LED数码管(LED8~LED1)构成的显示器,用P0口作LED的段码输出口,P1口作八个LED数码管的位控输出线,P3口外接五个按键A、B、C、D、E构成键盘电路。
STC89C51是一种低功耗,高性能的CMOS8位微型计算机。
它带有8KFlash可编程和擦除的只读存储器(EPROM),该器件采用ATMEL的高密度非易失性存储器技术制造,与工业上标准的80C51和80C52的指令系统及引脚兼容,片内Flash集成在一个芯片上,可用与解决复杂的问题,且成本较低。
简易电子钟的功能不复杂,采用其现有的I/O便可完成,所以本设计中采用此的设计方案。
2设计
2.1硬件电路设计原则
在性价比满足应用系统要求的情况下,选择更可靠,更熟悉的单片机缩短研制周期。
尽可能选择自己较为熟悉的应用电路,以提高系统的可靠性。
单片机内部的资源与外部的扩展资源应在满足系统设计的基础上留有余地,为进一步的升级和扩展提供方便。
应充分的结合软件方案考虑硬件的结构,通常硬件功能较完善,其相应的软件程序就简单,但硬件的成本较高,而功能较低,其相应的软件就复杂,其实际常用软件代替硬件来降低成本。
整个系统相关的器件尽可能的做到性能相匹配。
充分的考虑系统的抗干扰性,如具有抗干扰的单片机并充分的帅选芯片与器件,在电路中采取隔离或屏蔽的措施等。
2.2单片机的最小系统
2.2.1芯片介绍
MCS-51单片机是标准的40引脚双列直插式集成电路芯片,其各引脚功能如下:
VCC:
+5V电源。
VSS:
接地。
RST:
复位信号。
当输入的复位信号延续两个机器周期以上的高电平时即为有效,用完成单片机的复位初始化操作。
XTAL1和XTAL2:
外接晶体引线端。
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;当使用外部时钟时,用于接外部时钟脉冲信号。
P0口:
P0口为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才能有高电平输出;当作输入口使用时,必须先向电路中的锁存器写入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读入的干扰。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,它不再需要多路转接电路MUX;因此它作为输出口使用时,无需再外接上拉电阻,当作为输入口使用时,同样也需先向其锁存器写“1”,使输出驱动电路的FET截止。
P2口:
P2口电路比P1口电路多了一个多路转接电路MUX,这又正好与P0口一样。
P2口可以作为通用的I/O口使用,这时多路转接电路开关倒向锁丰存器Q端。
P3口:
P3口特点在于,为适应引脚信号第二功能的需要,增加了第二功能控制逻辑。
当作为I/O口使用时,第二功能信号引线应保持高电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。
当输出第二功能信号时,该位应应置“1”,使与非门对第二功能信号的输出是畅通的,从而实现第二功能信号的输出,具体第二功能如表1所示。
表1P3端口引脚兼用功能表
P3引脚
兼用功能
P3.0
串行通讯输入(RXD)
P3.1
串行通讯输出(TXD)
P3.2
外部中断0(INT0)
P3.3
外部中断1(INT1)
P3.4
定时器0输入(T0)
P3.5
定时器1输入(T1)
P3.6
外部数据存储器写选通WR
P3.7
外部数据存储器写选通RD
2.2.1晶振电路
下图所示为时钟电路原理图,在51单片机内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
2.2.2复位电路
下图所示为复位电路原理图,任何单片机在工作之前都要进行复位的过程。
只要在单片机的RST引脚上加上高电平(或低电平)持续大概5ms,直至系统电源稳定后,撤销复位信号。
2.3LCD1602显示模块设计
2.3.1主要技术参数
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
2.3.1引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表2所示:
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
2.4时钟显示校正电路
本设计利用按键开关来校正时钟显示的数字。
当按钮按下时,将在相应的端口输入一个低电平,通过相应的程序来改变时钟显示。
其中菜单按键开关用来选
择要修改的数字;下调按键用来增加所选数字的数值;上调按键用来减小所选数字的数值;退出按键是退出校正电路。
3系统软件设计
3.1软件设计分析
在编程上,首先进行了初始化,定义程序的的入口地址以及中断的入口地址,在主程序开始定义了一组固定单元用来储存计数的时.分.秒,在显示初值之后,进入主循环。
在主程序中,对不同的按键进行扫描,实现秒表,时间调整,复位清零等功能,系统总流程图如下图:
3.2中断程序
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
中断流程图如下:
4系统的调试
首先用万用表对已经焊接好的电路进行测试,以确定电路没有断路或者短路的情况。
在检查的过程中,因为焊接技术不够好,导致出现了断路的问题,重新焊接断路的地方,再用万用表测试,问题得到了解决。
接下来使用Keil软件对程序进行测试,发现程序没有错误。
将程序拷入芯片中,出现预期现象。
5结论
两周的课程设计已经结束了,我有很多的心得体会。
关于单片机,我的理论知识掌握的不够好,再加上已经很久没有复习了,刚拿到题目时,不知道从哪里入手,后来通过对书本的回顾,加深了对单片机知识的记忆。
因为课堂的教学考虑到大多数同学的需求,主要强调“基本”——基本知识、基本理论、基本方法、基本技能。
而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
我们正面临就业问题,这次课设给了我们一个机会去试验。
单片机理论的学习是为课程的设计作准备的,但有时学习的理论也解决不了实践中的问题。
实践中获得的知识能让我对单片机的知识有更好的认识和理解。
虽然这次的课程设计我参考了一些文献资料,没有做到创新,但在对程序的读写过程中我明白了许多。
这次课程设计的最大收获是只有把理论用到实践中我们才能真正掌握好所学知识。
参考文献
[1]谢自美.电子线路设计·实验·测试[M].武汉:
华中理工大学出版社,1992.
[2]何立民.单片机应用系统设计[M].北京:
北京航空航天大学出版社,1993.
[3]楼然笛.单片机开发[M].北京:
人民邮电出版社,1994.
[4]付家才.单片机控制工程实践技术[M].北京:
化学工业出版社2004.3.
[5]李光才.单片机课程设计实例指导[M].北京:
北京航空航天大学出版社2004.
[6]朱定华.单片机原理及接口技术实验[M].北京:
北方交通大学出版社2002.11.
[7]刘湘涛.江世明.单片机原理与应用[M].北京:
电子工业出版社,2006.
附录A源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
ucharcodetable[]="2014:
06:
19000";
ucharcodetable1[]="22:
22:
1021:
48";
ucharcodetable2[]="0123456789";
sbitlcd_rs=P2^5;//定义LCD端口
sbitlcd_rw=P2^6;
sbitlcd_en=P2^7;
sbitS1=P3^4;//菜单键
sbitS2=P3^5;//加键
sbitS3=P3^6;//减键
sbitS4=P3^7;//退出菜单键
sbitss=P3^3;//秒表键,第一次启动,第二次暂停,第三次清零
sbitFMQ=P2^0;
voidyue31();//31天的月份函数
voidyue30();//30天的月份函数
voidyue29();//29天的月份函数
voidyue28();//28天的月份函数
voidTiming();//闹钟设置
voidmiaobiao();//秒表函数
ucharcount,k1num;//声明秒的变量
charshi,fen,miao;//声明时分秒
uintnian,yue,ri,ji=0,mm=0;//声明年月日,秒表计数,和秒表按键次数
ucharf,s;//定时器/
voiddelay(ucharz)//延时函数
{
ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//lcd写指令
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
voidwrite_data(uchardate)//lcd写数据
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=date;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
voidmiaobiao(charkk)//秒表函数
{
ucharbiao_bai,biao_shi,biao_ge;
biao_bai=kk/100;
biao_shi=kk%100/10;
biao_ge=kk%100%10;
write_com(0x80+13);
write_data(table2[biao_bai]);
write_com(0x80+14);
write_data(table2[biao_shi]);
write_com(0x80+15);
write_data(table2[biao_ge]);
write_com(0x0c);
}
voidwrite_fsm(ucharadd,uchardate)//计算时分秒位
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_nyr(ucharadd,uchardate)//计算月日位
{
uintshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x00+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_nian(ucharadd,uchardate)//计算年位,年是百位
{
uintbai,shi,ge;
bai=date/100%10;
shi=date/10;
ge=date%10;
write_com(0x80+0x00+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidjiaxian()//设置键盘加显
{
if(k1num!
=0)
{
if(S2==0)
{
delay(10);
if(S2==0)
{
while(!
S2);//松手检测
if(k1num==1)
{
miao++;
if(miao==60)
miao=0;
write_fsm(8,miao);
//write_com(0x0e);
write_com(0x80+0x40+8);
}
if(k1num==2)
{
fen++;
if(fen==60)
fen=0;
write_fsm(5,fen);
write_com(0x80+0x40+5);
}
if(k1num==3)
{
shi++;
if(shi==24)
shi=0;
write_fsm(2,shi);
write_com(0x80+0x40+2);
}
if(k1num==4)
{
ri++;
if(ri==31)
ri=1;
write_nyr(8,ri);
write_com(0x80+0x00+8);
}
if(k1num==5)
{
yue++;
if(yue>12)
yue=1;
write_nyr(5,yue);
write_com(0x80+0x00+5);
}
if(k1num==6)
{
nian++;
if(nian==90)
nian=0;
write_nian(1,nian);
write_com(0x80+0x00+1);
}
if(k1num==7)
{
s++;
if(s==24)s=0;
write_fsm(11,s);
write_com(0x80+0x40+11);
}
if(k1num==8)
{
f++;
if(f==59)
f=0;
write_fsm(14,f);
write_com(0x80+0x40+14);
}
}
}
}
}
voidjianxian()//设置键盘减显
{
if(k1num!
=0)
{
if(S3==0)//K3设置
delay(10);
if(S3==0)
{
while(!
S3);
if(k1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_fsm(8,miao);
write_com(0x80+0x40+8);
}
if(k1num==2)
{
delay(5);
fen--;
if(fen==-1)
fen=59;
write_fsm(5,fen);
write_com(0x80+0x40+5);
}
if(k1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_fsm(2,shi);
write_com(0x80+0x40+2);
}
if(k1num==4)
{
ri--;
if(ri<1)
ri=31;
write_nyr(8,ri);
write_com(0x80+0x00+8);
}
if(k1num==5)
{
yue--;
if(yue<1)
yue=12;
write_nyr(5,yue);
write_com(0x80+0x00+5);
}
if(k1num==6)
{
nian--;
if(nian==0)
nian=90;
write_nian(1,nian);
write_com(0x80+0x00+1);
}
if(k1num==7)
{
s--;
if(s==0)
s=23;
write_fsm(11,s);
write_com(0x80+0x40+11);
}
if(k1num==8)
{
f--;
if(f==-1)
f=59;
write_fsm(14,f);
write_com(0x80+0x40+14);
}
}
}
}
voidkeyk4()//S4是退出菜单键
{
if(S4==0)
{
delay(5);
if(S4==0)
TR0=1;
{
whi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 设计 万年历