第九章 常用控制程序设计
第六章 常用控制程序设计
6.1 判断程序设计
6.2 巡回检测程序设计
6.3 数字滤波程序设计
6.4 标度变换程序设计
6.5 上下限报警处理程序设计
6.6 LED数码管显示程序设计
6.7 定时程序设计
6.8 键盘控制程序设计
6.9 抗干扰技术
6.10 电机控制程序设计
6.11 步进电机控制
第九章 常用控制程序设计
6.1 判断程序设计
6.1.1 算术判断程序
6.1.2 逻辑判断程序
6.1.3 标志判断程序
返回本章首页
第九章 常用控制程序设计
判断程序就是分支执行程序 。 程序在执行时, 首先判定给
定的条件是否满足, 根据判定的结果 ( 真或假 ) 再执行相
应的操作 。
例如:在转速控制系统中, 电机的恒速运转一般是通过控
制输入电压来实现的, 首先检测出电机的实际转速, 再比
较电机的实际转速和给定转速, 如果电机的转速低于给定
转速, 就需要增加输入电压;如果电机的转速高于给定转
速, 就需要降低输入电压 。 上述功能的执行过程如图 3-1
所示 。
第九章 常用控制程序设计
图 6-1 判断程序框图
检测电机转速
是否大于
给定转速
降低输入电压 提高输入电压
是 否
第九章 常用控制程序设计
MCS-51系列的程序状态字 ( PSW) 是一个用于存储程序
运行状态信息的 8位寄存器, 其位定义如表 6-1所示 。 其中
有些位状态是根据程序运算结果由硬件自动设置;而有些
位状态则是通过软件设定的 。 PSW的位状态可通过指令读
出, 以实现程序的转移 。
返回本节
6-1
第九章 常用控制程序设计
6.1.1 算术判断程序
1,两个 8位无符号数比较
2,两个 16位无符号数比较
3,两个 8位有符号数的比较
第九章 常用控制程序设计
1,两个 8位无符号数比较
图 6-2 8位无符号数的比较流程框图
第九章 常用控制程序设计


CLR CY ; 进位标志清零
MOV A,M ; A←M
SUBB A,N ; 求 M- N
JZ EQU ; 累加器 A=0,则 M=N,转 EQU
JC LESS ; CY=1,有借位, 则 M<N,转 LESS
BIG,M>N处理程序 ;无借位, 则 M>N,执行 BIG处理程序
EQU,M=N处理程序
LESS,M<N处理程序


8位无符号数的比较程序清单:
第九章 常用控制程序设计
2,两个 16位无符号数比较
图 6-3 16位无符号数的比较流程框图
标志位设定
高八位相等否?
M 和N 高八位比较
低八位比较
低八位相等否?
M = N 处理程序 M > N 处理程序 M < N 处理程序
借位否?






第九章 常用控制程序设计
16位无符号数的比较程序清单:


CLR CY ; 标志位清零
MOV A,MH ; A←MH
MOV R2,NH ; R2←NH
SUBB A,R2 ; 高 8位比较
JZ HEQU ; 高 8位相等,转低 8位比较
JC LESS ; 有借位,转 M<N 处理程序
AJMP BIG ; 无借位,转 M>N 理程序
第九章 常用控制程序设计
HEQU,CLR CY ; 标志位清零
MOV A,ML ; A←ML
MOV R2,NL ; R2←NL
SUBB A,R2 ; 低 8位比较
JZ EQU ; A=0,则 M=N,转 EQU
JC LESS ; 有借位, 则 M<N,转 LESS
BIG,M>N处理程序 ;无借位, 执行 M>N理程序
EUQ,M=N 处理程序
LESS,M<N 处理程序


第九章 常用控制程序设计
3,两个 8位有符号数的比较
由于 M和 N均为有符号数, M和 N两数在比较时,
可能出现以下四种情况:
( 1) M>0,N>0,即两数均为正数 。
( 2) M>0,N<0,即 M为正数, N为负数 。
( 3) M<0,N>0,即 M为负数, N为正数 。
( 4) M<0,N<0,即两数均为负数 。
第九章 常用控制程序设计
图 6-4 8位有符号数的比较流程框图
M A
M - N = 0?
溢出否?
A C C, 7 = 1? A C C, 7 = 1?






是是
转 M = N 程序 转 M < N 程序 转 M > N 程序
第九章 常用控制程序设计
8位有符号数比较程序清单:


MOV A,M ; A←M
MOV R2,N ; R2←N
SUBB A,R2 ; M和 N 比较
JZ EQU ; M和 N相等, 转相等处理程序
JB PSW.2,FLOW ; 判断是否溢出
JB ACC.7,LESS ; 无溢出, 且 A的最高位为 1,则 M<N
AJMP BIG ; 否则, M>N
FLOW,JB ACC.7,BIG ; 有溢出, 且 A的最高位为 1,则 M>N
LESS,M<N处理程序 ;否则, M<N,执行 LESS执行程序
BIG,M>N处理程序
EUQ,M=N处理程序


返回本节
第九章 常用控制程序设计
6.1.2 逻辑判断程序
逻辑判断程序的设计步骤:
( 1) 读入数据 ( 开关状态或阀门的位置 ) ;
( 2) 屏蔽不需要的状态位;
( 3) 与所要求的状态比较;
( 4) 判断比较结果, 选择程序入口 。
第九章 常用控制程序设计
例 6-1 图 6-5中 A、
B,C,D表示 4个开
关, 当四个开关均
闭合时, 顺序执行
相应的程序, 否则,
继续检测 。
逻辑判断程序流程
框图如图 6-6所示。
P 1.0
P 1.2
P 1.4
P 1.6
8 0 3 1
+5V
A
B
D
C
R 1 R 4R 3R 2
.
.
.
.
图 6-5 开关位置检测图
第九章 常用控制程序设计
读入开关状态
屏蔽不需要的位
满足要求否?
继续执行



6-
6









第九章 常用控制程序设计
逻辑判断程序清单:


CHECK,MOV A,P1 ; 读入开关状态
ANL A,#55H ; 屏蔽无用位
XRL A,#00H ; 判断 A,B,C,D是否全部闭合
JNZ CHECK ; A,B,C,D没全部闭合, 继续检测
… ;否则顺序执行相应程序

返回本节
第九章 常用控制程序设计
6.1.3 标志判断程序
标志判断的设计思想
是:根据某一设定的
标志单元(或标志位)
的状态,决定程序的
执行方向。电机旋转
方向控制程序流程图
如图 6-7所示。
图 6-7 电机旋转方向控制程序流程图
标志位判断
标志位为1 否?
是 否
执行顺时针旋
转控制程序
执行逆时针旋
转控制程序
第九章 常用控制程序设计
电机旋转方向控制程序清单:
FLAG BIT 00H ; 设定 00H为电机旋转方向控制位


JB FLAG RIGHT; FLAG=1,转 RIGHT
LEFT,… ; FLAG=0,顺时针旋转控制程序

RIGHT,… ; 逆时针旋转控制程序

返回本节
第九章 常用控制程序设计
6.2 巡回检测程序设计
6.2.1 概述
6.2.2 巡回检测举例
返回本章首页
第九章 常用控制程序设计
6.2.1 概述
所谓的巡回检测就是对生产过程中的各个参数按
照一定的周期进行检查和测量,检测的数据通过
计算机处理后可以进行显示、打印和报警等操作。
巡回检测程序主要由以下几个方面构成:
1,采样周期 T的确定
2,采样开关通道号的控制
3,A/D转换
4,数据处理
返回本节
第九章 常用控制程序设计
6.2.2 巡回检测举例
1,利用 8位 A/D转换芯片( ADC0806)
2,采用 12位 A/D转换芯片( AD574A)
第九章 常用控制程序设计
1,利用 8位 A/D转换芯片( ADC0806)
图 6-8 炉温巡回检测电路原理图
P 0.0 0.7
~
D 0 7
~
Q 0
Q 2
Q 1
A D D A
A D D B
A D D C
A L E
S T A R T
2 - 7 2 - 2
~
i s b 2 - 8
m s b 2 - 1
2 分频 C L O C K
E N A B L E
E O C
A D C 0 8 0 9
7 4 0 0
7 4 0 0
7 4 0 6
7 4 L S 3 7 3
8 0 3 1
.
.
P 2.7
WR
RD
A L E / P
I N T 0
IN 0
IN 1
IN 2
IN 3
IN 4
IN 5
IN 6
IN 7
第九章 常用控制程序设计
系统的硬件电路介绍:
( 1)测量元件和变送器
( 2) A/D转换电路
( 3)二分频电路
第九章 常用控制程序设计
本程序由系统初始化程序和中断
程序组成 。 初始化程序完成中断
向量和定时器初值的设定;中断
程序完成数据采样工作, 实现对 8
个通道的巡回检测 。
初始化程序功能:设置定时器 0、
外部中断 0和外部中断 1的中断程
序入口;设置定时器 0的工作方式
为方式 1,定时时间为 100ms; 设
置计数单元 ( 30H) 初值 。
初始化程序流程框图如图 6-6所示 。
开中断
中断初始化
启动定时器
等待中断
开始
设置中断向量
定时器初始化

