数字时钟.docx
- 文档编号:24095506
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:19
- 大小:213.80KB
数字时钟.docx
《数字时钟.docx》由会员分享,可在线阅读,更多相关《数字时钟.docx(19页珍藏版)》请在冰豆网上搜索。
数字时钟
太原科技大学单片机课程设计报告
数字时钟
设计人:
专业:
电电子信息工程
班级:
学号:
指导教师:
二零一二年一月
摘要
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
本次设计中以单片机的发展过程和发展方向为背景,介绍了单片机的输入输出的工作原理和操作方法,中断的工作原理和操作方法。
本次做的数字时钟是以单片机(AT89C52)为核心,结合相关的元器件(共阴极LED数码显示器等),再配以相应的软件。
它具有时,分显示的功能,并且时,分还可以通过按键调整。
与此同时,还实现了如下的功能:
中间的横杠闪60次,分就进1.此次设计数字时钟是为了了解数字时钟的原理,从而学会制作数字时钟。
而且通过数字时钟的制作,进一步的了解各种在制作中用到的中小规模集成电路的作用及使用方法。
通过它可以进一步学习与掌握单片机原理与使用方法。
关键词:
单片机AT89C52共阴极LED数码显示器
一设计任务与要求
1.设计任务
利用单片机的定时/计数器,中断系统,以及阵列键盘和LED显示器进行设计。
在数码管显示器上实现数字时钟,并且能进行设置时间。
2.设计要求
本设计以AT89C52单片机为核心,要求能显示出分、时,与此同时,中间的横杠闪60次,分加1。
可调整各个时间,可以采用LED显示。
二数字时钟的背景、意义、应用
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
一旦忘了重要事情,一时的耽误可能酿成大祸。
单片机模块中最常见的是数字时钟,数字时钟是一种用数字电路技术实现时、分计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更长的使用寿命,因此得到了广泛的使用。
数字时钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术采用了先进的石英技术,使数字时钟具有走时准确、性能稳定、携带方便等优点,它还用于计时自动报时及自动控制的领域。
三单片机的基本知识
3.1AT89C52单片机介绍
单片机是把中央处理单元、随机存储器、只读存储器、定时/计数器以及I/O接口电路等主要部件集成在一块半导体芯片上的微型计算机。
虽然单片机只是一个芯片,但从组成和功能上看,它已具有了微型计算机系统的含义,从某种意义上说,一块单片机芯片就是一台微型计算机。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能。
AT89C52单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线。
图1AT89C52单片机的基本结构
3.2AT89C52引脚说明
AT89C52是一个低电压,高性能CMOS8位单片机,片内含8kB的可反复擦写的Flash只读程序存储器和256B的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及8052产品引脚兼容,片内置有通用8位中央处理器(CPU)和Flash存储单元。
图2AT89C52单片机的引脚
VCC:
电源。
GND:
接地。
P0口:
是双向8位三态I/O口,也即地址/数据总线复用口。
在访问外部数据存储器或程序存储器时,可分时用作低8位地址线和8位数据线;在FlashROM编程时,P0口接收(输入)指令字节;而在验证程序时,P0口输出指令字节。
P1口:
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
与8051不同之处是,P1.0和P1.1还可分别作为定时/计数器2的外部计数脉冲输入端(P1.0/T2)和捕捉方式时的外部输入端。
P2口:
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。
对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。
在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据。
在访问8位地址的外部数据存储器(如执行MOVX@RI指令)时,P2口输出P2锁存器的内容。
P3口:
P3口是一个带有内部上拉电阻的8位双向I/O口。
P3口能驱动4个LSTTL门电路。
在单片机中这8个引脚都有各自的第二功能,而在实际工作中,大多数情况下都使用P3口的第二功能。
如下表所示:
口线
第二功能
名称
P3.0
RXD
串行数据接收端
P3.1
TXD
串行数据发送端
P3.2
INT0
外部中断0申请输入端
P3.3
INT1
外部中断1申请输入端
P3.4
T0
定时器0计数输入端
P3.5
T1
定时器1计数输入端
P3.6
WR
外部RAM写选通
P3.7
RD
外部RAM读选通
表1P3口的第二功能
RST:
复位信号输入端。
要保持RST脚两个机器周期以上的高电平时间,才能使单片机复位。
ALE/PROG:
地址锁存允许信号。
PSEN:
外部程序存储器的读选通信号。
EA/VPP:
当EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。
当EA端保持高电平时,此间CPU访问并执行内部程序存储器的指令。
3.3数码管显示工作原理
图3数码管引脚图
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
右图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。
当然,LED的电流通常较小,一般均需在回路中接上限流电阻。
假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。
而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。
其它字符的显示原理类同。
四单片机数字时钟的基本原理
4.1基本原理
它是利用单片机的内部的定时/计数器工作与定时方式,对机器周期计数形成基准时间(如10ms)然后用另外一个计数器或软件计数的形式对基准时间进行计数形成秒(如对10ms计数100次),“分”计数60次形成“时”,“时”计数24次并清零,然后数码管把他们的内容在相应的位置显示出来。
在具体的设计时定时器采用中断方式工作,对时钟的形成在中断程序中实现,在主程序只是对定时/计数器的定义初始化,调用显示程序和控制程序的初始化。
另外为了使用的方便,也设计了按键,可以通过按键对时分进行调整,这样程序就加了按键程序。
4.2软件流程内容
本设计的软件程序包括主程序、中断子程序、时钟显示子程序和延时子程序等等。
另外电路中有按键。
4.2.1系统软件设计流程图
这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
开始
启动定时器
按键检测
时间显示
图4-1主程序流程图
按键处理是先检测秒按键是否按下,分按键如果按下,分就加1;如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就把时间显示出来。
图4-2按键处理流程图
定时器中断时是先检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
图4-3定时器中断流程图
时间显示是先分个位计算显示,然后是分十位计算显示,再就是时个位计算显示,然后是时十位显示。
4.3定时程序设计
单片机的定时功能也是通过计数器的计数来实现的,此时的计数脉冲来自单片机的内部,即每个机器周期产生一个计数脉冲,也就是每经过1个机器周期的时间,计数器加1。
如果MCS-52采用的12MHz晶体,则计数频率为1MHz,即每过1us的时间计数器加1。
这样可以根据计数值计算出定时时间,也可以根据定时时间的要求计算出计数器的初值。
MCS-51单片机的定时器/计数器具有4种工作方式,其控制字均在相应的特殊功能寄存器中,通过对特殊功能寄存器的编程,可以方便的选择定时器/计数器两种工作模式和4种工作方式。
定时器/计数器工作在方式0时,为13位的计数器,由TLX(X=0、1)的低5位和THX的高8位所构成。
TLX低5位溢出则向THX进位,THX计数溢出则置位TCON中的溢出标志位TFX.
当定时器/计数器工作于方式1,为16位的计数器。
本设计是单片机多功能定时器,所以MCS-51内部的定时器/计数器被选定为定时器工作模式,计数输入信号是内部时钟脉冲,每个机器周期产生一个脉冲使计数器增1。
4.3.1数字时钟实现的基本方法:
我们可把定时器的定时时间定为50ms。
这样,计数溢出20次即可得到时钟的最小计时单位:
秒。
而计数20次可以用软件实现。
秒计时是采用中断方式进行溢出次数的累积,计满20次,即得到秒计时。
从秒到分,从分到时是通过软件累加并进行比较的方法来实现的。
要求每满1秒,则“秒”单元中的内容闪一次,“秒”单元闪60,则“分”单元中的内容加1;“分”单元满60,则“时”单元中的内容加1;“时”单元满24,则将时、分、秒的内容全部清零。
4.3.2数字时钟程序设计步骤:
(1)选择工作方式,计算初值;
(2)采用中断方式进行溢出次数累计;
(3)从秒——分——时的计时是通过累加和数值比较实现的;
(4)时钟显示缓冲区:
时钟时间在方位数码管上进行显示,为此在内部RAM中要设置显示缓冲区,共6个地址单元。
显示缓冲区从左到右依次存放时、分数值,中间是秒在闪烁。
(5)主程序:
主要进行定时器/计数器的初始化编程,然后反复调用显示子程序的方法等待中断的到来。
(6)中断服务程序:
进行计时操作
(7)加1子程序:
用于完成对时、分、秒的加操作。
源程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
*定义开发板上四个独立按键所接的I/O口
sbits2=P3^4;*每摁一次分加一
sbits3=P3^5;*每摁一次分减一
sbits4=P2^6;*每摁一次时加一
sbits5=P2^7;*每摁一次时减一
sbitdula=P2^6;
sbitwela=P2^7;*定义开发板上的段选和位选控制的I/O口
sbitbuzz=P2^3;
uchardiscode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
*定义无符号的一维数组,数组的元素是1-9这十个数字在数码管上显示的段码ucharcount;*定义无符号字符型数据"count",用于计数20次达到20*50ms=1s
uintshi,fen,miao,shis,shig,fens,feng,miaos,miaog;
*定义时、分、秒以及时、分、秒的十位和个位
voiddelay(uintz)*延时函数
{
intx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddisplay()*数码管显示子程序
{
wela=1;
P0=0x1f;
wela=0;
dula=1;
P0=discode[miaog];*显示秒的个位
dula=0;
delay
(2);
wela=1;
P0=0x2f;
wela=0;
dula=1;
P0=discode[miaos];*显示秒的十位
dula=0;
delay
(2);
wela=1;
P0=0x37;
wela=0;
dula=1;
P0=discode[feng];*显示分的个位
dula=0;
delay
(2);
wela=1;
P0=0x3b;
wela=0;
dula=1;
P0=discode[fens];*显示分的十位
dula=0;
delay
(2);
wela=1;
P0=0x3d;
wela=0;
dula=1;
P0=discode[shig];*显示时的个位
dula=1;
delay
(2);
wela=1;
P0=0x3e;
wela=0;
dula=1;
P0=discode[shis];*显示时的十位
dula=0;
delay
(2);
}
voidprocess()*时分秒处理子程序
{
miaos=miao/10;
miaog=miao%10;
fens=fen/10;
feng=fen%10;
shis=shi/10;
shig=shi%10;}
voidtimer0()interrupt1using1
*定时器中断函数,定时50ms,每隔1秒,miao++
{
count++;*每50ms,count就加1
if(count==20)*当count=20时即计数到1s的时候执行if大括号内的语句
{
buzz=~buzz;
miao++;
if(miao==60)*当到60秒的时候,分+1,同时秒从0重新开始计时
{
miao=0;
fen++;
if(fen==60)*当到60分的时候,时+1,同时分从0重新开始计时
{
fen=0;
shi++;
if(shi==12)*当到12小时的时候,时从0重新开始计
{
shi=0;
}
}
}
}
TH0=0x3c;*到了50ms后,重新装入初值
TL0=0xb0;
}
voidkey()*按键判断子程序
{
if(s2==0)*判断s2是否摁下键盘
{
if(s2==0)
{
fen++;*分加1
if(fen==60)*加到60分后返回0继续加
{
fen=0;
}
}
while(s2==0);*等待按键放开,即每摁一次只加1
}
if(s3==0)*判断s3是否摁下键盘
{
fen--;*分减1
if(fen==0)*减到0分后返回60
{
fen=60;
}
while(s3==0);*等待按键放开,即每摁一次只加1
}
if(s4==0)*判断s4是否摁下键盘
{
shi++;*时加1
if(shi==12)*加到12时后返回0继续加
{
shi=0;
}
while(s4==0);*等待按键放开,即每摁一次只加1
}
if(s5==0)
{
delay(100);*延时
if(s5==0)*判断s5是否摁下键盘
{
shi--;*时减1
if(shi==0)*减到0时后返回12{
shi=12;
}
}
while(s5==0);*等待按键放开,即每摁一次只加1
}
}
voidmain()
{
count=0;
TMOD=0x01;*选择TO定时器工作方式1
ET0=1;*开中断
EA=1;*开总中断
TH0=0x3c;*设置初值,定时50ms
TL0=0xb0;
TR0=1;*开启计数
while
(1)
{
process();*调用时分秒处理子程序
key();*调用键盘扫描子程序
display();*调用数码管显示子程序
}
}
五编程调试和下载
图4下载成功
图5编程调试
六设计体会
通过本次课程设计的制作,总结如下:
设计一个电路,首先要深刻理解其原理,并根据其原理进行电路的设计。
用理论指导实践可以达到事倍功半的效果,有坚实的理论做基础将会使设计变得得心应手。
设计的过程就是学习的过程,在设计过程中验证理论的正确性,弥补知识的漏洞。
正确对待设计过程中遇到的错误,遇到错误与问题要敢于面对并设法找到解决的办法。
通过对该电子时钟的设计过程,我查阅了不少相关资料,更深刻地认识和巩固了平时所学的知识,使理论与实践有机结合,提高了我对所学专业的兴趣并积累了一些相关经验。
我认为这就是一种很好的提高自身能力的方法。
我在上网找资料的同时也学到了许多东西,找到了很多学习单片机的网站,里面的内容都比较适合我初学者去学,有些网站还专门介绍这种单片机的类型、用法、功能等等。
过这个课程设计,使我发现,原来小小的一片单片机有这么强大的功能,能应用于各种领域。
都是觉得很神奇,人类真是聪明啊。
我应该在自己以后的学习中,不仅要有刻苦努力,要有钻研精神,还要有创新,对自己感兴趣的一定要用心去学。
虽然自己尽了很大的努力,但是还有很多不尽人意的地方,作为一个学电子信息工程的学生,我想我有必要通过这次课设更多的了解自己的不足,从而在以后的学习工作中不断增强自己的动手能力。
该设计还有很多缺陷。
今后我要加强学习,去认识更深层的科学知识,使我设计出来的东西更加完美。
要严格要求自己,就像严格要求设计的每一个细节一样。
一种端正的态度是一个系统设计成功的保障。
总的来说,这次设计的电子时钟还是比较成功的,在设计中遇到了很多问题,最后在老师和同学的帮助下,终于顺利解决,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 时钟