单片机数字时钟课程设计论文.docx
《单片机数字时钟课程设计论文.docx》由会员分享,可在线阅读,更多相关《单片机数字时钟课程设计论文.docx(24页珍藏版)》请在冰豆网上搜索。
单片机数字时钟课程设计论文
单片机原理及应用
课程设计
题目单片机多功能电子钟设计
学院名称电气工程学院
指导教师汪普林
班级电力三班
学号20114450310
学生姓名陈彪
2014年月日
《单片机课程设计》任务书
1.课程设计的内容和要求(包括原始数据、技术要求、工作要求等):
(1)设计内容
利用单片机实现具有计时、校时等功能的数字时钟,是以单片机AT89C51为核心元件同时采用LED数码管显示器动态显示“时”、“分”、“秒”的计时装置。
显示的数据为12:
00:
00,然后电路会自动开始计时。
电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相应的显示时间加1。
实现时分秒和的调时功能。
(2)设计要求
1硬件电路设计。
根据设计任务选择合适的单片机,根据控制功能要求,设计各单元模块电路,设计的单元电路必须有设计原理分析,器件的选择与作用,参数计算过程。
2编写程序。
根据电路工作过程,画出软件流程图,根据流程图编写相应的程序,进行调试并打印程序清单。
3利用仿真器进行系统整体仿真调试、运行程序,并分析仿真结果。
4完成硬件电路的制作与调试。
5使用PROTEL绘制系统电路原理图。
6编写设计论文说明书。
要求条理清楚,重点突出,结构合理。
对电路有详细分析,所用芯片详细介绍,并附有完整电路图(A3)及带有注释说明的完整的软件源程序清单,格式符合设计论文规范。
2.对课程设计成果的要求〔包括图表(或实物)等硬件要求〕:
设计电路与程序,安装调试或仿真,分析实验结果,并写出设计说明书,语言流畅简洁,文字不得少于3500字。
要求图纸布局合理,符合工程要求,使用AltiumDesigner(Protel)软件绘出原理图(SCH),使用Proteus软件平台仿真,器件的选择要有计算依据。
3.主要参考文献:
[1]张洪润,易涛.单片机应用技术教程[M].清华大学出版社.2006
[2]康华光.电子技术基础[M].高等教育出版社.2000
[3]阎石.模拟电子技术基础[M].华中科技大学出版社.2005
[4]刘乐善.微型计算机接口技术及应用[M].华中科技大学出版社.2005
[5]张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社.2005
4.课程设计工作进度计划:
序号
起迄日期
工作内容
1
2014.8.25-2014.8.30
分析设计任务,查阅相关资料,确定设计方案
2
2014.8.31-2014.9.4
完成硬件电路设计及调试
3
2014.9.5-2014.9.10
编写程序、录入程序、软件编译调试、仿真。
4
2014.9.11-2014.9.16
硬件电路制作与调试,编写设计论文说明书
5
2014.9.17
完成设计论文说明书,准备答辩
6
2014.9.19
提交设计成果,答辩
主指导教师
汪普林
日期:
2014年9月25日
摘要:
本文为基于单片机的数字电子时钟的设计。
单片机是集CPU、RAM、ROM、定时器/计数器和多种接口于一体的微控制器。
它体积小、成本低、功能强,广泛应用于智能产品和工业自动化上。
而51系列的单片机是各单片机中最为典型和最有代表性的一种。
,本次设计提出了系统总体设计方案,并设计了各部分硬件模块和软件流程,在用C语言设计了具体软件程序后,将各个模块完全编译通过过后,结果证明了该设计系统的可行性。
通过运用所学的知识及查阅参考大量资料,按照课程设计的基本要求完成了设计。
随着科学技术的不断发展,人们对时间计量的精度要求越来越高。
数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差.这种表具有时、分、秒、显示时间的功能, 还可以进行时、分的校对。
片选的灵活性好。
传统的数字电子时钟采用了较多的分立元器件,不仅占用了很大的空间而且利用率也比很低,随着系统设计复杂度的不断提高,用传统时钟系统设计方法很难满足设计需求。
该设计利用单片机的运算和控制功能,并采用系统化LED显示模块实时显示数字的设计方案,适当地解决了实际生产和日常生活中对计时高精确度的要求,因此该设计在现代社会中具有广泛的应用性。
关键字:
51单片机;电子时钟;数码管显示;C程序
引言
1957年,Ventura发明了世界上第一个电子表,从而奠定了电子时钟的基础,电子时钟开始迅速发展起来。
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。
从而达到计时的功能,是人民日常生活补课缺少的工具。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
1概论
1.1设计目的
单片机以其功能强,体积小,功耗低,易开发等很多优势被广泛应用。
本次数字时钟的设计就是需要通过选择合适的单片机来进行主控,再结合电路的知识,同时在软件的设计过程中用到液晶显示驱动、模数转换程序及汉字库的的设计,做到对我们所学数电、模电、单片机等知识的综合应用,最终实现所设计数字电子秤的各项功能,达到“巩固知识,培养技能,学而用之”的实践目的。
通过这次课程设计,不但要提高我们在工作中的学习能力、探究能力、应用能力和动手能力,还要历练我们不畏艰难、不懂便学、有漏必补的认真严谨的工作态度,强化我们的社会适应力和社会竞争力,为走向社会提前试水,完善自我。
1.2设计要求
设计应包括以下基本功能:
(1)应用AT89C51单片机设计实现数字时钟电路。
(2)显示的数据为12:
00:
00,然后电路会自动开始计时。
(3)电路中有时、分、秒各自单独的调整按钮,时间调整按钮每按一次,相应的显示时间加1。
(4)实现时分秒和的调时功能。
(5)采用C语言编写程序并调试。
开始
定时器TO初始化
分按键了?
分寄存器值加1
秒寄存器值=60?
2设计流程图
NN
N
N
N
N
Y
N
NYY
图2设计流程图
3电子元件介绍
3.1AT89C51介绍
高AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能、CMOS、8位单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
AT89C51的管脚图如图3.1所示:
图3.1AT89C51管脚图
3.1.1AT89C51标准功能
4k字节FLASH闪速存储器,128字节内部RAM,32个I/O口线,2个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51降至0Hz的静态逻辑操作,并支持两种可选的节电工作模式。
空闲方式体制CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器体制工作并禁止其他所有不见工作直到下一个硬件复位。
3.1.2AT89C51主要特性
1、与MCS-51兼容
2、4K字节可编程闪烁存储器
3、寿命:
1000写/擦循环
4、数据保留时间:
10年
5、全静态工作:
0Hz-24Hz
6、三级程序存储器锁定
7、128*8位内部RAM
8、32可编程I/O线
9、两个16位定时器/计数器
10、5个中断源
11、可编程串行通道
12、片内振荡器和时钟电路
4电路设计
4.1数字钟的构成
数字钟实际上是一个对标准频率(1HZ)进行计数的计数电路.由于计数的起始时间不可能与标准时间一致,故需要在电路上加一个校时电路,同时标准的1HZ时间信号必须做到准确稳定.通常使用石英晶体振荡器电路构成数字钟.
⑴晶体振荡器电路
晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定.不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路.
⑵分频器电路
分频器电路将32768Hz的高频方波信号经32768()次分频后得到1Hz的方波信号供秒计数器进行计数.分频器实际上也就是计数器.
⑶时间计数器电路
时间计数电路由秒个位和秒十位计数器,分个位和分十位计数器及时个位和时十位计数器电路构成,其中秒个位和秒十位计数器,分个位和分十位计数器为60进制计数器,而根据设计要求,时个位和时十位计数器为24进制计数器.
⑷译码驱动电路
译码驱动电路将计数器输出的8421BCD码转换为数码管需要的逻辑状态,并且为保证数码管正常工作提供足够的工作电流.
⑸数码管
数码管通常有发光二极管(LED)数码管和液晶(LCD)数码管,本设计提供的为LED数码管.
4.2数字钟的工作原理
设计原理主要利用AT89C51单片机,由单片机的p2口控制数码管的位显示,p1口控制数码管的段显示,p3.0——p3.2与按键相接用于时间校正。
整个系统工作时,秒信号产生器是整个系统的时基信号,他直接决定计时系统的精度,将标准信号送入计数器的时钟脉冲。
分计数器也采用60进制计数器,每累计60分钟,发出一个“分脉冲”信号,该信号将被送到时计数器。
时计数器采用24进制计数器,可以实现对一天24小时的累计。
显示电路将“时”“分”“秒”计数器的输出,通过六个八段led显示器现出来。
校时电路是直接加一个脉冲信号到时计数器或者分计数器或者秒计数器来对“时”“分”“秒”显示数字进行校对调整。
4.3各部分电路分析
此实时时钟的设计与实现,主要采用了6只LED数码管,89C51内部二进制16位定时器/计数器,可编程中断控制器89C51等芯片,包括显示模块,运算模块和校时模块三大功能模块。
4.3.1显示模块
用89C51控制,用数码管的显示功能来设计。
显示部分硬件用六只LED为显示管,这些LED发光二极管的阴极是互相连接在一起的,所以称为共阴极数码管。
通过在这8只发光二极管的阳极加+5V或0V的电压使不同的二极管发光,形成不同的数字。
该模块主要是将运算模块和校时模块运算出来并存放在内存单元里的十六进制表示的时位、分位和秒位数值转化为十进制,并通过8只数码管显示出来。
CPU直接往LED输出八段代码,省去了硬件译码器。
P1口作为8段数据输出口,经74LS04驱动后到达各LED。
只要做到每送一次段选码时也送一次位扫描码,并且每送一次位扫描码后,位码中的0右移一位作为下一次的位扫描码,即可实现由左向右使6只LED依次出现数字显示。
4.3.2运算模块
该模块的主要功能是对时、分、秒的运算,并把运算出的最终结果存到事先已经开辟的内存单元里,以便显示模块即时地显示出来。
该模块可以细分为秒定时模块和运算模块。
秒定时模块负责提供中断信号,由于CPU运算模块中的指令消耗一定的时间,所以中断信号最好通过硬件来实现。
本实验中用89C51定时器/计数器,但因为89C51供的信号的周期是毫秒级的,因此必须通过软件的方法在运算模块中设置一个统计中断次数的变量,并且这一变量必须事先在内存里开辟存储单元。
中断信号是89C51工作方式为方式1,产生一个50ms的脉冲信号。
运算模块负责时、分、秒的计算,该模块主要通过89C51的IR1号中断来实现,但由于每50ms一次中断请求,所以在中断服务程序必须利用已申请内存单元35H来统计中断请求的次数,只有当35H的值为20时,才能让秒单元内的数值加1。
在中断服务程序里,必须对秒、分和时的单元内的数值进行判断,当秒加到60时,分必须加1、秒清零;当分加到60时,时加1、分清零。
当时加到24时,直接清零。
然后转到调用处。
4.3.3校时模块
该模块主要功能是修改时、分、秒内存单元的数值。
每按一次键,对应的显示值便加1。
分、秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不发生改变)。
注意:
在主程序中对时间进行调校前应关闭中断,以防在调校过程中定时中断服务程序也对时间进行修改而造成混淆。
4.3.4电路仿真图
在6块LED数码管上能实现数字时钟的时、分、秒显示,并能对时、分、秒进行加1校对、减1校对和清零。
本实验中陪。
P3.0键、P3.1键、P3.2键是分别对时、分、秒的加1校对。
并且开机时时钟时从120000开始计时的,到235959时在回到000000.
图4.3.4电路仿真图
5软件设计
在单片机应用系统的开发中,软件的设计是最复杂和困难的,大部分情况下工作量都较大,特别是对那些控制系统比较复杂的情况。
如果是机电一体化的设计人员,往往需要同时考虑单片机的软硬件资源分配。
本系统的软件设计主要分为系统初始化、按键、显示处理及信号频率输入处理。
程序设计是一件复杂的工作,为了把复杂的工作条理化,就要有相应的步骤和方法。
其步骤可概括为以下三点:
(1)分析系统控制要求,确定算法:
对复杂的问题进行具体的分析,找出合理的计算方法及适当的数据结构,从而确定编写程序的步骤。
这是能否编制出高质量程序的关键。
(2)根据算法画流程图:
画程序框图可以把算法和解题步骤逐步具体化,以减少出错的可能性。
(3)编写程序:
根据程序框图所表示的算法和步骤,选用适当的指令排列起来,构成一个有机的整体,即程序。
程序数据的一种理想方法是结构化程序设计方法。
结构化程序设计是对利用到的控制结构类程序做适当的限制,特别是限制转向语句(或指令)的使用,从而控制了程序的复杂性,力求程序的上、下文顺序与执行流程保持一致性,使程序易读易理解,减少逻辑错误和易于修改、调试。
根据系统的控制任务,本系统的软件设计主要由主程序、初始化程序、显示子程序、数据采集子程序和延时程序等组成。
5.1C语言在单片机中的应用
C语言是一种通用的计算机程序设计语言,在国际上非常流行。
它既可以用来编写计算机的系统程序,也可以用来编写一般的应用程序。
以前计算机的系统软件主要用汇编语言编写,单片机应用系统更是如此。
C语言是当前最流行的程序设计语言,它像其它高级语言一样,面向用户,面向解题的过程,编程者不必熟悉具体的计算机内部结构和指令;C语言又像汇编语言一样,可以对机器硬件进行操作。
如进行端口I,0操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作它的语句一样。
我们知道,汇编语言将涉及计算机硬件,所以C语言又像低级语言一样,可以对计算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间的一种中级语言。
正是因为C语言具有这样的特性,所以很适合编写要对硬件进行操作的软件程序。
本文采用C语言进行编写.因为此系统软件比较,其存储量较大,因此必须应用C语言编程。
5.2程序设计
结束语
第三学期的单片机课程设计到目前为止可以说是告一段落了,我也顺利的完成了自己的课题简易电子时钟的设计,由于自己一心准备考研在这次课程设计上除了那些必要的时间其余也么有花太多的时间,本想着是做实物的,但在程序上出了点问题就没花时间去做了,所以这次设计还不算很完美。
刚开始被拿到这个课题的,感觉挺迷茫的,当时就只知道软件编程要用到定时器,自己也就在这方面懂一点,其余的关于硬件电路,液晶显示电路的驱动的什么都不知道,后来回来之后就看了一下51单片机课程设计那本书,自己还学过这门专业可,加上在网上找了一些资料对硬件电路的设计有了一定的了解。
在大脑里面有了一个大致的思路了,于是就把仿真软件装好开始了我的课设。
本次课设让我对单片机有了更深入的认识,现代社会中几乎处处都有单片机的影子,电子产品离不开它。
课设提高了我的单片机实际运用能力,也发现了自己以前学习的不扎实,对问题不求甚解。
现在才知道“书到用时方少”啊!
学习还是得扎实。
本次课设能顺利完成,甚是感谢指导老师的帮助。
参考文献
[1]张洪润,易涛.单片机应用技术教程[M].清华大学出版社.2006
[2]康华光.电子技术基础[M].高等教育出版社.2000
[3]阎石.模拟电子技术基础[M].华中科技大学出版社.2005
[4]刘乐善.微型计算机接口技术及应用[M].华中科技大学出版社.2005
[5]张毅刚.MCS-51单片机应用设计[M].哈尔滨工业大学出版社.2005
附录一C语言程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P3^3;
sbitrw=P3^4;
sbitlcden=P3^5;
unsignedinta,b,c;
ucharcount,k;
ucharshi,fen,miao;
ucharcodetable[]="12:
00:
00";
voiddelay(uintz)
{
uintx,y;
for(x=0;xfor(y=0;y<110;y++);
}
voidw_com(ucharcom)
{
rs=0;
lcden=0;
P1=com;
delay(5);
lcden=1;//给高脉冲
delay(5);
lcden=0;
}
/*********************************
写指令
*********************************/
voidw_data(uchardate)
{
rs=1;
lcden=0;
P1=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
/*********************************
写数据
*********************************/
/*********************************
初始化函数
*********************************/
voidw_sfm(ucharadd,uchardate)//时分秒
{
ucharshi,ge;
shi=date/10;
ge=date%10;
w_com(0x80+add);
w_data(0x30+shi);
w_data(0x30+ge);
}
voidinit()
{
ucharnum;
lcden=0;//初始化使能为0
fen=00;
miao=00;
shi=00;
w_com(0x30);//写入显示模式指令码
w_com(0x0c);//写入显示开/关及光标指令码
w_com(0x06);//当写一个字符后,地址指针加一,光标加一,不动光标不闪烁
w_com(0x01);//清零作
w_com(0x00);//代表第一位
for(num=0;num<8;num++)
{
w_data(table[num]);
delay(5);
}
w_sfm(0,shi);
w_sfm(3,fen);
w_sfm(6,miao);
TMOD=0x01;
TH0=(65536-50000)/256;//50毫秒产生一次中断
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidkey()
{
P2=0x0f;//,a=P2;//先对P2置数行扫描
if(P2!
=0x0f)//判断是否有键按下
{
delay(100);//延时,软件去干扰
if(P2!
=0x0f)//确认按键按下
{
a=P2;
P2=0x0f0;
if(P2!
=0x0f0)
{
b=P2;
c=a&b;
}
}
}
else
c=P2;
}
voidkeyscan()
{
key();
if(c==0x88)//闪烁位置//选择要调整的项目,左移
{
k++;
if(k==1)//k键按一下依次向左移
{
TR0=0;
delay(100);
w_com(0x80+0x07);
w_com(0x0f);//左移光标开始闪烁
}
if(k==2)
{
delay(100);
w_com(0x80+0x04);
w_com(0x0f);//左移光标开始闪烁
}
if(k==3)
{
delay(100);
w_com(0x80+0x01);
w_com(0x0f);//光标恢复原样,不闪烁
}
if(k==4)
{
k=0;
delay(100);
w_com(0x0c);
TR0=1;
}
}
if(c==0x84)
{
if(k==1)//秒升调节
{
miao++;
if(miao==60)
miao=0;
w_sfm(6,miao);
w_com(0x80+0x07);
}
if(k==2)//分升调节
{
fen++;
if(fen==60)
fen=0;
w_sfm(3,fen);
w_com(0x80+0x04);
}
if(k==3)//时升调节
{
shi++;
if(shi==24)
shi=0;
w_sfm(0,shi);
w_com(0x80+0x01);
}
}
if(c==0x82)
{
if(k==1)//秒降调节
{
miao--;
if(miao==-1)
miao=59;
w_sfm(6,miao);
w_com(0x80+0x07);
}
if(k==2)//分降调节
{
fen--;
if(fen==-1)
fen=59;
w_sfm(3,fen);
w_com(0x80+0x04);
}
if(k==3)//时降调节
{
shi--;
if(shi==-1)
shi=23;
w_sfm(0,shi);
w_com(0x80+0x01);
}
}
}
voidmain()
{
rw=0;
init();
while
(1)
{