6-
6








第九章 常用控制程序设计
初始化程序清单:
ORG 0000H
AJMP START
ORG 0003H
AJMP SAMPLE ; 转采样中断程序
ORG 000BH
AJMP TIME0 ; 转 8秒定时中断程序
ORG 0013H
AJMP EOC ; 转 EOC中断处理程序
START:MOV TMOD,#01H ; 置定时器 0为工作方式 1
MOV TH0,#3CH
第九章 常用控制程序设计
MOV TL0,#0B0H ; 定时器初值设定
MOV 30H,#00H ; 置计数初值
SETB IT0 ; 中断请求信号为脉冲方式
SETB IT1 ; 中断请求信号为脉冲方式
SETB EX0 ; 外部中断 0中断允许
SETB ET0 ; 定时器 0中断允许
SETB EA ; 开中断
SETB TR0 ; 启动定时器
HERE:AJMPHERE; 等待中断
第九章 常用控制程序设计
定时器中断程序流程框图如图 6-10所示。

6-
10











关中断
计数单元加1
8s定时
到否?
触发INTO
重新加载数据
开中断


开 始
返 回
第九章 常用控制程序设计
定时器中断程序程序清单:
TIME0,CLR EA ; 关中断
INC 30H
MOV A,30H
XRL A,#50H ; 判断是否到 8秒
JZ S_8 ; 8秒定时到, 转至 S_8
AJMP RECOUN ; 未到 8秒, 继续计时
S_8,SETB P3.2 ; 触发外部中断 0
NOP
CLR P3.2
NOP
RECOUN,MOV TH0,#3CH
MOV TL0,#0B0H ; 设定定时器初值
SETB EA ; 开中断
RETI ; 中断返回
第九章 常用控制程序设计
数据采样程序流程框图如图 6-11所示。
第九章 常用控制程序设计
数据采样程序程序清单:
SAMPLE,SETB 00H ; 设置标志位
MOV DPTR,#0F00H ; 设置通道初值
MOV R6,#08H ; 设置通道数
MOV R7,#05H ; 设置采样次数
MOV R0,#40H ; 设置数据区首址
TRAN_S,MOVX @DPTR,A ; 启动 A/D转换程序流程图
WAIT,JB 00H,WAIT ; 标志位为 1等待 A/D转换完成中断
第九章 常用控制程序设计
SETB 00H ; 置标志位
INC DPTR ; 通道号加 1
INC R0
INC R0
INC R0
INC R0
INC R0 ; 45H为下一通道采样数据存放首址
DJNZ R6,#TRAN_S ; 8个通道采样未完, 继续采样
MOV DPTR,#0F00H ; 8个通道采样结束, 重置通道初值
INC R0 ; 修改采样数据存放地址
DJNZ R7,TRAN_S ; 未完成 5次采样, 继续
… ;数据处理程序
…,
RETI
第九章 常用控制程序设计
2,采用 12位 A/D转换芯片( AD574A)
图 6-14 AD574A和 8031的硬件接口电路图
Q 0
D B 1 0
P 0.0
P 0.1
P 0.3
P 0.2
P 0.7
P 0.6
P 0.5
P 0.4
D 0
D 0
D 0
D 0
D 0
D 0
D 0
D 0
Q 0
Q 1
OE
m s b - 1 1
B 1 0
D B 3
D B 4
D B 5
D B 6
D B 7
D B 8
D B 9
D B 2
D B 1
1 s b B D 0
S T A T U S
CE
CS
A 0 / S C
R / C
1 2 / 8
RD
WR
P 2.7
I N T 0
8 0 3 1 A H
7 4 0 0
A N - G N D
.
39
38
37
36
35
32
33
34
12
16
17
28
18
17
14
13
8
7
4
3
1
5
2 4
7 4 L S 3 7 3
5
3
16
17
18
19
20
21
22
23
24
25
26
27
6
2
1
3
9
A D 5 7 4 A
+ 1 5 V
- 1 5 V
+ V s
- V s
1 0 V s p n 模拟温度信号输入
28
11
7
13
2
.
.
.
.
.
.
.
.
.
.
.
.
B I P O F F
R E F O U T
R E F I N
+ 1 5 V
- 1 5 V
1 0 0 K
1 0 0
1 0 0 K
1 0 0
Ω
Ω
12
.
.
10
8
第九章 常用控制程序设计
图 6-15 AD574A A/D转换程序流程框图
开 始
中断向量设置
A D 5 7 4 地址设置
数据存储首址设置
外部中断0 设置
启动A / D 转换
结 束
中断等待
返 回
开 始
关中断
读A / D 转换数据高8 位
保存数据
改变存储地址
读A / D 转换数据低4 位
开中断
( a ) 转换主程序 ( b ) 中断服务程序
第九章 常用控制程序设计
D574A A/D转换程序清单:
ORG 0000H
AJMP START
ORG 0003H
AJMP SAMPLE ; 转至数据采样程序
START,MOV DPTR,#0000H ; 建立 AD574A的地址
MOV R0,#40H ; 设置数据存储初址
SETB EX0 ; 允许外部中断 0
SETB IT0 ; 设置外部中断 0请求信号方式为脉冲方式
SETB EA ; 中断允许
MOVX @DPTR,A ; 启动 A/D转换
HERE,AJMP HERE ; 等待中断
第九章 常用控制程序设计
中断服务程序清单:
SAMPLE,CLR EA ; 关中断
MOV DPTR,#0002H
MOVX A,@DPTR ; 读 A/D转换数据的高 8位
MOV @R0,A ; 保存数据
INC R0
INC DPTR
MOVX A,@DPTR ; 读 A/D转换数据的低 4位
SETB EA ; 开中断
RETI
返回本节
第九章 常用控制程序设计
6.3 数字滤波程序设计
6.3.1 概述
6.3.2 数字滤波的方法
返回本章首页
第九章 常用控制程序设计
6.3.1 概述
和模拟滤波装置相比, 数字滤波有以下几个优点:
( 1) 数字滤波通过程序实现, 不需硬件设备, 系统的可
靠性较高 。
( 2) 数字滤波可实现多通道共用 。
( 3) 可对低频信号 ( 如 0.01Hz) 实现滤波 。
( 4) 采用不同的算法和参数就可实现对不同信号的滤波,
使用起来灵活, 方便 。
返回本节
第九章 常用控制程序设计
6.3.2 数字滤波的方法
1,程序判断滤波
2,中值滤波
3,算术平均滤波
4,加权平均滤波
5,一阶滞后滤波
6,防脉冲干扰平均值法
第九章 常用控制程序设计
1,程序判断滤波
限幅滤波就是把相邻的两次采样值相减, 求出其增量 (以
绝对值表示 ),然后与两次采样允许的最大偏差值 (由被控
对象的实际情况决定 ) △ y进行比较, 如果小于等于 △ y,
则取本次采样值;如果大于 △ y,则仍取上次采样值作为
本次采样值 。
即:
│Yn-Yn-1│≤△ y,则 Yn=Yn, 取本次采样值
│Yn-Yn-1│ >△ y,则 Yn=Yn-1, 取上次采样值 ( 6-1)
第九章 常用控制程序设计
限幅滤波程序流程框图如图 6-16所示 。

6-
16










现场保护
Y n-1 -Y n ≥0
读Y n - 1,Y n
求 Y n -Y n -1
Y n-1 -Y n > Y
取上次采样值 取本次采样值
现场恢复




开 始
返 回
第九章 常用控制程序设计
限幅滤波程序程序清单:
PUSH PSW ; 保护现场
PUSH A
CLR C ; 进位标志位清零
MOV DATA,DATA2
MOV A,DATA1
SUBB A,DATA ; 求 Yn-1 -Yn
JNC COMPARE ; 如果 Yn-1 -Yn≥0,转 COMPARE
CPL A ; 如果 Yn-1 -Yn<0,求补
INC A
第九章 常用控制程序设计
COMPARE,CLR C
SUBB A,LIMIT ; │Yn-Yn-1│和 △ y比较
JC OVER ; 如果 │Yn-Yn-1│≤△ y,DATA2→DATA
MOV DATA,DATA1 ; 如果 │Yn-Yn-1│>△ y,
DATA1→DATA
OVER,POP A ; 恢复现场
POP PSW
RET ; 返回
第九章 常用控制程序设计
限速滤波的滤波原理如下:
设在顺序采样时刻 T1,T2,T3所采集的数据分别
为 Y1,Y2,Y3,则当
∣ Y2-Y1∣ ≤△ y,则 Y2作为采样值;
∣ Y2-Y1∣ >△ y,则保留 Y2,但不作为采样值,
继续采样得 Y3;
如果 ∣ Y3-Y2∣ ≤△ y,则 Y3作为采样值;
∣ Y3-Y2∣ >△ y,则取作为采样值 。
第九章 常用控制程序设计
2,中值滤波
所谓中值滤波法就
是对某一被测参数
连续采样 n次( n一
般取奇数),然后
把 n次采样值按顺
序排列,取其中间
值做为本次采样值。
中值滤波程序的流
程框图如图 6-17所
示。

