单片机
程序设计例题
主讲:钱锐
一、基本结构程序
例 1 假定在外部 RAM中有 ST1,ST2和 ST3共 3个
连续单元, 其中 ST1,ST2单元中分别存放着两
个 8位无符号数, 要求找出其中的大数并存入
ST3单元 。
分析,两个无符号数的大小比较可利用两
数相减是否有借位来判断, 流程图和程序如下
所示,
例 1参考程序如下,
START,CLR C
MOV DPTR,#ST1
MOVX A,@ DPTR
MOV R7,A
INC DPTR
MOVX A,@ DPTR
SUBB A,R7
JC BIG1
MOVX A,@ DPTR
SJMP BIG2
BIG1,XCH A,R7
BIG2,INC DPTR
MOVX @ DPTR,A
SJMP $
例 2 计算 50个 8位二进制数(单字节)之和。
要求,50个数存放在 30H开头的内部 RAM中,
和放在 R6R7中 。
分析,采用 DJNZ循环体的流程框图如下页所
示, 在参考程序中, R0为数据地址指针, R2为
减法循环计数器 。
需要指出的是, 在使用 DJNZ控制时, 循环计
数器初值不能为 0,当为 0时, 第一次进入循环
执行到 DJNZ时, 减 1使 R2变为 FFH,循环次数成
了 256,显然不合题意 。
例 2流程, 程序如下,
START,MOV R6,#0
MOV R7,#0
MOV R2,#50
MOV R0,#30H
LOOP,MOV A,R7
ADD A,@R0
MOV R7,A
CLR A
ADDC A,R6
MOV R6,A
INC R0
DJNZ R2,LOOP
SJMP $
例 3 设计 1秒延时子程序, 假设 fosc=12MHz。
分析,软件延时与指令的执行时间关系密切,
在使用 12MHz晶振时, 一个机器周期的时间为 1us,
执行一条 DJNZ指令的时间为 2us,我们可以采用
三重循环的方法写出延时 1秒的子程序
流程, 程序如下图所示,
例 3的流程, 程序如下
DELAY,MOV R7,#10;
DL3,MOV R6,#200;
DL2,MOV R5,#250;
DL1,DJNZ R5,DL1;
DJNZ R6,DL2;
DJNZ R7,DL3;
RET
例 4 把内部 RAM中从 ST1地址开始存放的数据传
送到以 ST2开始的存储区中,数据块长度未知,
但已知数据块的最后一个字节内容为 00H,而其
它字节均不为 0。并设源地址与目的地址空间不
重复。
分析,显然,我们可以利用判断每次传送的
内容是否为 0 这一条件来控制循环。也可用
CJNE来比较与 0是否相等设计。
利用判 A转移控制的循环流程图如下图所示。
例 4参考程序如下,
START,MOV R0,#ST1
MOV R1,#ST2
LOOP,MOV A,@R0
JZ ENT
MOV @R1,A
INC R0
INC R1
SJMP LOOP
ENT,RET
二、控制流程设计
单片机的控制系统中, 为了实现系统的自动控制,
必须将控制现场的信息输入到单片机, 经过计算机的处
理以后以被控对象能够接受的形式输出到执行机构, 实
现对现场的控制 。
例 5 电机的简单起停控制;其框图如下页图 a 所示
1) 分析,简单的电机起动停止控制, 其控制的示意
图及 I/O分配如图 b 所示 。
输入信号,启动按钮 SB1,停止按钮 SB2
输出信号,继电器 KA
假定:按下按钮, 相应的接口信号为低电平 ( P1.1=0) 时;
若,程序使 P1.3=1,即 KA = 1;
则,电机启动 。
2) 按照上述的控制思路, 我们可以方便的画出流程
图, 如下图所示 。
ORG 1000H
STR,MOV P1,#00000110B
WT1,JB P1.1,WT1 ; 启动?
SETB P1.3 ; 电机启动
WT2,JB P1.2,WT2 ; 停止?
CLR P1.3 ; 电机停止
SJMP WT1
END
谢谢各位!