间的高电平,从而实现上电且开关复位的操作。通常选择C=10~30μF,R=100Ω~1KΩ,本设计采用的电容值为22μF的电容和电阻为1K的电阻。
3.2.7 系统总电路的设计
系统总电路由以上设计的显示电路,时钟电路,按键电路和复位电路组成,只要将单片机与以上各部分电路合理的连接就组成了系统总电路。系统总电路图如图3.10所示。
80C51单片机为主电路的核心部分,各个电路均和单片机相连接,由单片机统筹和协调各个电路的运行工作。
80C51单片机提供了XTAL1和XTAL2两个专用引脚接晶振电路,因此只要将晶振电路接到两个专用引脚即可为单片机提供时钟脉冲,但在焊接晶振电路时要尽量使晶振电路靠近单片机,这样可以为单片机提供稳定的始终脉冲。
图3.10 系统总电路图
复位电路同晶振电路,单片机设有一个专用的硬件复位接口,并设置为高电平有效。 按键电路与单片机的端口连接可以由用户自己设定,本设计中软件复位键接单片机的P1.0设为低电平有效。而另外的开始键和暂停键两键使用了外部中断,所以需要连接到单片机的特殊接口P3.2和P3.3,这两个I/O口的第二功能分别为单片机的外部中
10
断INT0端口和外部中断INT1端口。同样设置为位低电平有效。
显示电路由三位数码管组成,采用动态显示方式,因此有8位段控制端和3位位控制端,八位段控制接P0口,P0.0-P0.7分别控制数码显示管的a、b、c、d、e、f、g、dp显示,80C51的P0口没有集成上拉电阻,高电平的驱动能力很弱,所以需要接上拉电阻来提高P0的高电平驱动能力。三位位控制则由低位到高位分别接到P2.2-P2.4口,NPN三极管9013做为位控制端的开关,当P2.2-P2.4端口任意一个端口为高电平时,与其相对应的三极管就导通,对应的数码管导通显示。
通过以上设计已经将各部分电路与单片机有机的结合到一起,硬件部分的设计以大功告成,剩下的部分就是对单片机的编程,使单片机按程序运行,实现数字电子秒表的全部功能。
3.3 软件设计 3.3.1 程序设计思想
结合电路,程序的总体思路 如图3.11。
3.3.2 系统资源的分配
本设计系统所用到的单片机端口数比较多,所以在这里将对数字电子秒表的硬件资源的大概分配加以说明。片内RAM的分配、各功能键的定义以及各端口的分配安排如表3.3所示。
表3.3 端口的分配安排表
名称 7BH-7DH R3- R5 定时器T0 外部中断INT0 外部中断INT1 功能描述
0.1s-10s位显示寄存区 0.1s-10s位溢出计数区
控制秒表的最小精度 停止中断信号入口 开始中断信号入口 初始化值 00H 3CB0H 3.3.3 主程序设计
本系统程序主要模块由主程序、定时中断服务程序、外部中断INT0服务程序和外部中断INT1服务程序组成。其中主程序是整个程序的主体。可以对各个中断程序进行调用,协调各个子程序之间的联系。
系统(上电)复位后,进入主程序,主程序流程图如图3.11。首先对系统进行初始化,包括设置各入口地址、中断的开启、对各个数据缓存区清“0”、赋定时器初值,初始化完毕后,就进入数码管显示程序。数码管显示程序对显示缓存区内的数值进行调用并在数码管上进行动态显示。显示一次就对P1.0进行一次扫描,查询启动键P1.0是否按下,当启动键按下后,数码管全零显示,没
11
有按下则返回开始,重新循环显示数字8。
在主程序中还进行了赋寄存区的初始值、设置定时器初值以及开启外部中断等操作,当定时时间到后就转去执行定时中断程序。当外部中断有请求则去执行外部中断服务程序,并在执行完后返回主程序。
3.3.4 中断程序设计
现在方案中采用了两个中断,外部中断INT0,INT1。CPU在响应中断时,先处理高级中断,在处理低级中断,若有多个同级中断时,则按自然优先顺序处理。例如当CPU正在处理一个中断申请时,有出现了另一个优先级比它高的中断请求,这是,CPU就暂停终止对当前优先级较低的中断源的服务,转去响应优先级比它高的中断请求,并为其服务。待服务结束,再继续执行原来较低级的中断服务程序。而当CPU为级别高的终端服务程序服务时,如果级别低的中断发出中断请求,此时CPU是不会响应的,所以为了避免开始和暂停两个按键中的一个出现没有响应的情况,在进行程序编辑时要注意对中断的使用,避免出现中断的嵌套。,合理分配中断对本设计的实现是至关重要的。
80C51的自然优先级顺序排列如下:
中断源 最高 外部中断INT0
定时/计数器T0溢出中断 外部中断INT1
定时/计数器T1溢出中断
串行口中断 最低
数字式秒表中的两个按键采用了中断实现功能。开始采用外部中断INT0,停止采用外部中断INT1。另外程序中还用到了定时/计数器0溢出中断进行计时。依据设计要求,停止的外部中断INT1中断级别最高,计时的定时/计数器0溢出中断次之,开始的外部中断INT0级别最低。 (1)外部中断INT0服务程序
外部中断INT0服务程序结合外部P3.2开始键实现数字电子秒表的计时开始功能,具体流程图如图2.12。
当按下P3.2开始键按下向CPU发出外部中断请求,CPU转向外部中断0服务程序执行,启动定时器T0。
12
开始 数码管循环显示8 N C键是否按下? Y 数码管全显示0 N A键是否下? Y 程序开始 对定时器/计数器初始化 开中断并启动定时器 定时器溢出中断 对定时器重新赋值 进行加一操作后重新计算时间 往P0口送显示时间 数码管显示 N B键是否按下? Y 停止计时,显示时间 Y D键是否按下? N 结束
13
图3.11 主程序流程图
外部中断0入口
外部中断1入口 停止定时器T0 停止定时器T0
中断返回
中断返回 图3.12外部中断1服务程序流程图 图3.13外部中断0服务程序流程图
(2)外部中断INT1服务程序:
外部中断INT1服务程序结合外部P3.3停止键实现数字电子秒表的停止功能,具体流程图如图3.13。
当按下P3.2停止键按下向CPU发出外部中断请求,CPU转向外部中断1服务程序执行,停止定时器T0。 (3)定时中断服务程序
当定时/计数器T0器溢出后,向CPU发出中断请求信号。CPU跳转到定时中断程序执行。定时中断程序是一个进位程序,主要负责对0.1s的加一。当如果满十就向0.1s位加一,依次类推,最终达到99.9秒后归零,从零开始再次计时。
定时/计数器T0工作在方式1下,THX和TLX组成一个16位的二进制数计数器。单片机开机或复位时,它的值为00H,当T0启动后,从第一个输入脉冲开始计时,每来一个脉冲计数加一,即从0000000000000000开始计数到1111111111111111,再计数一个脉冲时TH0和TL0组成的16位计数器将会从16个1变成16个0,并产生溢出,溢出位将被送到TF0标志位,通过溢出标志产生溢出中断请求。显然,T0定时器在方式1下引起一次中断所允许计数的最多脉冲个数为216 个。
但如果定时计数器如果每次都固定从0开始计数,到计满后,再向CPU发出溢出中断请求信号那是毫无意义的。为了使定时计数器在规定的计数脉冲个数字之后(此时应小于2个脉冲),向CPU发出溢出中断请求,可采取预先向THX和TLX中放入一个初值X的方法,使计数器以X值为起始值开始计数,即X+1,X+2,??直至计数器计满,从1全变为0。设需要计数的脉冲个数为N,则有:N=216-X 。在定时方式下:定时时间T=N*Tcy=(216—X)*12/fosc。现在本设计要求50ms实现一次中断,选择定时器T0工作在方式1。所以需要根据以上条件计算出T0的初值。设T0的初值为X,则 X =2—50ms/1us=15536D=3CB0H。即THX=3CH(取X的高8位)TLX=0B0H(取X的低5位)
由于定时50ms只是一个理想化的时间,其中并没有考虑到中断后单片机执行语句所花的时间。虽然执行语句所花的时间很短只有即微秒,但积少成多,数字秒表一秒中
14
16
16