6-
17










现场保护
设置数据个数
读 数据排序
取中值

现场恢复
排序
完成否?

设置数据区首址
开 始
返 回


第九章 常用控制程序设计
中值滤波程序程序清单:
PUSH PSW
PUSH A
SORT,MOV R0,DATA ; 数据存储区单元首址
MOV R7,TIME ; 读比较次数
CLR FLAG ; 清交换标志位
LOOP,MOV A,@R0 ; 取第一个数
MOV FIRST,A ; 保存第一个数
INC R0
MOV SECOND,@R0 ; 保存第二个数
CLR C
SUBB A,@R0 ; 两数比较
第九章 常用控制程序设计
JC NEXT ; 第一数小于第二数, 不交换
MOV @R0,FIRST
DEC R0
MOV @R0,SECOND ; 交换两数
INC R0
SETB FLAG ; 置交换标志位
NEXT,DJNZ R7,LOOP ; 进行下一次比较
JB FLAG,SORT ; 进行下一轮比较
DEC R0
CLR C
MOV A,TIME
第九章 常用控制程序设计
RRC A
MOV R7,A
CONT,DEC R0
DJNZ R7,CONT
MOV SAMP,@R0 ; 取中值
POP A
POP PSW
RET
第九章 常用控制程序设计
3,算术平均滤波
所谓算术平均滤波就是把
n个采样值相加, 然后取
其算术平均值作为本次有
效的采样信号, 即:

6-
18











现场保护
设置数据区首址
设置 循环次 数
累加 求和
恢复现场
所有数据
加完否?
求平均值


开 始
返 回
读数据
( 6-2)
第九章 常用控制程序设计
算术平均滤波程序清单:(本例中取采样次数 n=8)
PUSH PSW ; 现场保护
PUSH A
MOV FLAG,#00H ; 进位位清零
MOV R0,DATA ; 设置数据存储区首址
MOV R7,#08H ; 设置采样数据个数
CLR A ; 清累加器
LOOP,ADD A,@R0 ; 两数相加
JNC NEXT ; 无进位, 转 NEXT
INC FLAG ; 有进位, 进位位加 1
NEXT,INC R0 ; 数据指针加 1
DJNZ R7,LOOP ; 未加完, 继续加
MOV R7,#03H ; 设置循环次数
第九章 常用控制程序设计
DIVIDE,MOV TEMP,A ; 保存累加器中的内容
MOV A,FLAG ; 累加结果除 2
CLR C
RRC A
MOV FLAG,A
MOV A,TEMP
RRC A
DJNZ R7,DIVIDE ; 未结束,继续执行
MOV SAMP,A ; 保存结果至 SAMP中
POP A ; 恢复现场
POP PSW
RET
第九章 常用控制程序设计
4,加权平均滤波
在算术平均滤波程序中,n次采样值在最后的结果中所占
的比重是相等的,这样虽然消除了随机干扰,但有用信号
的灵敏度也随之降低。为了提高滤波效果,将各个采样值
取不同的比重,然后再相加求平均值,这种方法称为加权
平均滤波。一个 n项加权平均式为:
( 6-4)
( 6-3)
第九章 常用控制程序设计

6-
16











第九章 常用控制程序设计
加权平均滤波程序清单:
PUSH PSW ; 保护现场
PUSH A
MOV R7,TIME ; 数据个数设置
MOV R0,DATA ; 数据区首址设置
MOV R1,COEFF ; 系数存储首址设置
MOV FLAG,#00H ; 累加结果存储区清零
MOV SAMP_L,#00H
MOV SAMP_H,#00H
LOOP,MOV A,@R0 ; 读采样值
MOV B,A
MOV A,@R1 ; 读加权平均系数
第九章 常用控制程序设计
MUL AB
CLR C
ADD A,SAMP_L ; 累加和
MOV SAMP_L,A
MOV A,B
ADDC A,SAMP_H
JNC NEXT
INC FLAG
NEXT,MOV SAMP_H,A
INC R0 ; 数据区地址加 1
INC R1 ; 系数地址加 1
DJNZ R7,LOOP ; 未加完, 继续
MOV R7,#07H ; 设置循环次数
第九章 常用控制程序设计
DIV128,CLR C
MOV A,FLAG ; 累加结果除 2
RRC A
MOV FLAG,A
MOV A,SAMP_H
RRC A
MOV SAMP_H,A
MOV A,SAMP_L
RRC A
MOV SAMP_L,A
DJNZ R7,DIV128 ; 未除完, 继续
MOV SAMP,SAMP_L ; 保存滤波后采样值
POP A ; 恢复现场
POP PSW
RET
第九章 常用控制程序设计
5,一阶滞后滤波
图 6-20 一阶滞后滤波程序流程图



