简易数字钟的设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三单元简易数字钟的设计
数字钟是一种用数字显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无需机械传动等优点。因而得到了广泛的应用。小到人们日常生活中的电子手表,大到车站、码头、机场等公共场所的大型数字电子钟,数字钟到处可见。
在数字电路的学习中,已经学习过用计数器芯片搭建数字钟。51单片机内部集成了定时器/计数器,这为构建数字钟带来了方便。在本单元中,学习如何用51单片机来构建一个功能数字钟。
【任务要求】
➢在6个数码管上显示时、分、秒,共6位数字。
➢通过单片机内部定时器控制走时,走时准确。
➢系统有四个按键,功能分别是调整时间,加,减,确定。在按下调整键时候,显示“时”的两位数码管以1 Hz 频率闪烁。如果再次按下调整键,则“分”开始闪
烁,“时”恢复正常显示,依次循环,直到按下确定键,恢复正常的显示。在数码
管闪烁的时候,按下加或者减键可以调整相应的显示内容。按键支持短按和长按,
即短按时,所修改的数字每次增加1或者减小1,长按时候以一定速率连续增加或
者减少10。
【学习知识点】
➢数码管的原理,驱动程序的实现。
➢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 单个数码管显示“0”-“F”
1)硬件电路设计
图1..4 单个LED数码管控制电路
图1.3 单个数码管显示控制电路
由于51单片机I/O高电平驱动能力有限,故在数码管与单片机之间串入锁存器74HC573,增加段的驱动能力,段限流电阻330Ω。
2)软件设计
为了获得“0”-“F”16个不同字符,数码管各段所加的电平不同,因此I/O口输出的编码也不同。因此首先要建立一个编码表,见表3.1。
表3.1 LED数码管字型字段编码表
有了字型段码对照表,就可以用软件的方式进行8段码的译码。如要显示字型“1”,P0输出值为0x06;显示字型“2”,P0口输出值为0x5B。
#include
#define uchar unsigned char
#define uint unsigned int
#define port_seg P1
uchar code seg_7[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0-F的字码放在数组中,数组名前面的code表示把数组的元素放在Flash中,而不是//RAM,这样可以节省RAM的空间。
//************************************************************************ // ms延时子函数
//************************************************************************ void delayms(uint xms)//1ms的延时函数
{
uint i,j;
for(i=0;i<112;i++)
for(j=0;j } //************************************************************************ // 主函数 //************************************************************************ void main(void)