基于AT89C51单片机控制的数字秒表的设计

2021-03-31 15:16苏州健雄职业技术学院赵素玲
河北农机 2021年3期
关键词:秒表数码管电路图

苏州健雄职业技术学院 赵素玲

1 控制要求

使用AT89C51单片机控制一个2片的七段数码管,循环从00~99进行自动显示。在此时间是可以根据要求进行调整的,并不一定是间隔时间为1秒。程序中延时子函数的延时时间的改变很容易就能进行时间长短的调整。该程序还很容易实现从99~00的倒计时,这种功能可以通过按钮开关的选择来实现,但是加上了按钮程序,程序就变得更复杂、更长。由于篇幅限制在本文中没有使用按钮程序,所以倒计时的程序是单独给出的。系统的具体要求有以下四点:(1)以AT89C51芯片为核心控制器,加上外围辅助电路,设计出系统仿真电路图;(2)根据要求用Keil软件编写出C语言程序代码;(3)用一个2位的七段数码管自动的从00~99正计时循环显示;(4)用一个2位的七段数码管自动的从99~00倒计时循环显示。

2 系统硬件电路设计

2.1 系统仿真电路图设计

图1 电路仿真图

系统仿真电路图主要由AT89C51单片机芯片、电源、地、石英晶体振荡电路、复位电路、两片七段共阴极数码管组成。两个电容C2、C3(30PF)与X1(石英晶体)组成了石英晶体振荡电路。电阻R1(1K)、电容C1(22UF)构成复位电路。P1口控制2位七段数码管,P1口输出字形码,由于P1口作为输出口必须接上拉电阻。若是选用其他的三个口作为输出口则不需要接上拉电阻,这是由AT89C51单片机自身的特点决定的。P2口是片选端,控制两片数码管进行轮流工作。P2口的输入信号在1111 1110和1111 1101之间快速进行变化,这个变化的速度一定要够快,若是慢了看起来就不是两个数码管在同时工作了,而是轮流工作。这里用到的是动态扫描的原理,所谓的动态扫描就是通过轮流控制两个数码管的片选端,使十位和个位数码管轮流工作显示相应的数字,这就是动态扫描。仿真电路中选的是共阴极的七段数码管,需要给工作的数码管输入低电平“0”,给不工作的数码管输入高电平“1”。在电路中我选的是AT89C51作为核心控制器,设计的仿真电路图如下图1所示。

2.2 系统元器件清单

系统仿真电路元器件清单列表如表1所示。

表1 元器件清单列表

3 系统软件设计

系统C语言程序代码,以下为00~99正计数的秒表程序:

以下为99~00倒计数的秒表程序,在此倒计时的程序不是以图片的形式给出的,而是源程序代码。双斜线后面的是程序注释部分,程序在运行的时候是不运行这部分的,注释是为了更清楚地表达每一条程序含义。#include//包括一个51标准内核的头文件。#define uchar unsigned char。#define uint unsigned int//为了方便对关键词进行简单的定义。uchar,code,smg1【10】={0x3f,0x06,0x5b,0x4f,0x660x6d,0x7d,0x07,0x7f,0x6f};//共阴极数码管字形码,在此只给出0到9的字形码,ABCDEF的字形码在这个 程 序 中 用 不 到 所 以 没 有 给 出uchar,code,smg2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管字形码,相同在此只给出0到9的字形码。

delay1ms(uint z)//带有形参的延时1毫秒延时子函数,可以通过改变Z的值来调节延时时间,Z值越大延时时间越长。

uchar x,y;for(x=z;x>0;x++);for(y=100;y>0;y--);void main()//主函数;uchar i,j;//设变量;while(1)//大循环;for(i=10;i>0;i--)for(j=10;j>0;j--);P2=0xfd;//P2=1111 1101显示个位。P0=smg1[j-1];//P0口输出个位字形码。delay1ms(30);//调用延时子函数,这里面的Z值不能太大。P2=0xfe;//P2=1111 1110显示十位。P0=smg1[i-1];//P0口输出十位位字形码。delay1ms(30);//调用延时子函数,这里面的Z值不能太大。

在程序设计的时候,我们需要先对用到的变量进行初始化设置,这样做是为了保证程序可以有效的运行。在程序编写的时候,为了程序书写方便,我们通常会把常用到的功能块编成子函数的形式。在这个系统的程序中我们用到一个延时子函数,延时时间为1毫秒左右。在调用这个延时子函数时,Z值越大延时的时间就越长。共阴极数码管的字形码以一维数组smg1的形式给出,共阳极数码管的字形码以一维数组smg2的形式给出。本仿真图采用的是共阴极数码管,所以程序中用的是数组smg1。若是采用的共阳极数码管,程序中用的则是数组smg2。这部分程序需要在熟悉两片数码管的工作原理、AT89C51的管脚分配及各个管脚的功能、二进制、十六进制计数的原理和规则,期中在C语言中)0X表示十六进制的意思,需要掌握一定的数字电路和C语言的基础上才能写出来。

4 Protuse仿真

通过仿真可以看出程序完全能实现预期设想,当然在仿真的过程中也不是一帆风顺的,重点在延时函数Z值的设定上。Z值太大则容易出现眼睛看起来两片数码管是轮流工作的现象,Z的值太小则会出现秒表跳动太快的现象。所以这个时间若想试的合适需要反复修改,直到看起来比较舒服为止。在此截图“00”开始状态和“99”结束状态,由于跳动比较快,正好截下来这两个点并不容易,另外还截了一个中间的任意状态“46”状态。仿真图如下图2图3图4所示。

图2 “00”起始状态仿真截图

5 结语

对于这个系统的程序代码计的是两位的数字秒表的自动显示,其基本原理就是利用动态扫描的原理。其实对于这样的系统很容易扩展到更多位的秒表,比如三个数码管可以显示000~999,四位数码管则可以显示0000~9999。文中同时给出了正计和倒计时的程序,程序设计思路简单清晰,同时给出了必要的注释。作为一个实用的秒表程序应该设计起动、停止按钮,正、倒计时选择开关,清零按钮,多次重复计数的功能。若是这些功能全加上则程序就变得复杂得多,故在此不在多述。

猜你喜欢
秒表数码管电路图
物理项目教学设计,用单片机控制四位数码管显示
“且”的真与假
蓝桥杯树莓派模拟题解析三:“电子测距仪”
Arduino编程
宝马ISTA软件中电路图的识读
比亚迪E6纯电动汽车系统结构原理(四)
MC9S08FL16单片机数码管静态显示分析
2017款凯迪拉克2.8L/3.0L/3.2L/3.6L车型低电平参考电压总线电路图
漫话秒表的使用
学会使用秒表