单片机应用系统设计
第十一章
1.1.1 可靠性
高可靠性是单片机系统应用的前提, 在系统设计的每一个
环节, 都应该将可靠性作为首要的设计准则 。 提高系统的可靠
性通常从以下几个方面考虑:
1,使用可靠性高的元器件
2,采用双机系统
3,设计电路板时布线和接地要合理, 严格安装硬件设备及
电路
11.1 单片机应用系统设计的基本准则
4,对供电电源采用抗干扰措施
5,输入输出通道抗干扰措施
6,进行软硬件滤波
7,系统自诊断功能
11.1.2 操作维护方便
11.1.3 性价比
11.1.4 设计周期短 。
11.2.1 系统总体设计
系统总体设计是单片机系统设计的前提,合理的总体设
计是系统成败的关键。总体设计关键在于对系统功能和性能
的认识和合理分析,系统单片机及关键芯片的选型,系统基
本结构的确立和软、硬件功能的划分
11.2 单片机应用系统的设计方法
开始
明确任务
选机型及外围主
要芯片
划分软、硬件功

硬件设计 软件设计
联机仿真调试
排除故障、修改
软件
固化程序,独立
运行系统
研制完成
图 1 1, 1 单片机系统研制过程
1,明确系统的功能与性能
2,系统单片机选型
3,划分系统软, 硬件功能
4,确定系统结构组成
1,程序存储器
2,数据存储器
3,I/O接口
4,译码电路
5,总线驱动器
6,抗干扰电路
11.2.2 硬件设计
开始
系统定义
软件结构设计
建立数学模型
绘制程序流程图
编写程序
汇编
在线仿真调试
程序有错否?
修改程序
固化到E P R O M
结束
Y
N
11.3 软 件设计流程图
11.2.3 软件设计
软件设计通常分作系统定义, 软件结构设计和程序设计等
三个步骤, 图 11.3给出了软件设计的流程图 。
1,系统定义
① 定义说明各输入 /输出口的功能, 确定信息交换的方式,
与系统接口方式, 所占口地址, 读取和输出方式等 。
② 在程序存储器和数据存储器区域中, 合理分配存储空间,
其中包括系统主程序, 常数表格, 数据暂存区域, 堆栈区域和
入口地址等 。
③ 对面板控制开关, 按键等输入量以及显示, 打印等输出
量也必须给予定义, 以此作为编程依据 。
④ 针对可能出现的由干扰引起的错误进行容错设计, 给出
错误处理方案, 以达到提高软件可靠性的目的 。
⑤ 明确所设计的用户程序应达到的精度, 速度指标 。
2,软件结构设计
3,程序设计
用 户 实 时 监 控 程 序


1


2


n


1, 1


2, 1


n, 1


n, 2


n, 2, 1
… … … …
调 度
调 用
图 11.4
系统调试包括硬件调试、软件调试和软、硬件联调。根
据调试环境不同,系统调试又分为模拟调试与现场调试。各
种调试所起的作用是不同的,它们所处的时间段也不一样,
不过它们的目的都是为了查出用户系统中存在的错误或缺陷。
系统调试的一般过程如图 11.5。
11.2.4 系统总体调试
系 统 调 试 开 始
硬 件 调 试 软 件 调 试
系 统 联 调
现 场 调 试
调 试 结 束




