历史上的今天
今天是:2025年02月25日(星期二)
2020年02月25日 | 单片机00~99秒表显示
2020-02-25 来源:51hei

秒表设计
摘 要: 本设计以 AT89C51 单片机为主控模块,利用 C 语言编写两位数码管循环扫描动态显示的专用程序来实现两位数码管动态显示系统,系统主要由按键模块、复位模块、外部时钟电路模块、数码管显示模块构成。按键电路通过两个独立的开关控制数码管计数的开始、停止和复位。复位电路由电容与按键的并联来实现。时钟通过外部 12M 的晶振来控制。两位数码管显示由两个共阳极的三极管进行驱动。 将 C 语言编写的两位数码管动态显示程序写入单片机来控制 P0 口,使数码管相应段点亮,同时利用人眼视觉暂留的特性和数码管的余辉效应,在扫描频率足够高时,人眼无法感觉数码管的变化,从而实现数码的动态显示。
1 设计背景
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能 IC 卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
2 硬件系统设计方案
2.1 硬件电路方案
硬件原理框图如下:
图 2-1 硬件组成框图
该电路的工作原理:单片机从稳压电路中获得稳定的+5V 电压,接到+5V
端,提供稳定的电压; 单片机口通过电阻接到显示电路的端口上; 单片机接复位
按键电路
复位电路
单片机 显示电路
时钟电路
电路,实现电路的复位; 以及单片机需要接晶振电路;整个电路实现循环动态显
示数字 00~99.
3 硬件电路设计
3.1 单片机选型
MCS51 是指由美国 INTEL 公司生产的一系列单片机的总称,这一系列单片机包括了很多品种,如 8031, 8051, 8751, 8032, 8052, 8752 等,其中 8051是最早最典型的产品,该系列其它单片机都是在 8051 的基础上进行功能的增、减、改变而来的,所以人们习惯于用 8051 来称呼 MCS51 系列单片机,而 8051是目前在我国最流行的单片机,所以很多场合会看到 8051 的名称。本课题中用到的芯片就是 AT 系列中的 AT89C51 单片机芯片。
AT89C51 是一个低电压,高性能 CMOS 8 位单片机,片内含 4k bytes 的可反复擦写的 Flash 只读程序存储器和 128 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-51 指令系统,内置功能强大的微型计算机的 AT89C51 提供了高性价比的解决方案。AT89C51 具有 PDIP、 PQFP/TQFP 及 PLCC 等三种封装形式,以适应不同产品的需求。它是一个低功耗高性能单片机, 40 个引脚, 32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中断口, 2 个 16 位可编程定时计数器,2 个全双工串行通信口, AT89C51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。
如图所示,图 3-1 为 AT89C51 单片机基本构造,其基本性能介绍如下:
图 3-1 AT89C51 引脚图
AT89C51 本身内含 40 个引脚, 32 个外部双向输入/输出(I/O)端口,同时内含 2 个外中端口, 2 个 16 位可编程定时计数器,2 个全双工串行通信口,AT89C51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。
3.2 按键电路
图 3-2 按键电路
按键 S1 和按键 S2 是控制位,分别接单片机的 P3.4 和 P3.7I/O 口。当按下
按键 S1 时数码管计数开始,再次按下 S1 时数码管停止计数并停留下当前结果;
当按下按键 S2 时清空数码管显示结果,重新计数。
3.3 复位及振荡电路
图 3-3 复位电路和振荡电路
单片机复位是使 CPU 和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,在复位期间(即 RST 为高电平期间), P0 口为高组态, P1-P3 口输出高电平;外部程序存储器读选通信号 PSEN 无效。地址锁存信号 ALE 也为高电平。根据实际情况选择如图 3-3 所示的复位电路。该电路在最简单的复位电路下增加了手动复位按键,在接通电源瞬间,电容 C1 和 C2取 3pF。 加手动复位按键是为了避免死机时无法可靠复位。AT89C51 引脚 XTAL1 和 XTAL2 与晶体振荡器及电容 C1、 C2 按图 3-3 所示方式连接。晶振、电容 C1/C2 及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,电容 C1、 C2 取值 30pF。 复位电路用电容与按键的并联来实现,将它们并在一起,一端接高电平,另一端接地,从而实现高电平复位的功能。
3.4 显示电路的选择
秒表设计显示电路可以考虑数码管或 LCD 屏,由于秒表只要求显示数字,
因此对显示要求较为简单, 如果选用 LCD 则较为复杂, 数码管足以满足要求。
3.41 共阳极数码管的显示方法
LED 数码管是单片机控制系统中最常见的显示器件之一,一般用来显示处理结果或输入输出信号的状态。数码管显示是一个系统工程中必不可少的人机交互环节,因此关于数码管的驱动也就是系统工程中的一个重要的环节。数码管的驱动分为动态驱动和静态驱动两种。所谓静态驱动,就是指无论多少位 LED 数码管,同时处于显示状态。动态显示驱动是指无论在任何时刻只有一个 LED 数码管处于显示状态,及单片机采用“扫描”方式控制各个数码管轮流显示。
3.3.2 共阳极数码管的驱动设计
将数码管每个 LED 灯对应单片机的一个 I/O 口。通过单片机的 P 口来控制LED 灯的亮和灭。 I/O 口之间互相独立,需要用 I/O 口直接控制 LED。动态显示将数码管的每个引脚一对一连接在一起接单片机的数据,而将各个数码管的公共端单独送至单片机的 I/O 口进行片选。此外,在此基础上,用单片机与 74LS04
反向器来驱动数码管,从而实现数码管的动态显示。
图 3-4 数码管显示电路
如图 3-3 所示,两位数码管分别由两个 PNP 型三极管驱动,三极管的基极通过限流电阻接在单片机 P1.0、 P1.1,其中 P1.0 控制数码管的个位, P1.1 控制数码管的十位。数码管各段除小数点段外其余七段(a-g)通过限流电阻接在单片机 P0 口(P0.0-P0.6),两位数码管显示由单片机内部程序控制相应接口为低电平,从而实现从 00—99 动态循环显示。例如:十位和个位显示原理相同,谨以个位说明。当个位数码管显示 5 时, 5 在程序中查表对应的十六进制数为 92H,对应二进制为 10010010B,其中 P0.7、 P0.4、 P0.1 为高电平, DP、 e、 b 段熄灭,P0.6、 P0.5、 P0.3、 P0.2、 P0.0 为低电平, g、 f、 d、 c、 a 段点亮,则此时数码管上显示数字 5。
3.4 连接方式
单片机采用 P2 口的 I/O 来控制数码管的各个引脚。复位键接到引脚 9 上,数码管的位选通过三极管和电阻分别与单片机的引脚 1 和 39 相连,晶振与单片机的引脚 18 和 19 连接,高电平与 40 引脚连接供电, 20 引脚直接接地。
图 3-5 硬件设计图
4 软件设计
4.1 汇编程序
汇编语言的优点是可以表达非常底层的东西
l.可以直接存取寄存器和 I/O
2.编写的代码可以非常精确的被执行
3.可以编写出比一般编译系统高效的代码
4.可以作为不同语言或不同标准的接口缺点在于汇编语言是一个比较低级的语言
1.非常冗长单调,在 DOS 下编程时就可以体会到
2.易出 BUG,且调试困难
3.代码不易维护
4.兼容性不好,与硬件关系非常紧密
8 / 14
与 C 语言相比没有 C 语言简单易用,且 C 语言的可读性更高,因此此程序选
用 C 语言编程。
4.2 C 语言程序
采用 C 语言用编写了两位数码管循环扫描动态显示的专用程序。通过软件的控制使两位数码管能从 00 计数到 99,再回到 00,依次进行循环。若在计数期间有复位高电平出现时,便重新从 00 开始计数。并有电源开关控制让电路是否工作,且有指示灯指示电源是否正常。
程序流程图如下:
图 4-1 程序流程图
程序如下:
5 系统仿真结果
经过对不同方案的分析、比较、取舍,然后进行原理图的设计与仿真, 再经过软件的调试等环节的操作,最终实现了让数码管在单片机的控制下循环显示两位数 00-99。并且在正常的计数过程中,若按下复位键后, 计数又重新从 00 开始计数, 终现实的结果与预想的结果一致。
图 5-2 仿真结果图
单片机源程序如下:
//制作:机械工程学院*****机械设计制造及其自动化专业//
//作者:*****//
//学号:************//
//设计内容:基于51单片机控制的数码管显示0~99的秒表//
//********************我是分割线********************//
//借口配置说明//
/*
开始按键位P2.0
复位按键P2.1
*/
/*
数码管位选驱动端口位P1.0和P2.0
*/
//以下是程序正文//
#include #define uchar unsigned char //宏定义 #define uint unsigned int /*引脚定义*/ sbit START=P2^0; //开始、停止键 低电平有效 sbit RST=P2^1; //复位键 /*定义全局变量*/ uint time; //时间变量 /*数码管字模,对应 0-9*/ uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; /*延时函数*/ void Delay(uint ms) //毫秒级延时函数 { uint i, j; for(i =ms; i>0; i--) for(j =110; j>0; j--); } /*中断*/ void time0() interrupt 1 { uchar tt; TH0 = 0x4c; //晶振11.0592Mhz TL0 = 0x00; tt++; if(tt == 20) { time++; if(time==99) //到99后在从00开始 time = 0; tt = 0; } } /*显示函数*/ void Display(uchar sum) { uchar shi, ge; P0 = 0x00; //消影 P1 = 0x00; shi = table[sum/10]; P0 = shi; P1 = 0xfd; Delay(5); P0 = 0x00; //消影 P1 = 0x00; ge = table[sum%10]; P0 = ge; P1 = 0xfe; Delay(5); } /*按键扫描*/ void keyscan() { if(START==0) //开始、停止 { Delay(10); //消抖 if(START==0) { TR0 =!TR0; while(!START) Display(time); } } if(RST==0) //复位 { Delay(10); //消抖 if(RST==0) { time=0; TR0=0;
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 请教各位高手,什么型号的双栅管可以代替3SK318(能直接替换最好) 谢谢! … 查看全部问答> |
|
2440 读 温度芯片,总是无法触发中断,请教有什么方法呀? BSP包里通过应用层调用IIC文件夹不能正常工作,只好转入到bootloader层去做温度检测了,可是无论如何也不能触发中断,有经验的请指教,先谢谢了。… 查看全部问答> |
|
只要电路原理图和c源程序。小弟在这拜谢了! 或者谁能帮我改下这电压表的程序成电流表的程序: #include unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7, &nbs ...… 查看全部问答> |
|
刚做的东西给几个小MM去贴片,把101当103贴上去了,居然USB也可以联机。但操作偶尔有问题,手工复位一般可以解决掉。听小道消息说,101是阉割的103,就像奔腾的cache有瑕疵变成赛扬一样。… 查看全部问答> |
|
使能I/O口子程序,在CCS帮助文件中看到对该子程序 GPIO_Handle GPIO_open( int chaNum, Uint32 flags ); 的解释是: chaNum GPIO channel to open: lags & ...… 查看全部问答> |




