简易数字钟的设计.docx
- 文档编号:10071287
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:16
- 大小:164.88KB
简易数字钟的设计.docx
《简易数字钟的设计.docx》由会员分享,可在线阅读,更多相关《简易数字钟的设计.docx(16页珍藏版)》请在冰豆网上搜索。
简易数字钟的设计
第三单元简易数字钟的设计
数字钟是一种用数字显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无需机械传动等优点。
因而得到了广泛的应用。
小到人们日常生活中的电子手表,大到车站、码头、机场等公共场所的大型数字电子钟,数字钟到处可见。
在数字电路的学习中,已经学习过用计数器芯片搭建数字钟。
51单片机内部集成了定时器/计数器,这为构建数字钟带来了方便。
在本单元中,学习如何用51单片机来构建一个功能数字钟。
【任务要求】
Ø在八个数码管上显示时、分、秒以及两个横杠。
Ø通过单片机内部定时器控制走时,走时准确。
Ø系统有四个按键,功能分别是调整,加,减,确定。
在按下调整键时候,显示“时”的两位数码管以1Hz频率闪烁。
如果再次按下调整键,则“分”开始闪烁,“时”恢复正常显示,依次循环,直到按下确定键,恢复正常的显示。
在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。
按键支持短按和长按,即短按时,修改的内容每次增加一或者减小一,长按时候以一定速率连续增加或者减少。
【学习知识点】
Ø数码管的原理,驱动程序的实现。
Ø独立按键的原理及程序的实现。
Ø51单片机内部定时器的原理及应用
【内容安排】
第一节:
数码管显示原理及应用实现
第二节:
独立按键检测原理及应用实现
第三节:
计时的原理及实现
第四节:
数字钟的构建
第一节数码管显示原理及应用实现
1.1数码管显示原理
数字钟要把时间显示到数字显示的装置上,常用的数字显示装置有数码管、液晶、LED、CRT显示器等。
在单片机系统设计中,LED数码管是最基本的显示装置。
在数字钟的设计中我们用数码管对中的小时、分和表来进行显示。
LED数码管能显示各种数字或符号,由于它具有显示清晰、亮度高、寿命长、价格低廉的特点,因此使用非常广泛。
图1.1是几个数码管的图片,图a为单位数码管,图b为双位数码管,图c为四位数码管。
a单位数码管b双位数码管c四位数码管
图1.1数码管图片
那么数码管是如何的工作呢?
还记得我们小时候玩过的“火柴棒游戏”吗,几根火柴组合起来,可以拼成各种各样的图形,数码管实际上就是利用这个原理做成的。
图1.2数码管引脚标号,共阴和共阳的内部连接图
单个数码管由8个发光二极管组成,其中7个长条形的发光管排列成一个“日”字形,我们称之为“段”,另一个圆点形的发光管在数码管的右下角作为小数点用,图1.2中的a图是数码管的段标号以及外接引脚排列图。
由图可以看出,单个数码管共有10个引脚,其中8个发光二极管的一端分别与数码管的8八个引脚相接,8个发光二极管的另外一端汇集在一起,称之为公共端,与数码管上下排引脚当中的那个引脚相连,称之为“公共端”。
公共端既可以接地,也可以接高电平。
公共端接地的数码管,是将发光二极管的阴极连接在一起接地,点亮数码管,各段需加高电平,称之为“共阴极数码管”;公共端接高电平的数码管,是将发光二极管的阳极连接在一起接高电平,点亮数码管,各段需加低电平,称之为“共阴极数码管”;图1.2中的b图和c图分别是共阴极数码管和共阳极数码管内部原理图。
1.2单个数码管的控制
我们以共阴极的数码管为例,先介绍如何控制一个8段数码管显示“0”-“F”16个数字或数字。
例1.1单个LED数码管字符显示控制
1)硬件电路设计
图1..4
很明显,用51的I/O口控制共阴极数码管的8个段位,分别置“1”或“0”,让某些段的LED发光,其它的熄灭,就可以显示不同的字符和图符号,硬件电路如图1.4。
在上一章中提到51单片机的IO口高电平驱动能力有限,P1、P2、P3无法直接来驱动共阴数码管,需要加驱动,在本实例中用P0口来直接驱动数码管,这是因为P0外接了1K的上拉电阻,流过数码管的段电流为(5V-2V)/1k=3mA,P0口可以直接驱动共阴数码管,其它IO口驱动数码管需要加驱动,本书在后面的章节中会一一介绍。
2)软件设计
为了获得“0”-“9”10个不同的字型符号,数码管各段所加的电平不同,因此I/O口输出的编码也不同。
因此首先要建立一个字型与字段7段码的编码表,见表6.3。
表1.1LED数码管字型字段编码表
字型
P07
P06
P05
P04
P03
P02
P01
P00
共阴极
共阳极
0
0
0
1
1
1
1
1
1
3FH
C0H
1
0
0
0
0
0
1
1
0
06H
F9H
2
0
1
0
1
1
0
1
1
5BH
A4H
3
0
1
0
0
1
1
1
1
4FH
B0H
4
0
1
1
0
0
1
1
0
66H
99H
5
0
1
1
0
1
1
0
1
6DH
92H
6
0
1
1
1
1
1
0
1
7DH
82H
7
0
0
0
0
0
1
1
1
07H
F8H
8
0
1
1
1
1
1
1
1
7FH
80H
9
0
1
1
0
1
1
1
1
6FH
90H
A
b
C
d
E
F
有了字型段码对照表,就可以用软件的方式进行8段码的译码。
如要显示字型“1”,P0口输出值为0x06;显示字型“2”,P0口输出值为0x5B。
#include
#defineucharunsignedchar
#defineuintunsignedint
//0-F的字码放在数组中,数组名前面的code表示把数组的元素放在Flash中,而不是RAM,这样可以节省RAM的空间。
ucharcodeseg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
voiddelayms(uintxms)//1ms的延时函数
{
uinti,j;
for(i=0;i<112;i++)
for(j=0;j } voidmain(void) {uchari=0; while (1) { for(i=0;i<16;i++) { P0=seg_7[i]; delayms(1000); } } } 1.3多位数码管的显示 一个LED数码管只能显示一位数字,一般在系统中经常使用多个LED数码管,如要显示时间、温度、转速等等。 在上面一位数码管控制显示的简单例子中,我们可以看到,一个数码管要使用51单片机的8个I/O口来输出段码,当使用多个数码管的时候,显然采用这种控制方式有些问题,因为51单片机不能提供太多的I/O控制引脚,这样其它的外围设备就无法连接了。 因此多个数码管的显示驱动系统的实现,有多种不同的方式可以采用,而且在硬件上合软件的设计上也是不同的。 多个LED数码管显示电路按驱动方式可分为静态显示和动态显示两种方法。 采用静态方式显示时,除了在改变显示数据的时间外,所有的数码管都处于通电发光状态,每个数码管通电占空比为100%,静态显示的优点: 显示稳定,亮度高,程序设计简单,MCU负担小,缺点是: 占用硬件多(如I/O口、锁存电路等),耗电量大。 图2.19是4个共阳极数数码管静态显示时的连接方式与显示状态,当单片机系统中使用静态数码管显示时,需要在每一个数码管上添加一个锁存器,当需要某个数码管显示其他内容时,只需要修改与其相连的锁存器的值即可。 而所谓动态显示方式,就是一位一位地轮流点亮各个数码管。 对于每一位数码管而言,每隔一定时间点亮一次,所以当扫描的时间间隔足够小时,观察者就不会感觉到数码管在闪烁,看到的现象就是所有数码管在一起发光(同看电影的道理是一样的)。 在动态显示中,数码管的将不仅仅由导通时电流的大小决定,而且还跟每一位点亮的时间和扫描周期这两个因素有关。 动态显示的优点: 占用硬件资源小,耗电量小。 缺点是: 显示稳定性不够好,亮度低,程序设计相对复杂,MCU负担过重。 为了减轻MCU的负担和编程的复杂性,同时简化外围电路,还可以使用专用的数码管控制器件。 图2.204个共阴极数码管动态显示时的连接方式与显示状态 1.使用串行传送数据的静态显示。 (1)硬件设计 在静态显示的描述中,每位数码管都需要接一个锁存器,MCU把要显示的数据送给锁存器,锁存器锁存器之后再送给数码管,这里采用了移位寄存器74HC595来驱动8位静态数码管,74HC595末级带有锁存器,同时可以实现数据的串行传输,节省了I/O口。 图式串行传送数据的硬件电路图。 图 设计中将八片八位串行输入/并行输出移位寄存器74HC595依次串接,第一片74HC595的DS端接到MCU的数据输出端P2^7,其他的74HC595的DS端分别接前一片的Q7’端,所有的74HC595的sTcp和sHcp分别相接到一起与MCU的P2^6和P2^5相连(sTcp是数据的移位脉冲,sHcp是存储器使能端)。 在经过sTcp时钟线64个脉冲后,要显示的8个字符并没有在8个数码管上显示,而是存储在移位寄存器内部的存储器中,然后再经过一个sHcp的脉冲,数据才会在8个数码管上显示,最先发送的显示字符段码将显示在最右边。 在这个电路中,硬件上使用了8片8位串行输入/并行输出移位寄存器74HC595串接,占用了MCU的3个I/O口,,硬件开销大,软件的实现比较简单,MCU只需把显示的内容一次性输出即可,如果显示内容没有变化时,MCU是不需要对显示部分进行任何操作的。 (2)软件设计 #include #defineucharunsignedchar #defineuintunsignedint sbitds=P2^7; sbitsh_cp=P2^6; sbitst_cp=P2^5; ucharcodetable[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};//共阴数码管段码 voidseg595(ucharnum) {uchari,seg_num; seg_num=table[num]; for(i=0;i<8;i++) {sh_cp=0; ds=seg_num&0x01; sh_cp=1; seg_num=seg_num>>1; } } voidmain(void) {st_cp=0; seg595 (1); seg595 (2); seg595(3); seg595(4); seg595(5); seg595(6); seg595(7); seg595(8); sh_cp=1; while (1); } 2.数码管动态显示设计 (一) 采用数码管动态扫描显示方式,可以节省硬件电路,但软件设计相对复杂。 1)硬件设计电路 下面给出一个采用数码管动态扫面显示方式的设计,使用8个数码管组成时钟,6个数码管分3对分别显示“小时”、“分”、“秒”,每两对之间用”—”间隔开。 在硬件电路设计中,采用了共阴数码管,段码接高电平,位码选通须接低电平,与单个数码管的驱动一样,51单片机只有外接了上拉电阻的P0口具有驱动负载的能力,所以在硬件设计中,数码管的段码用P0口来驱动,位选接P1口。 与静态方式的数码管驱动电路相比较,上图中没有使用外围器件,但占用了16个I/O线。 2)软件设计 根据硬件电路,我们可以看出,在任何一个时刻,P10—P17只能有一个I/O口输出低电平,既只有一位点亮。 而且MCU比寻循环轮流控制P10—P17中的一位使其输出“0”,同时P0口要输出该位相对应的段码值。 即使显示的内容没有变化,MCU也要进行不停地循环扫描处理。 软件的设计应保证从在外面看数码管的效果要连续(即在人眼里各个数码管全部点亮),亮度均匀,同时没有拖尾现象。 为了保证各个数码管的显示效果不产生闪烁情况,表象上全部点亮的话,则首先必须在1秒中内循环扫描8个数码管的次数应大于25次,这里是利用了人眼的影像滞留效应。 本例中我们选择40次,既每隔1000/40=25ms将8个数码管循环扫描一遍。 第二要考虑的是,在25ms时间间隔中,要逐一轮流点亮8个数码管,那么每个数码管点亮的持续时间要相同,这样亮度才能均匀。 第三个要考虑的要点为每个数码管点亮的持续时间,这个时间长一些的话,数码管的亮度高一些,反之则暗一些。 通常,每个数码管点亮的持续时间为1-2ms。 我们将每个数码管的点亮持续时间定为2ms,那么8个数码管扫描一遍的时间为16ms,因此MCU还有9ms的时间处理其它事件,为了简单起见,本例中还是使用了delay_ms()软件延时函数进行定时,在以后的章节里,将介绍使用51单片机的定时器产生更精确的秒计时脉冲。 #include #defineucharunsignedchar #defineuintunsignedint ucharcodeeg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,x7f,0x6f,0x40}; ucharposition[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchardis_buff[8]; voiddelay_ms(uintxms) {uinti,j; for(i=0;i for(j=0;j<112;j++); } voiddisplay(void) {uchari; for(i=0;i<8;i++) { P0=seg_7[dis_buff[i]];//送段码 P1=position[i];//位选通 delay_ms(3);//延时 P1=0xff;这一句是必须要加的 } } voidtime_to_disbuffer(void)//数码管赋值 { dis_buff[0]=1; dis_buff[1]=0; dis_buff[2]=10; dis_buff[3]=2; dis_buff[4]=0; dis_buff[5]=10; dis_buff[6]=3; dis_buff[7]=0; } voidmain(void) {time_to_disbuffer(); while (1) { display(); delay_ms(9); } } 数码管动态显示设计 (二) 在数码管显示器动态显示设计 (一)中,尽管没有使用更多的外围器件,但是一共占用了AVR的16个I/O口。 由于51单片机I/O数量有限,在实际应用中往往需要留出更多的I/O口应用于其它的控制和输入,因此经常采用外部增加少量的器件,以减少数码管显示驱动对I/O的占用。 在动态显示实例 (二)中加了移位寄存器74HC595和74HC138这两个芯片。 (1)硬件电路 在硬件上使用了74HC595来发送段码,用了3个I/O口,使用了74HC138,用了三个I/O口,总共使用了6个I/O口,比原先的少用了10个I/O口。 (2)软件设计 #include #defineucharunsignedchar #defineuintunsignedint sbitds=P2^7; sbitsh_cp=P2^5; sbitst_cp=P2^6; ucharcodeseg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; ucharposition[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchardis_buff[8]; voiddelay_ms(uintxms) {uinti,j; for(i=0;i for(j=0;j<112;j++); } voidseg595(ucharnum) {uchari,seg_num; seg_num=seg_7[num]; st_cp=0; for(i=0;i<8;i++) {sh_cp=0; ds=seg_num&0x01; sh_cp=1; seg_num=seg_num>>1; } st_cp=1; } voiddisplay(void) {uchari; for(i=0;i<8;i++) { seg595(dis_buff[i]); P1=position[i]; delay_ms(3); P1=0xff; } } voidtime_to_disbuffer(void) { dis_buff[0]=1; dis_buff[1]=0; dis_buff[2]=10; dis_buff[3]=2; dis_buff[4]=0; dis_buff[5]=10; dis_buff[6]=3; dis_buff[7]=0; } voidmain(void) {time_to_disbuffer(); while (1) { display(); delay_ms (1); } } 进一步节省I/O口,位选通可以选用三八译码器74HC138,进一步减少对I/O的占用。 第二节定时器的原理及应用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)