图 11.5
1,单片机应用系统调试工具
(1) 单片机开发系统
(2) 万用表
(3) 逻辑笔
(4) 逻辑脉冲发生器与模拟信号发生器
(5) 示波器
(6) 逻辑分析仪
2,单片机应用系统的一般调试方法
(1) 硬件调试
① 静态调试
② 动态调试
(2) 软件调试
① 先独立后联机
② 先分块后组合
③先单步后连续
(3) 系统联调
① 软, 硬件能否按预定要求配合工作 。
② 系统运行中是否有潜在的设计时难以预料的错误 。
③ 系统的动态性能指标 (包括精度, 速度参数 )是否
满足设计要求 。
(4) 现场调试
11.3 数码管时钟电路的设计
11.3.1 系统设计引言
LED数码管时钟电路采用 24 h计时方式, 时, 分, 秒用六位
数码管显示 。 该电路采用 AT 89C2051单片机, 使用 3 V电池供电 。
11.3.2 系统设计原理
以 AT89C2051单片机来实现时钟计时显示有如下几个要点:
1,计算计数初值
时钟计时的关键问题是秒的产生,因为秒是最小时钟单位,
但使用 MCS-51的定时器 /计数器进行定时,即使按工作方式 1,其
最大定时时间也只能达到 131ms,离 1s还差很远。为此,我们把秒
计时用硬件定时和软件计数相结合的方法实现,即:把定时器的
定时时间定为 125ms,这样计数溢出 8次就可得到 1s,而 8次计数可
用软件方法实现。
为得到 125ms定时, 我们可使用定时器 /计数器 0,以工作方
式 1进行, 假定单片机为 6MHZ晶振, 设计数初值为 X,则有如
下等式:
( 216 –X) × 2=125000
计算得计数初值 X=3036,二进制表示为 110011011100B,
十六进制表示为 0CDCH。
2,设定定时器定时方式
定时器采用中断定时方式完成,以便于通过中断服务程序
进行溢出次数 (每次 125ms)的累计,计满 8次即得到秒计时。
3,实现方法
通过在程序中的数值累加和数值比较来实现从秒到分和从
分到时的计时 。
4,设置时钟显示及显示缓冲区
假定时钟时间在 6位 LED数码管上进行显示 (时、分、秒各
占两位 )。为此,要在内部 RAM中设置显示缓冲区,共 6个单元,
与数码管对应关系如图 11.12所示。显示缓冲区从左向右依次存
放时、分、秒的数值。
LED5 LED4 LED3 LED2 LED1 LED0
7EH 7DH 7CH 7BH 7AH 79H
图 11.12 LED显示器的缓冲单位
11.3.3 系统硬件设计
数码管时钟电路如图 11.13所示,其采用 AT89C2051单片机
最小化应用设计,LED显示用动态扫描方式实现,P1口输出段
码数据,P3.0~ P3.5口作扫描输出,P3.7接按钮开关。了提供 LED
数码管的驱动电流,用三极管 9012作电源驱动输出。为了提高
秒计时的精确中。本设计中的计时采用定时器 T0中断完成,其
余状态循环调用显示子程序,当 P3.7端口开关按下时,转入调时
功能程序。
P1.0 12
P1.1 13
P1.2 14
P1.3 15
P1.4 16
P1.5 17
P1.6 18
P1.7 19
1 RST
2 P3.0
3 P3.1
4 XTAL2
5 XTAL1
6 P3.2
7 P3.3
8 P3.4
9 P3.5
10 VSS
VCC 40
P3.7 11
+5V
SET2
SET1
4.7K
+5V
10K
10uF
12MHZ
30pF
P3.5 P3.4 P3.3 P3.2 P3.1 P3.0
89C2051
图 11.13 采用 AT89C2051的六位时钟电路
11.3.4 系统软件设计
1,主程序 (MAIN)
主程序的主要功能是进行定时器/计数器的初始化编程,
然后通过反复调用显示子程序的方法,等待 125ms定时中断的
到来。系统主程序流程图如图 11.14所示。
调用显示子程序
设置循环次数
开中断
定时开始
计数初值
定时器 0工作方式 1
显示缓冲区单元清 0
定义堆栈区
MAIN
等待定时中断请求
图 11.14 主程序流程
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号 START执行
ORG 000BH ;定时器 0中断程序入口
LJMP INTTO ;跳到标号 INTTO执行
ORG 0030H
START,MOV SP,#60H ;确立堆栈区
MOV R0,#79H ;显示缓冲区首地址
MOV R7,#06H ;显示位数
ML1,MOV @R0,#00H ;显示缓冲单元清 0
INC R0
DJNZ R7,ML1
主程序清单如下:
MOV TMOD,# 01H ;设置定时器 0为方式 1
MOV TL0,# 0DCH ;装计数器初值
MOV TH0,# 0CH
SETB EA ;总中断开放
SETB ET0 ;允许 T0中断
SETB TR0 ;开启 T0定时器
MOV 30H,#08H ;计数溢出次数
ML0,LCALL DISPLAY ;调用显示子程序
JNB P3.7 SETMM1 ;调整程序
SJMP ML0
SETMM1,LJMP SETMM ;转到调整程序
2,加 1子程序 (DAADl)
加 1子程序用于完成对秒, 分和时的加 1操作, 中断服务程
序中在秒, 分, 时加 1时共有三处调用此子程序 。 加 l操作共包括
以下三项内容:
加 1子程序清单:
DAA1,MOV A,@R0 ;加 1子程序, 十位送 A
DEC R0
SWAP A ;十位数占高 4位
ORL A,@R0 ;个位数占低 4位
ADD A,#01H ;加 1
DA A ;十进制调整
MOV R2,A ;全值暂存 R2中
ANL A,#0FH ;屏蔽十位数, 取个位数
MOV @R0,A ;个位值送显示缓冲单元
MOV A,R2
INC R0
ANL A,# 0F0H ;屏蔽个位数取出十位数
SWAP A ;使十位数占低 4位
MOV @R0,A ;十位数送显示缓冲单元
RET ;返回
十位数送缓冲单元
把十位数交换到低半字节
个位数送缓冲单元
十进制调整
加 1
取个位数,并占 A低半字节
使十位数占 A高半字节
取十位数
DISPLAY
图 11.5 加 1子程序流程
3,中断服务程序 (PITO)
中断服务程序的主要功能是进行计时操作 。 程序开
始先判断计数溢出是否满了 8次, 不满 8次表明还没达到
最小计时单位秒, 中断返回;如满 8次则表明已达到最
小计时单位秒, 程序继续向下执行, 进行计时操作 。 中
断服务程序流程如图 11.16所示 。
中断子程序清单:
INTT0,PUSH ACC ;现场保护
PUSH PSW
SETB PSW.3 ;选 1组通用寄存器
MOV TL0,#0DCH ;计数器重新加载
MOV TH0,#0CH
MOV A,30H ;循环次数减 1
DEC A
MOV 30H,A
JNZ RET0 ;不满 8次转移
MOV 30H,#08H ;满 8次开始计时
MOV R0,#7AH ;秒显示缓冲单元
ACALL DAAD1 ;秒加 1
MOV A,R2 ;加 1后秒值在 R2
XRL A,#60H ;判是否到 60秒
JNZ RET0 ;不到转移
ACALL CLR0 ;到 60S显示单元清 0
MOV R0,#7CH ;分显示缓冲单元地址
ACALL DAAD1 ;分加 1
MOV A,R2
XRL A,#60H ;判是否到 60分
JNZ RET0
ACALL CLR0 ;到 60分显示单元清 0
MOV R0,#7EH ;时显示缓冲单元地址
ACALL DAAD1 ;时加 1
MOV A,R2
XRL A,#24H ;判是否 24小时
JNZ RET0
ACALL CLR0 ;到 24小时清缓冲单元
RET0,POP ACC ;现场恢复
POP PSW
RET1 ;中断返回
CLR0,CLR A ;清缓冲单元子程序
MOV @R0,A ;十位数缓冲单元清 0
DEC R0
MOV @R0,A ;个位数缓冲单元清 0
RET ;返回
4,清缓冲单元子程序:
秒显示缓冲单元清 0
秒加 1
循环次数减 1
计数器重新加载
现场保护
PITO
是否满 8次
是否 60秒 时显示缓冲单元清 0
是否 24小时
是否 60分
分值加 1
现场恢复
时值加 1
分显示缓冲单元清 0
返回
图 11.16 中断服务程序流程
5,显示子程序
数码管显示的数据存放在内存单元 79H一 7EH中, 其
中 79H~ 7AH存放秒数据,7BH~ 7CH存放分数据,7DH~
7EH存放时数据,每一地址单元内均为十进制 BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进
制 BCD码数据的对应段码存放在 ROM表中。显示时,先取出
79H~ 7EH某一地址中的数据,然后查得对应的显示用段码从
P1口输出。 P3口将对应的数码管选中,就能显示该地址单元
的数据值。
DISPLAY,MOV R0,#79H ;建立显示缓冲区首址
MOV R3,# FEH ;从右数第一位显示
MOV A,R3 ;扫描字放入 A
LD0,MOV P3,A ;从 P3口输出
MOV A,@R0 ;取显示数据到 A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P1,A ;段码放 P1口
ACALL DL1MS ;延时 1ms
INC R0 ;指向下一地址
MOV A,R3
JB ACC.5 LD1 ; ACC.5=0一次显示结束
RL A ; A中数据循环左移
MOV R3,A ;将位控码送 R3保存
AJMP LD0 ;继续扫描
LD1,RET
TAB,DB C0H ;字形代码表 0
DB F9H ; 1
DB A4H ; 2
DB B0H ; 3
DB 99H ; 4
DB 92H ; 5
DB 82H ; 6
DB F8H ; 7
DB 80H ; 8
DB 90H ; 9
DB 88H ; A
DB FFH ;灭
DL1MS,MOV R6,#14H ; 1ms延时程序
DL1,MOV R7,#19H
DL2,DJNZ R7,DL2
DJNZ R6,DL1
RET