1?
?
n
ya
n
xa )1( ?
1
)1(
?
???
nn
yaxa
nn
yy ?
? 1
开 始
返 回
第九章 常用控制程序设计
一阶滞后滤波程序清单:
MOV MUL1_H,COEFF1_H
MOV MUL1_L,COEFF1_L
MOV MUL2_H,DATA1_H
MOV MUL2_H,DATA1_L
ACALL MULTD ;
MOV BUFF1,PR_H
MOV BUFF2,PR_L
MOV MUL1_H,COEFF2_H
MOV MUL1_L,COEFF2_L
1nya ??
第九章 常用控制程序设计
MOVMUL2_H,DATA2_H
MOVMUL2_H,DATA2_L
ACALL MULTD ;
CLR C
MOVA,PR_H ;
ADD A,BUFF1
MOVPR_H,A
MOVA,PR_L
ADDC A,BUFF2 ;
MOVPR_L,A
第九章 常用控制程序设计
双字节无符号位乘法子程序( MULTD)。
入口条件:乘数 MUL1存于 MUL1_H和 MUL1_L
单元中,被乘数 MUL2存于 MUL2_H和 MUL2_L单
元中 。
出口条件:乘积按顺序存于 PR_H,PR_L、
MUL1_H,MUL1_L单元中 。
第九章 常用控制程序设计
MULTD,CLR C ; 清进位标志位
MOV PR_L,#00H ; 乘积高 8位清零
MOV PR_H,#00H
MOV R7,#11H ; 设置循环次数
LOOP1:JNC LOOP2 ; 进位标志位为零, 转 LOOP2
MOV A,PR_L; PR+MUL2
ADD A,MUL2_L
MOV PR_L,A
MOV A,PR_H
ADDC A,MUL2_H
MOV PR_H,A
第九章 常用控制程序设计
LOOP2,MOV A,PR_H; PR右移一位
RRC A
MOV PR_H,A
MOV A,PR_L
RRC A
MOV PR_L,A
MOV A,MUL1_H ; MUL1右移一位
RRC A
MOV MUL1_H,A
MOV A,MUL1_L
RRC A
MOV MUL1_L,A
DJNZ R7,LOOP1 ; 循环未结束, 继续
第九章 常用控制程序设计
6,防脉冲干扰平均值法

6-
21















设置数据区首址
数据排序
设比较次数
去掉最小值
求 平 均值
剩余数据求和

排序完成否?
去掉最大值

开 始
返 回
第九章 常用控制程序设计
防脉冲干扰平均值法程序清单:
PUSH A ; 保护现场
PUSH PSW
SORT,MOV R0,DATA ; 数据存储区单元首址
MOV R7,#10H ; 读比较次数
CLR CHANGE ; 清交换标志位
LOOP,MOV A,@R0 ; 取第一个数
MOV FIRST,A ; 保存第一个数
INC R0
MOV SECOND,@R0 ; 保存第二个数
CLR C
SUBB A,@R0 ; 两数比较
第九章 常用控制程序设计
JC NEXT ; 第一数小于第二数, 不交换
MOV @R0,FIRST
DEC R0
MOV @R0,SECOND ; 交换两数
INC R0
SETB CHANGE ; 置交换标志位
NEXT,DJNZ R7,LOOP ; 进行下一次比较
JB CHANGE,SORT ; 进行下一轮比较
MOV FLAG,#00H ; 进位位清零
INC DATA ; 去掉最小值
MOV R0,DATA ; 设置数据存储区首址
MOV R7,#08H ; 设置累加循环次数,去掉最大值
CLR A ; 清累加器
LOOP,ADD A,@R0 ; 两数相加
JNC NEXT ; 无进位, 转 NEXT
INC FLAG ; 有进位,进位位加 1
第九章 常用控制程序设计
NEXT,INC R0 ; 数据指针加 1
DJNZ R7,LOOP ; 未加完, 继续加
MOV R7,#03H ; 设置循环次数
DIVIDE:MOV TEMP,A; 保存累加器中的内容
MOV A,FLAG ; 累加结果除 2
CLR C
RRC A
MOV FLAG,A
MOV A,TEMP
RRC A
DJNZ R7,DIVIDE ; 未结束, 继续执行
MOV SAMP,A ; 保存结果至 SAMP中
POP A ; 恢复现场
POP PSW
RET
返回本节
第九章 常用控制程序设计
6.4 标度变换程序设计
对于一般的线性仪表而言, 标度变换公式为:
为了简化程序设计,一般把被测参数的起点 A0所对应的 A/D
转换值设定为 0,即 N0=0,这样式( 6-6)可以改写为:
返回本章首页
( 6-6)
( 6-7)
第九章 常用控制程序设计
例 6-2 某温度测量仪表的量程为 100~600℃,利用 8031和
ADC0806进行 A/D转换。在某一时刻计算机采样并经过数
字滤波后的的数字量为 0CDH求此时对应的温度值是多少?
(设仪表的量程是线性的)
解:由式( 6-7)可知,
A0=100℃,Am=600℃,Nx=0CDH=(205)D,Nm=0FFH=(255)D,
所以此时对应的温度为:
第九章 常用控制程序设计
标度变换程序清单:
BDCHAN,MOV SUB1_L,AM ;
INC AM
MOV SUB1_H,AM
MOV SUB2_L,A0
INC A0
MOV SUB2_H,A0
ACALLSUB2
MOV MUL1_H,DIFF_H
MOV MUL1_L,DIFF_L
MOV SUB1_L,NX ;
第九章 常用控制程序设计
INC NX
MOV SUB1_H,NX
MOV SUB2_L,N0
INC N0
MOV SUB2_H,N0
ACALLSUB2
MOV MUL2_H,DIFF_H
MOV MUL2_L,DIFF_L
ACALLMULTD ; 求
MOV DIV1_H,PR_H
MOV DIV1_L,PR_L
MOV SUB1_L,NM ;
第九章 常用控制程序设计
INC NM
MOV SUB1_H,NM
MOV SUB2_L,N0
INC N0
MOV SUB2_H,N0
ACALLSUB2
MOV DIV2_H,DIFF_H
MOV DIV2_L,DIFF_L
ACALLDUBDIV ;
CLR C
MOV A,DIV1_L
第九章 常用控制程序设计
ADDC A,A0
MOVAX,A
INC A0
MOVA,DIV1_H
ADDC A,A0
MOVAX,A;
RET
第九章 常用控制程序设计
双字节减法子程序( SUB2)
双字节减法子程序( SUB2) 程序入口:被减数放在 SUB1_H、
SUB1_L单元中,减数放在 SUB2_H,SUB2_L单元中;
程序出口:差放在 DIFF_H,DIFF_L单元中 。
SUB2,CLR C
MOV A,SUB1_L ; A←SUB 1_L
SUBB A,SUB2_L ; 低 8位相减
MOV DIFF_L,A ; 保存低 8位差值
MOV A,SUB1_H ; A←SUB 1_H
SUBB A,SUB2_H ; 高 8位相减
MOV DIFF_H,A ; 保存高 8位差值
RET
第九章 常用控制程序设计
双字节无符号数除法( DUBDIV)
程序入口:被除数存放在 DIV1_H,DIV1_L单元中,除数存放在
DIV2_H,DIV2_L单元中;
程序出口:商存放在 DIV1_H,DIV1_L单元中, 余数存放在 L_L和
L_H单元中 。
DUBDIV,CLR A ; 余数单元清零
MOV L_H,A
MOV L_L,A
MOV R0,#10H ; 设置除法移位次数
LOOP,CLR C ; 移位
MOV A,DIV1_L
第九章 常用控制程序设计
RLC A
MOV DIV1_L,A
MOV A,DIV1_H
RLC A
MOV DIV1_H,A
MOV A,L_L
RLC A
MOV L_L,A
MOV A,L_H
RLC A
MOV L_H,A
MOV PSW.5,C
第九章 常用控制程序设计
LP1,MOV A,L_L ; 余数单元减除数
SUBB A,DIV2_L
MOV R1,A
MOV A,L_H
SUBB A,DIV2_H
JB PSW.5 ADD1
JC SMALL
ADD1,MOV L_H,A
MOV A,R1
MOV L_L,A
INC DIV1_L; 商加一
SAMLL,DJNZ R0,LOOP
第九章 常用控制程序设计
MOV 20H,L_H ; 四舍五入
JB 07H,ADD_D ; 商 的 最 高 位 为 1, 则转
ADD_D
CLR C ; 判断小数部分是否大于 0.5
MOV A,L_L
RLC A
MOV L_L,A
MOV A,L_H
RLC A
SUBB A,DIV2_H
第九章 常用控制程序设计
JC RETURN ; 小数部分小于 0.5,退出
JNZ ADD1 ; 小数部分大于 0.5,则转 ADD_D
MOV A,L_L
SUBB A,DIV2_L
JC RETURN
ADD_D,CLR C ; 商加一
INC DIV1_L
MOV A,DIV1_H
ADDCA,#00H
MOV DIV1_H,A
RETURN,RET
返回本节
第九章 常用控制程序设计
6.5 上下限报警处理程序设计
报警程序主要有以下几个步骤组成:
( 1) 采样被测参数 。
( 2) 比较采样值和给定的上下限 。
( 3) 根据比较结果执行相应的处理程序 。
返回本章首页
第九章 常用控制程序设计
例 6-3 设计一简单的单字节上下限报警程序, 当
采样值超出上, 下限时, 分别执行相应的报警处
理程序 。
设上限报警值存放在 Amax单元, 下限报警值存放
在 Amin单元, 采样值存放在 SAMP单元 。
简单上下限报警程序程序清单如下:
第九章 常用控制程序设计

…,
CLR C ; 清进位标志位
MOV A,Amax; 读上限报警值
SUBB A,SAMP ; 判断是否超过上限报警值
JC UPPER; 超过上限, 转报警处理程序
MOV A,Amin ; 读下限报警值
SUBB A,SAMP ; 判断是否超过下限报警值
JNC LOWER ; 超过下限, 转报警处理程序


UPPER,超上限处理程序 。
LOWER,超下限处理程序 。
第九章 常用控制程序设计
例 6-4 设计一报警处理程序 。 只有采样值连续 3
次异常时, 系统才进行报警处理 。
报警程序流程框图如图 6-23所示 。
第九章 常用控制程序设计
开 始
取报警下限
取报警上限
重置允许连
续异常次数
设置采样正常标志
设置采样
异常标志
上次采样
正常否?
允许连续采样
异常次数= 0?
允许连续采样
异常次数- 1
设置采样
异常标志
报警处理

采样值超
下限否?
采样值超
上限否?


结 束





图 6-23 报警程序流程框图
第九章 常用控制程序设计
报警程序清单:


MOV NUM,#03H


CHECK,CLR C ; 清进位标志位
MOV A,Amax ; 读上限报警值
SUBB A,SAMP ; 判断是否超过上限报警值
JC ABNORMAL ; 超过上限, 转 ABNORMAL
MOV A,Amin ; 读下限报警值
SUBB A,SAMP ; 判断是否超过下限报警值
JNC ABNORMAL ; 超过下限, 转 ABNORMAL
第九章 常用控制程序设计
CLR FLAG ; 采样正常, 清采样异常标志位
AJMP RETU
ABNORMAL,JB FLAG,ABNOR_L ; 上次采样异常, 转 ABNOR_L
MOV NUM,#03H ; 上次采样正常, 重置允许连续异常次

SETB FLAG ; 置位采样异常标志位
AJMP RETU
ABNOR_L,MOV A,NUM ; 读允许连续采样异常次数
JZ ALARM ; 允许采样异常次数 =0,执行报警处理程序
DEC NUM ; 允许采样异常次数 ≠0,允许采样异常次数减 1
SETB FLAG ; 置位采样异常标志位
AJMP RETU
ALARM1,..,; 报警处理程序
...
RETU,RET
返回本节
第九章 常用控制程序设计
6.6 LED数码管显示程序设计
6.6.1 LED显示器件工作原理
6.6.2 LED显示方式
6.6.3 LED显示程序设计
返回本章首页
第九章 常用控制程序设计
6.6.1 LED显示器件工作原理
LED显示器件是通过发光二极管显示字段的器件 。 在单片
机控制系统中常用的是由 7段 LED数码管, 它的显示块中
有 8个发光二极管, 7个发光二极管组成字符, 8”, 1个发
光二极管构成小数点, 因此有人称 7段 LED数码管为 8段显
示器 。 LED数码管的管脚配置如图 6-24所示 。
LED数码管有共阴极和共阳极两类, 如图 6-24所示 。 共阴
极 LED数码管的发光二极管的阴极共地, 如图 6.25( a),
当某个发光二极管的阳极电压为高电平时, 二极管发光;
而共阳极 LED数码管是发光二极管的阳极共接, 如图 6.25
( b), 当某个二极管的阴极电压为低电平时, 二极管发
光 。
第九章 常用控制程序设计
a
b
c
d
e
f
g
dp
R×8
( a ) 共 阴 极
a
b
c
d
e
f
g
dp
R×8
( b ) 共 阳 极
+ 5V
a
a
b
b
cd
c
e
d
f
e
g
f
g
1
7 6
432 5
10 9 8
GND
GND dp
a
b
c
d
e
f
g
dp
R ×8
( a ) 共 阴 极
a
b
c
d
e
f
g
dp
R ×8
( b ) 共 阳 极
+ 5 V
a
a
b
b
cd
c
e
d
f
e
g
f
g
1
7 6
432 5
10 9 8
GND
GND dp
图 6-24 LED数码管管脚配置图
( a) 共阴极 ( b) 共阳极
图 6-25 两类 LED数码管
第九章 常用控制程序设计
表 6-2 7段 LED段选码
返回本节
第九章 常用控制程序设计
6.6.2 LED显示方式
在微机控制系统中, 一般利用 N块 LED显示器件
构成 N位 LED显示器 。 构成原理图如图 6-26所示 。
图 6-26 N位 LED显示器原理图
a
a
b
b
c d
c
e
d
f
e
g
f
g
3, 8
dp a
a
b
b
c d
c
e
d
f
e
g
f
g
3, 8
dp a
a
b
b
c d
c
e
d
f
e
g
f
g
3, 8
dp a
a
b
b
c d
c
e
d
f
e
g
f
g
3, 8
dp
.,.
a
a
b c d
c
e
d
f
e
g
f
g
3, 8
I / O 口段选控制
I / O 口位选控制
第九章 常用控制程序设计
1,LED静态显示方式
图 6-27表示的是一个四位静态 LED显示电路 。
图 6-27 四位静态 LED显示电路
G N D / + 5 V
.
G N D / + 5 V G N D / + 5 VG N D / + 5 V
G N D / + 5 V
I / O ( 1 ) I / O ( 2 ) I / O ( 3 ) I / O ( 4 )
.,,
第九章 常用控制程序设计
2,LED动态显示方式
LED动态显示就是将所有显示位的段选线并联在一起, 由
一个 8位 I/O口控制, 而位选线则由其他的 I/O口控制 。
图 6-28表示的是一个 8位动态 LED显示电路 。
图 6-28 8位动态 LED显示电路 返回本节
..,,,
D 7
.,,
.
..
..
.
.,
..
..
..
.,
..
.
..
.
.,
..
.
..
.
.,
..
..
..
.,
..
..
..
.,
..
..
..
.,
..
.
..
.
.,
D 6 D 5 D 4 D 3 D 2 D 1 D 0
I / O (1 )
I / O ( 2 )
第九章 常用控制程序设计
6.6.3 LED显示程序设计
1,硬件译码显示程序设计
MC14465是 CMOS BCD—— 七段十六进制锁存,
译码驱动芯片 。 MC14465能完成 BCD码至十六进
制数的锁存和译码, 并具有驱动能力 。
利用 MC14465实现的 8位静态 LED显示接口电路
如图 6-26所示 。
第九章 常用控制程序设计
图 6-26 利用 MC14465实现的 8位静态 LED显示接口电路图
.
.
.
.
.
A DCB
M C S
1 4 4 9 5
LE
a b c d e f g
a b c d e f g
.
.
.
.
.
A DCB
M C S
1 4 4 9 5
LE
a b c d e f g
a b c d e f g
.
.
.
.
A DCB
M C S
1 4 4 9 5
LE
a b c d e f g
a b c d e f g
.
.,.
.
.
.
P 1.0
P 1.1
P 1.3
P 1.2
P 1.7
P 1.6
P 1.5
P 1.4 A 0
A 1
A 2
S 1
S 3
S 2
G N D
V c c
+ 5 V
Y 0
Y 1
Y 2
Y 3
Y 4
Y 5
Y 6
Y 7
8 0 3 1
7
4
L
S
1
3
8
第九章 常用控制程序设计
设要显示的 BCD码放在以 DATA为首址的 RAM单元
中。显示程序设计如下:


MOV R0,DATA ; 设置数据区首址
MOV A,@R0 ; 读要显示的 BCD码
ADD A,#80H
MOV P1,A ; 显示第一位
INC R0
MOV A,@R0
ADD A,#60H
MOV P1,A ; 显示第二位
INC R0

…,
INC R0
MOV A,@R0
ADD A,#F0H
MOV P1,A ; 显示第八位
第九章 常用控制程序设计
2,软件译码显示程序设计
( 1)软件译码静态显示电路
( 2)软件译码动态显示电路
第九章 常用控制程序设计
( 1)软件译码静态显示电路
图 6-30为一采用 8位串行输入 /串, 并输出移位寄
存器 74LS565的两位软件译码静态显示电路 。 该
电路采用串行输入控制方案实现字符的显示,
大大减少了 I/O口线的占用 。 如果需要显示更多
的位数时, 只需级连多片 74LS565即可, 且不必
占用其他的 I/O口线 。
第九章 常用控制程序设计
7
6
8
a
a
b
b
c
d
c
e
d
f
e
g
f
g
a
a
b
b
c
d
ce
d
f
e
g
f
g
9
12
11
11
12
14
14
O 2
O 1
O 0
O 7
O 6
O 5
O 4
O 3
O 2
O 1
O 0
O 7
O 6
O 5
O 4
O 3
D 2
D 1
D 8
D 7
D 6
D 5
D 4
D 3
Q 2
Q 1
Q 7
Q 6
Q 5
Q 4
Q 3
D 2
D 1
D 7
D 6
D 5
D 4
D 3
Q 2
Q 1
Q 7
Q 6
Q 5
Q 4
Q 3
D 8
P 15
P 16
P 17 S E R
S R C L K
R C L K
S R C L K
R C L K
S E R
Q 7
8 0 3 1
E 1
E 1
E 2
E 1
1
15
7
6
4
3
2
5
1
15
7
6
4
3
2
5
3
2
9
8
6
5
4
7
3
2
9
8
6
5
4
7
17
18
12
14
15
16
13
17
18
12
14
15
16
13
1
7
6
4
3
2
5
1
7
6
4
3
2
5
1
19
19
1
7 4 L S 5 9 5
7 4 L S 5 9 5
7 4 H C 5 4 1
7 4 H C 5 4 1 D P L _ 7 - S E G
D P L _ 7 - S E G
.
.
.
.
图 6-30 通过 74LS565实现的软件译码静态显示电路
第九章 常用控制程序设计
显示程序流程框图如图 6-31所示。
开 始
读显示数据
C y = 0
串行输出程序调用
高4 位和低4 位互换
屏蔽低4 位
设置段选码初始地址
锁存显示数据
屏蔽高4 位
串行输出程序调用
返 回
开 始
段选码右移
一位至C y
C y = 1?
读显示字符段选码
P 1, 7 = 1
输出移位脉冲
循环次数= 8
P 1, 7 = 0
循环次数
为0 否?


返 回


( a) 显示主程序 ( b) 串行输出程序
第九章 常用控制程序设计
显示程序清单:
DAT BIT P1.7
TRAN BIT P1.6
PUL BIT P1.5
SHOW:CLR C
MOV DPTR,#3000H ; 设定段选码的初始地址
START,MOV A,DATA ; 读要显示的数据
ANL A,#0F0H ; 屏蔽低 4位
SWAP A ; 高 4位和低 4位互换
ACALLSET8WEI ; 串行输出子程序调用
MOV A,DATA
ANL A,#0FH; 屏蔽高 4位
第九章 常用控制程序设计
ACALLSET8WEI ; 串行输出子程序调用
NOP
NOP
SETB TRAN ; 锁存并显示输出数据
NOP
NOP
CLR TRAN
NOP
NOP
RET
SET8WEI,MOVC A,@A+DPTR ; 读显示字符的段选码
MOV R7,#08H ; 设置循环次数
第九章 常用控制程序设计
SET81,RRC A ; 段选码的最低位移入进位标志位中
JC SETH ; CY=1,转至 SETH
CLR DAT ; P1.7为低电平
NOP
CLR PUL ; 送移位脉冲
NOP
SETB PUL
NOP
AJMP SET82
SETH,SETB DAT ; P1.7为高电平
第九章 常用控制程序设计
NOP
CLR PUL
NOP
SETB PUL
NOP
SET82,DJNZ R7,SET81 ; 段选码输出未完成, 继续
RET
ORG 3000H ; 共阴极 LED显示段选码
DB
3FH,06H,5BH,4FH,06H,6DH,7DH,07H,7FH,6FH,77H,7CH,36
H,5EH,76H,71H
第九章 常用控制程序设计
( 2)软件译码动态显示电路
图 6.32给出的是通过
8155扩展实现的 8位
LED动态显示接口 。
图中利用 PA口输出段
选码, PB口输出位选
码 。
利用 8155扩展实现的
动态显示程序流程如
图 6-32所示 。
开 始
设置显示数据区首址
8 1 5 5 初始化
设置位选字
显示完8 位
数据否?
输出位选字
读显示数据
延时1 m s
查段选码
输出段选码
改变位选字
返 回


第九章 常用控制程序设计
利用 8155扩展实现的动态显示程序清单:
DISP,MOV A,#03H ; 8155初始化数据
MOV DPTR,#7F00H ; 8155命令 /状态寄存器地址
MOVX @DPTR,A ; 设置显示数据首址
MOV R7,#7FH ; 设置位选字
MOV A,R7
DS1,MOV DPTR,#7F02H ; 指向 PB口
MOVX @DPTR,A ; 送位选字
DEC DPTR ; 指向 PA口
MOV A,@R0 ; 读显示数据
ADD A,#0DH; #0DH为从查表指令到段选码的首址
第九章 常用控制程序设计
MOVC A,@A+PC ; 查段选码
MOVX @DPTR,A ; 送段选码至 PA口
ACALLDELAY1 ; 延时 1毫秒
INC R0 ; 指向下一显示数据
MOV A,R7
JNB ACC.0,OVER ; 判断是否显示完 8位数据
RR A ; 未显示完, 改变位选字
MOV R7,A
AJMP DS1 ; 继续显示下一位
OVER,RET
DB
3FH,06H,5BH,4FH,06H,6DH,7DH,07H,7FH,6FH,77H,7CH,36
H,5EH,76H,71H
返回本节
第九章 常用控制程序设计
6.7 定时程序设计
6.7.1 软件定时程序
6.7.2 硬件定时程序
返回本章首页
第九章 常用控制程序设计
6.7.1 软件定时程序
双循环定时程序流程如图 6-33所示。
开 始
设置内循环次数
内循环
结束否?
设置外循环次数
空操作
外循环
结束否?
返 回




第九章 常用控制程序设计
如取 N=166( 0A6H), 上述简单软件定时程序的定时时间
就是 1ms,如果需要 250ms的定时时间, 则所需的外循环
的次数为 250(0FAH)。 程序如下:
DELAY250,MOV R6,#0FAH ; 置外循环次数
DELAY1,MOV R7,#0A6H ; 置内循环次数
NOP ; 空操作指令
D1,NOP
DJNZ R7,D1 ; 内循环未结束, 继续
DJNZ R6,DELAY1 ; 外循环未结束, 继续
RET
返回本节
第九章 常用控制程序设计
6.7.2 硬件定时程序
51系列单片机内部有两个 16位的可编程定时器 T0和 T1,
分别由 TH0,TL0和 TH1,TL1两个 8位计数器构成 。 T0和
T1的定时功能是通过对单片机内部计数脉冲的计数实现的 。
因为每个机器周期产生一个计数脉冲, 因此根据单片机的
晶振频率就可以计算出定时器的计数频率 。 这样, 如果确
定了计数值, 就能计算出定时时间, 而知道了定时时间也
可计算出计数器的预置值 。 定时器控制寄存器 ( TCON)
和工作方式控制寄存器 ( TMOD) 分别控制定时器的运行
和工作方式 。
第九章 常用控制程序设计
1,定时器简介
TMOD寄存器是控制定时器工作方式的 8位专用寄
存器 。 寄存器的高 4位定义 T1,低 4位定 T0。 各位的
具体定义如表 6-3所示 。
第九章 常用控制程序设计
2,硬件定时程序设计
例 6-5 设单片机的晶振频率为 6 MHz,利用 T0产
生周期为 500μs的等宽正方波脉冲, 通过 P1.7端口
输出 。
( 1)选择工作方式
( 2)计算预置计数值
( 3) TMOD寄存器初始化
( 4)程序设计
第九章 常用控制程序设计
程序设计
主程序:
MOV TMOD,#02H ; T0工作方式 2
MOV TH0,#83H ; 设置计数初始值
MOV TL0,#83H ; 保存计数初始值
SETB EA ; 开中断
SETB ET0 ; T0中断允许
SETB TR0 ; 启动定时
WAIT,AJMP WAIT ; 等待中断
中断服务程序:
CPL P1.7 ; 方波输出
RETI ; 中断返回
第九章 常用控制程序设计
例 6-6 设计一个能够自动记录秒, 分和小时的计时时钟 。
程序设计分为初始化和中断服务程序两部分 。
初始化程序清单:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INT0 ; 设置外部中断 0中断入口地址
ORG 000BH
第九章 常用控制程序设计
AJMP TIME0 ; 设置 T0中断入口地址
ORG 001BH
AJMP COUN1; 设置 T1中断入口地址
MAIN,MOV SEC,#00H ; 秒存储单元清 0
MOV MIN,#00H ; 分存储单元清 0
MOV HUR,#00H ; 小时存储单元清 0
MOV TMOD,#41H ; T1为计数方式, 定时器 0工作方式 1
MOV TH0,#17H ; 设置 T0的计数初值
MOV TL0,#0B6H
MOV TH1,#0FFH ; 设置 T1的计数初值
MOV TL1,#0F7H
第九章 常用控制程序设计
SETB EA ; 开中断
SETB IT0 ; 外中断 0中断请求信号为脉冲方式
SETB ET1 ; T1中断允许
SETB ET0 ; T0中断允许
SETB EX0 ; 外中断 0中断允许
SETB TR0 ; 启动定时器 0
SETB TR1 ; 启动计数器 1
HERE,AJMP HERE; 等待中断
第九章 常用控制程序设计
中断服务程序分以下几部分。
定时器 T0定时中断程序清单:
TIME0,CLR EA ; 关中断
SETB P3.5 ; 发计数脉冲
NOP
CLR P3.5
NOP
MOV TH0,#17H ; 加载 T0计数值
MOV TL0,#0B6H
SETB EA ; 开中断
RETI ; 中断返回
第九章 常用控制程序设计
计数器 T1计数中断程序清单:
COUN1,CLR EA ; 关中断
SETB P3.2 ; 发送脉冲, 通知 1秒计时到
NOP
CLR P3.2
NOP
MOV TH1,#0FFH ; 加载 T1计数值
MOV TL1,#0F7H
SETB EA
RETI
第九章 常用控制程序设计
外部中断 0中断程序流程如图 6-34所示 。
开 始
秒+ 1
到6 0 秒否?
关中断
分+ 1
秒存储单元清零
显示秒
到6 0 分否?
分+ 1
分存储单元清零
显示分
到2 4 小
时否?
小时单元清零
显示小时
返 回






第九章 常用控制程序设计
外部中断 0中断程序清单:
INT0,CLR EA ; 关中断
INC SEC ; 秒存储单元加 1
MOV A,SEC
CJNE A,#3CH,S_SHOW ; 判断是否到 60秒
INC MIN ; 60秒到, 分存储单元加 1
MOV SEC,#00H ; 秒存储单元清 0
S_SHOW,ACALLHTOBCD ; 调用 16进制数转化为 BCD
码子程序
ACALLDISP ; 调用显示子程序, 显示秒
MOV A,MIN
CJNE A,#3CH,M_SHOW ; 判断是否到 60分
第九章 常用控制程序设计
INC HUR ; 60分到, 小时存储单元加 1
MOV MIN,#00H ; 小时存储单元清 0
M_SHOW,ACALLHTOBCD ; 调用 16进制数转化为 BCD
码子程序
ACALLDISP ; 调用显示子程序, 显示分
MOV A,HUR
CJNE A,#18H,H_SHOW ; 判断是否到 24小时
MOV HUR,#00H ; 24小时到, 小时存储单元清 0
H_SHOW,ACALLHTOBCD ; 调用 16进制数转化为 BCD
码子程序
ACALLDISP ; 调用显示子程序, 显示小时
SETB EA ; 开中断
RETI ; 中断返回
返回本节
第九章 常用控制程序设计
6.8 键盘控制程序设计
6.8.1 非编码键盘的扫描程序设计
6.8.2 编码键盘
返回本章首页
第九章 常用控制程序设计
6.8.1 非编码键盘的扫描程序设计
下面以通过 8155扩展 I/O口组成的 4× 8非编
码键盘为例介绍行列式键盘工作原理及扫描
程序设计 。
通过 8155扩展 I/O口组成的 4× 8非编码键盘
如图 6-35所示 。
第九章 常用控制程序设计
.
.
.
.
..
..
.
..
..
..
.,
.
.
.
..
..
.
..
..
..
.,
.
.
.
..
..
.
..
..
..
.,
.
.
.
..
..
.
..
.,
..
.
I N T 0
P 0.0
P 0.7
P 0.6
P 0.5
P 0.4
P 0.3
P 0.2
P 0.1
AD 0
AD 7
AD 6
AD 5
AD 4
AD 3
AD 2
AD 1
PA 0
PA 7
PA 6
PA 5
PA 4
PA 3
PA 2
PA 1
PC 0
PC 3
PC 2
PC 1
7 4 L S 2 1
+ 5 V
4 ×8 键盘
8 1 5 58 0 3 1
.
.
.
.
.
.
.
图 6-35 8155扩展 I/O口组成的 4× 8非编码键盘
第九章 常用控制程序设计
1,键盘工作原理
确定按下的键的键号:为了方便键处理程序的设计, 一般采用
依次排列键值的方法, 以保证键值和键号一致 。 比如, 根据行
列式键盘工作原理, 图 6-35中的 32个键的键值如下 ( X为任意
值 ),
FEXE FDXE FBXE F7XE EFXE DFXE BFXE 7FXE
FEXD FDXD FBXD F7XD EFXD DFXD BFXD 7FXD
FEXB FDXB FBXB F7XB EFXB DFXB BFXB 7FXB
FEX7 FDX7 FBX7 F7X7 EFX7 DFX7 BFX7 7FX7
第九章 常用控制程序设计
2,键盘扫描程序设计
较常用的键盘扫描的工作方式有编程扫描方式和
中断扫描方式两种 。
( 1) 编程扫描方式
设在主程序中已将 8155的 PA口为基本输出口, PC
口为基本输入口 。
键盘扫描程序流程框图如图 6-36所示 。
第九章 常用控制程序设计
图 6-36 键盘扫描程序流程框图
开 始
有键闭合否?
调用子程序
延时6 m S
调用子程序
延时1 2 m S
有键闭合否?
判断闭合键号 栈
输入键号 A
闭合键释放否?
返 回






第九章 常用控制程序设计
键盘扫描子程序清单:
KEY1,ACALLKS1 ; 有无键按下子程序
JNZ LK1 ; 有键按下, 转去抖延时
AJMP KEY1 ; 无键按下, 继续扫描
LK1,ACALLDELA12 ; 12ms延时程序调用
ACALLKS1 ; 判断键是否真正按下
JNZ LK2 ; 有键按下, 转逐列扫描
AJMP KEY1 ; 无键按下, 继续扫描
LK2,MOV R2,#0FEH ; 设置首列扫描字
MOV R4,#00H ; 保存首列号
LK4,MOV DPTR,#7F01H ; 列扫描字送至 PA口
第九章 常用控制程序设计
MOV A,R2
MOVX @DPTR,A
INC DPTR ; 指向 PC口
INC DPTR
MOVX A,@DPTR ; 读入行状态
JB ACC.0,LONE ; 第 0行无键按下, 转 LONE
MOV A,#00H ; 有键按下, 设置行首键号
AJMP LKP ; 转求键号
LONE,JB ACC.1,LTWO ; 第 1行无键按下, 转 LTWO
MOV A,#08H ; 有键按下, 设置行首键号
AJMP LKP ; 转求键号
LTWO,JB ACC.2,LTHR ; 第 2行无键按下, 转 LTHR
MOV A,#10H ; 有键按下, 设置行首键?
AJMP LKP ; 转求键号
第九章 常用控制程序设计
LTHR,JB ACC.3,NEXT ; 第 3行无键按下, 查下一列
MOV A,#18H ; 有键按下, 设置行首键
LKP,ADD A,R4 ; 求键号, 键号 =行首键号 +列号
PUSH ACC ; 保护键号
LK3,ACALL KS1 ; 等待键释放
JNZ LK3 ; 键未释放, 继续等待
POP ACC ; 键释放, 键号送 A
AJMP OVER ; 键扫描结束
NEXT,INC R4 ; 列号加 1,指向下一列
MOV A,R2 ; 判断 8列扫描完否
JNB ACC.7,KND ; 8列扫描完, 继续
RL A ; 扫描字左移一位
MOV R2,A ; 送扫描字
AJMP LK4 ; 转下一列扫描
第九章 常用控制程序设计
KND,AJMP KEY1
OVER,RET ; 键扫描结束
KS1,MOV DPTR,#7F01H ; 指向 PA口
MOV A,#00H ; 设置扫描字
MOVX @DPTR,A ; 扫描字送 PA口
INC DPTR ; 指向 PC口
INC DPTR
MOVX A,@DPTR ; 读入 PC口状态
CPL ; 以高电平表示有键按下
ANL A,#0FH; 屏蔽高 4位
RET
第九章 常用控制程序设计
( 2) 中断扫描工作方式
图 6-37 中断扫描方式键盘接口
返回本节
.
.
4 ×4 键盘
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
+ 5 V
8 0 3 1
I N T 1
P 1.0
P 1.7
P 1.6
P 1.5
P 1.3
P 1.2
P 1.1
P 1.4
5, 1 K ×4
第九章 常用控制程序设计
6.8.2 编码键盘
8276和 51系列的单片机的连接非常简单, 其接口
电路的一般连接方法如图 6-38所示 。
图 6-38 通过 8276扩展的键盘接口电路
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
P 0.0 0.7 DB 0 7
RL 0
RL 7
RL 6
RL 5
RL 4
RL 3
RL 2
RL 1
WR
RD
WR
RD
P 2,7 CS
P 2,6 A 0
~ ~
A L E / P C L K
SL 0
SL 2
SL 1
A
C
B
Y 0
Y 1
Y 2
Y 3
Y 4
Y 5
Y 6
Y 7
8 ×8 键盘
8 0 3 1
8 2 7 9
S H I F T
C N T L / S.
第九章 常用控制程序设计
当有键按下
时, 8276内部由硬件自动生成一个与之相应的代
码, 编码的格式如表 6-4所示 。
表 (6-4 ) 编码格式表
第九章 常用控制程序设计
图 6-38中 8× 8键盘的键值如表 6-5所示。
返回本节
表 (6-5 ) 8× 8键盘键值表
第九章 常用控制程序设计
6.6 抗干扰技术
6.6.1 数字信号的输入输出技术
6.6.2 指令冗余技术
6.6.3 软件陷阱技术
6.6.4 程序运行监视系统
返回本章首页
第九章 常用控制程序设计
6.6.1 数字信号的输入输出技术
由于干扰信号的持续时间非常短, 因此在采集数
字信号时, 可重复采集, 直到连续两次或两次以
上的采样结果完全相同, 才视输入信号有效 。 如
果多次采样的结果总是变化不定, 则视为采样无
效 。 在满足实时性要求的前提下, 如果在相邻的
信号采集过程之间插入延时程序, 就可以抑制较
宽的脉冲, 抗干扰的效果会更好 。
返回本节
第九章 常用控制程序设计
6.6.2 指令冗余技术
由于 51系列单片机指令长度不超过 3个字节, 当
PC值改变后, 可能出现三种情况:
( 1) PC值指向一单字节指令, 程序自动纳入正
轨;
( 2) PC值指向一双字节指令, 由于双字节指令
有操作数, 则有可能将操作数当成操作码执行;
( 3) PC值指向一三字节指令, 由于三字节指令
有两个操作数, 出错的几率更大 。
返回本节
第九章 常用控制程序设计
6.6.3 软件陷阱技术
下面以两数比较的程序演示如何在程序区设置软件陷阱 。
CLR CY ; 进位标志清零
MOV A,M
SUBB A,N ; M-N
JZ MNEQU ; 转 M=N处理程序
JC LESS ; 转 M<N处理程序
BIG,…
… ; M>N处理程序
AJMP BPIONT ; 转至断裂点
第九章 常用控制程序设计
NOP ; 设置陷阱
NOP
LJMP ERROR
MNEQU,… ; M=N处理程序

AJMP BPIONT
NOP
NOP
LJMP ERROR
LESS,… ; M<N处理程序

第九章 常用控制程序设计
AJMP BPIONT
NOP
NOP
LJMP ERROR
BPIONT,RET ; 断裂点
NOP ; 陷阱
NOP
LJMP ERR
返回本节
第九章 常用控制程序设计
6.6.4 程序运行监视系统
图 6-36是一种简单实用的程序运行监视系统 。
8 0 3 1
P 1.4
R E S E T
R 1
R 2
7 4 L S 1 4
C
V C C
T R -
T R +
R
Q
1
2
.
..
C C 4 0 9 8
第九章 常用控制程序设计
下面的程序运行监视程序选用 T0进行系统监视, 定时时间
为 16ms。
MOV TMOD,#01H ; 设置 T0为定时器
SEB ET0 ; 允许 T0中断
SETB PT0 ; 设置 T0中断为高优先级
MOV TH0,#0E0H ; 定时时间为 16ms(6MHz晶振 )
SETB TR0 ; 启动定时器
SETB EA ; 开中断
返回本节
第九章 常用控制程序设计
6.10 电机控制程序设计
6.10.1 中小功率直流电机调速原理
6.10.2 开环脉冲调速系统
6.10.3 带方向控制的脉冲调速系统
返回本章首页
第九章 常用控制程序设计
6.10.1 中小功率直流电机调速原理
设电机在恒定电压下的转速为 Vmax,控制信号的
占空比 D= t /τ( 其中 t代表通电时间, τ代表脉冲周
期 ), 则电机的的转速和控制信号的关系可用如
下公式表示:
V=Vmax× D ( 6-10)
返回本节
第九章 常用控制程序设计
6.10.2 开环脉冲调速系统
1,开环脉冲调速系统原理
开环脉冲调速系统的原理如图 6-40所示 。
第九章 常用控制程序设计
图 6-41是一个单片机控制的开环脉冲调速系统
示意图。
+ 5 V
V C C
PA 1
PA 7
PA 6
PA 5
PA 4
PA 3
PA 2
PA 0
PB 7
PC 5
P 0.0 0.7
~
AD 0 7
~
GD P W M 电机8 0 3 1
8 1 5 5
第九章 常用控制程序设计
2,开环脉冲调速系统程
序设计
脉冲宽度的调制可通过
软件延时法实现 。
设定图 6-41中 8155的地
址为 7 F00H,PA,PC
口为基本输入口, PB
口为基本输出口 。 则调
速系统的软件延时法程
序流程图如图 6-42所示 。
开 始
启动电机否?
8 15 5 初始化
启动电机
读开关数
停止运行否?
延时1
延时2
关断电机




返 回
取正转模型起始地址
检测控制标志位
第九章 常用控制程序设计
软件延时法的程序清单:
MOV DPTR,#7F00H ; 设置 8155命令寄存器地址
MOV A,#06H
MOVX @DPTR,A ; 设置 PA,PB,PC口的工作方式
MOV DPTR,#7F03H ; 指向 PC口
CHECK,MOVX A,@DPTR ; 检测是否启动电机
JNB ACC.5,CHECK ; 继续检测
TURN,MOV DPTR,#7F01H ; 设置 PA口地址
MOVX A,@DPTR ; 读开关数 N
第九章 常用控制程序设计
MOV B,A ; 保存 N
INC DPTR ; 指向 PB口
MOV A,#80H ; 启动电机
MOV A,B ; 延时 N个单位时间
MOV R7,A
DELA1,ACALL DELAY
DJNZ R7,DELA1
MOV A,#00H ; 输出停止脉冲
第九章 常用控制程序设计
MOVX @DPTR,A
MOV A,B
CPL A ; 求
MOV R7,A ; 延时个单位时间
DELA2,ACALL DELAY
DJNZ R7,DELA2
INC DPTR ; 指向 PC口
MOVX A,@DPTR ; 检测是否停止运行
JB ACC.5 TURN ; 继续运行, 转 TURN
OFF,RET ; 停止运行
返回本节
第九章 常用控制程序设计
6.10.3 带方向控制的脉冲调速系统
在很多场合下,不仅要求电机能够正向旋转,而
且还能反向旋转。电机旋转方向控制原理图如图
6-43所示。
+ A
+
-
DC
S 1
S 4
S 2
S 3
M O T O R S E R V O
.,-
第九章 常用控制程序设计
由图 6-43可以看出, 当开关 S1和 S4闭合时, 电机正向旋转;
开关 S2和 S3闭合时, 电机反向旋转;开关 S3和 S4闭合时,
电机绕组被短路处于刹车状态;所有开关都打开时, 电机
处于自由滑行状态 。 电机的工作状态真值表如表 6-6所示 。
表 6-6 电机工作状态真值表
第九章 常用控制程序设计
双向电机控制系统原理图如图 6-44所示 。
+ A
M O T O R
..
-
I G B T
I G B TI G B T
I G B T




P 1.0
P 1.2
P 1.3
P 1.1
+ 2 8 V
第九章 常用控制程序设计
双向电机的脉冲调
速控制, 首先要判
断电机的旋转方向,
根据要求的方向输
出相应的控制代码,
然后再进行脉冲宽
度调速控制 。 控制
程序流程图如图 6-
45所示 。
返回本节
开 始
取运行状态
控制代码
正转否?
取正转模型
起始地址
取反转模型
起始地址
反转否?
刹车否?
取刹车代码
输出刹车代码
输出控制代码
延时1
输出滑行控制代码
延时2
返 回






第九章 常用控制程序设计
6.11 步进电机控制
6.11.1 步进电机的工作原理
6.11.2 步进电机控制系统
6.11.3 步进电机控制程序的设计
返回本章首页
第九章 常用控制程序设计
6.11.1 步进电机的工作原理
步进电机的结构原理图如图 6-46所示。
A
A B
B
C C
`
`
`
返回本节
第九章 常用控制程序设计
6.11.2 步进电机控制系统
典型的步进电机控制系统如图 6-47所示 。
脉冲
发生器
脉冲
分配器
功率
放大器
步进
电机
负载
方向
控制
第九章 常用控制程序设计
如果用软件代替脉冲发生器和脉冲分配器,就可
以根据系统需要通过编程的方法在一定的范围之
内任意设定步进电机的转速、旋转角度、转动次
数和控制步进电机的运行状态。利用单片机控制
步进电机可以大大简化控制电路,降低成本,提
高系统的可靠性和灵活性。典型的微机控制步进
电机的系统原理框图如图 6-48所示。
CPU 接口 驱动器 步进电机 负载
第九章 常用控制程序设计
利用微机现对步进电机的控
制, 必须解决以下两个
问题:
1,脉冲序列的形成
2,步进电机旋转方向控制
在微机控制系统中, 延时可
通过软件或定时器实现 。
利用软件形成脉冲序列
的程序流程图如图 6-46
所示 。
第九章 常用控制程序设计
利用软件形成脉冲序列的程序清单:
PULSE_S,MOV R7,#NUM ; 设定脉冲个数
PUSH A ; 保护现场
PUSH PSW
LOOP,SETB P1.0 ; 输出高电平
ACALLDELAY1 ; 延时
CLR P1.0 ; 输出低电平
ACALLDELAY2 ; 延时
DJNZ R7,LOOP ; R7≠0,继续输出脉冲
POP PSW ; 恢复现场
POP A
RET
第九章 常用控制程序设计
利用定时器形成脉冲序列的程序流程如图 6-50所示。
开 始
设值高电平延时
计数初值
设置脉冲个数
输出高电平
启动计时
允许定时器中断
开中断
设置定时器
工作方式
中断等待
开 始
输出高电平否?
加载低电平
延时计数初值
禁止定时器中断
输出低电平
输出信号反相
加载高电平
延时计数初值
脉冲数够否?
返 回




( a) 主程序 ( b) 定时器中断服务程序
第九章 常用控制程序设计
2,步进电机旋转方向控制
( 1) 三相单三拍方式:正向旋转,通电顺序为
A→B→C→A ;
反向旋转,通电顺序为 A→C→B→A 。
( 2) 三相双三拍方式:正向旋转,通电顺序为
AB→BC→CA→AB ;
反向旋转,通电顺序为 AB→CA→BC→AB 。
( 3) 三相六拍方式,正向旋转,通电顺序为
A→AB→B→BC→C→CA→A ;
反向旋转,通电顺序为 →CA→C→BC→B→AB→A 。
第九章 常用控制程序设计
步进电机的旋转方向控制方法:
( 1) 用单片机的一位输出口控制步进电机的一相绕组,
例如, 可以用 P1.0,P1.1,P1.2分别控制 A相, B相和 C相
绕组 。
( 2) 根据步进电机的类型和控制方式找出相应的控制模
型 。
( 3) 按照控制方式规定的顺序向步进电机发送脉冲序列,
即可控制步进电机的旋转方向 。
上述三种控制方式的数序模型如表 6-7,表 6-8和表 6-6所示 。
第九章 常用控制程序设计
表 6-7 三相单三拍控制模型
表 6-8 三相双三拍控制模型
第九章 常用控制程序设计
返回本节
表 6-6 三相六拍控制模型
第九章 常用控制程序设计
6.11.3 步进电机控制程序的设计
三相单三拍控制
程序流程图如图
6-51所示。
第九章 常用控制程序设计
三相单三拍控制程序清单:
T_CON,PUSH A ; 保护现场
PUSH PSW
MOV R7,#N ; 设定控制步数
JNB FLAG,LEFT ; 判断旋转方向
RIGHT,MOV R0,RM ; 正转模型起始地址
AJMP ROTATE
LEFT,MOV R0,LM
ROTATE,MOV A,@R0 ; 取第一拍控制模型
MOV P1,A ; 输出第一拍控制模型
ACALLDELAY1 ; 延时
第九章 常用控制程序设计
INC R0
MOV A,@R0 ; 取第二拍控制模型
MOV P1,A ; 输出第二拍控制模型
ACALLDELAY1 ; 延时
INC R0
MOV A,@R0 ; 取第三拍控制模型
MOV P1,A ; 输出第三拍控制模型
ACALLDELAY1 ; 延时
DJNZ R7,ROTATE ; 未走完要求的步数, 继续
POP PSW ; 恢复现场
POP A
RET ; 返回
第九章 常用控制程序设计
三相六拍控制程序流程图如图 6-52所示 。
开 始
设置定时器计数初值
正转否?
设置控制步数
取正转模型起始地址
中断等待
启动计时
允许定时器中断
开中断
设置定时器工作方式
取反转模型起始地址


开 始
取控制模型
是控制模型
结束标志否?
步数够否?
输出控制模型
保护现场
指向下一控制模型
恢复模型起始地址
恢复现场
禁止定时器中断
关中断




返 回
( a) 主程序流程图 ( b) 定时器中断服务程序
第九章 常用控制程序设计
三相六拍控制程序中断服务程序清单,
INTT0,PUSH A ; 保护现场
PUSH PSW
MOV A,@R0 ; 取控制模型
MOV P1,A ; 输出控制模型
INC R0 ; 指向下一控制模型
MOV A,#00H ; 判断是否控制模型结束标志
XRL A,@R0
JNZ NEXT ; 不是, 继续
MOV A,R0 ; 是, 恢复控制模型起始地址
CLR C
SUBB A,#06H
第九章 常用控制程序设计
MOV R0,A
NEXT,DJNZ R7,RETU ; 未走完规定步数, 继续
CLR ET1 ; 走完规定步数, 禁止 T1中断
CLR EA ; 关中断
RETU,POP PSW ; 恢复现场
POP A
RETI ; 中断返回
返回本节
第九章 常用控制程序设计
THANK YOU VERY MUCH !
本章到此结束,
谢谢您的光临!
返回本章首页结束放映