单片机 程序设计例题 主讲:钱锐
单片机 程序设计例题 主讲:钱锐
基本结构程序 例1假定在外部RAM中有ST1、ST2和ST3共3个 连续单元,其中ST1、ST2单元中分别存放着两 个8位无符号数,要求找出其中的大数并存入 ST3单元。 分析:两个无符号数的大小比较可利用两 数相减是否有借位来判断,流程图和程序如下 所示:
一、基本结构程序 例1 假定在外部RAM中有ST1、ST2和ST3共3个 连续单元,其中ST1、ST2单元中分别存放着两 个8位无符号数,要求找出其中的大数并存入 ST3单元。 分析:两个无符号数的大小比较可利用两 数相减是否有借位来判断,流程图和程序如下 所示:
例1参考程序如下 (开焰) START CLR C PTR←#T MOV DPTR, #STI A←(mPTR) A DPTR R7←) MOV R7, A DFTR←PTR)+1 INC DPTR A←(mPTR DPTR A←(AJ)-0R7)=CY SUBB A R7 JC BIGI A DPTR A(R7风←(①PT SJMP BIG2 BIGI: XCH A R7 nPTR←mPTR)+1 BIG2: INC DPTR TR〕)←A DPTR,A SJMP 结束
例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个数存放在3OH开头的内部RAM中, 和放在R6R7中。 分析:采用DJM循环体的流程框图如下页所 示,在参考程序中,RO为数据地址指针,R2为 减法循环计数器 需要指出的是,在使用DNZ控制时,循环计 数器初值不能为0,当为0时,第一次进入循环 执行到DN时,减1使R2变为FFH,循环次数成 了256,显然不合题意
例2 计算50个8位二进制数(单字节)之和。 要求:50个数存放在30H开头的内部RAM中, 和放在R6R7中。 分析:采用DJNZ循环体的流程框图如下页所 示,在参考程序中,R0为数据地址指针,R2为 减法循环计数器。 需要指出的是,在使用DJNZ控制时,循环计 数器初值不能为0,当为0时,第一次进入循环 执行到DJNZ时,减1使R2变为FFH,循环次数成 了256,显然不合题意
T点RT 例2流程、程序如下: START: MOV R6, #0 F、R7—#囗 MOV R7,#0 #5 MOV R2,#50 F SOH MOV R0,#30H LOOP: MOV A, R7 F7+〔A)+〔〔FD〕 ADD A,@R0 MOV R A F6←F)+CY CLR A ADDC A r6 ←(RD〕+1 MOV R6. A INC RO -1≠ DJNZ R2. LOOP SJMP ELI
例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 分析:软件延时与指令的执行时间关系密切, 在使用12Mz晶振时,一个机器周期的时间为1us 执行一条DN指令的时间为2us,我们可以采用 重循环的方法写出延时1秒的子程序 流程、程序如下图所示
例3 设计1秒延时子程序,假设fosc=12MHz。 分析:软件延时与指令的执行时间关系密切, 在使用12MHz晶振时,一个机器周期的时间为1us, 执行一条DJNZ指令的时间为2us,我们可以采用 三重循环的方法写出延时1秒的子程序 流程、程序如下图所示:
开好 例3的流程、程序如下 RT—#10 DELAY MOV R7,#10 R6+#200 DL3 MOV R6,#200 DL2 MOV R5,#250; F—#5 DL1 DJNZ R5, DLl DJNZ R6, DL2 F5-1x0? DJNZ R7, DL3 F-10? RET R7-1≠0? 返回
例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 把内部RAM中从ST1地址开始存放的数据传 送到以ST2开始的存储区中,数据块长度未知, 但已知数据块的最后一个字节内容为00H,而其 它字节均不为0。并设源地址与目的地址空间不 重复。 分析:显然,我们可以利用判断每次传送的 内容是否为 0 这一条件来控制循环。也可用 CJNE来比较与0是否相等设计。 利用判A转移控制的循环流程图如下图所示
例4参考程序如下: 开始) START: MOV RO, #STI MOV RI, #ST2 R1←# LOOP: MOV A, @RO ENT A+-( MOV RI,A INC RO = INC RI JMP LOOP 〔丸 ENT: RET
例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)分析:简单的电机起动停止控制,其控制的示意 图及ⅣO分配如图b所示。 输入信号:启动按钮SB1、停止按钮SB2 输出信号:继电器KA
二、控制流程设计 单片机的控制系统中,为了实现系统的自动控制, 必须将控制现场的信息输入到单片机,经过计算机的处 理以后以被控对象能够接受的形式输出到执行机构,实 现对现场的控制。 例 5 电机的简单起停控制;其框图如下页图 a 所示 1)分析:简单的电机起动停止控制,其控制的示意 图及I/O分配如图 b 所示。 输入信号:启动按钮SB1、停止按钮SB2 输出信号:继电器KA