单片机编程:多重循环实现20ms延时子程序解析

需积分: 0 1 下载量 5 浏览量 更新于2024-08-25 收藏 175KB PPT 举报
"这篇资料主要介绍了单片机编程中的多重循环和一些基本的数据传送、读写外部存储器、查表、加法、十进制调整以及减法指令的应用实例。" 在单片机编程中,多重循环常用于实现精确的时间延迟。例如,在【标题】中的例子,为了创建20ms的延时子程序,采用了两重循环结构。首先,晶振频率为12MHz,意味着每个机器周期为1us。`DJNZ`指令执行时间为2us,因为它是双周期指令。由于单重循环内最大延时不能超过255x2us,因此采用两重循环,每层循环次数为100,即2usx100x100=20ms。具体代码如下: ```汇编 dl20ms: mov r4, #100 ; 设置外循环初值100 delay1: mov r3, #100 ; 设置内循环初值100 delay2: djnz r3, delay2 ; 延时2ux100=0.2ms djnz r4, delay1 ; 延时0.2mx100=20ms ret ; 子程序结束 ``` 数据传送是单片机编程的基础操作,包括将数值从一个内存位置移动到另一个,或从/到寄存器。例如: ```汇编 mov 30h, #50h ; 将数值50h存入地址30h mov R0, #60h ; 将数值60h存入R0寄存器 mov A, @R0 ; 将R0指向的地址(60h)的内容移动到累加器A mov R1, A ; 将A的内容移动到R1寄存器 mov P1, @R1 ; 将R1指向的地址的内容(假设为50h)移动到P1口 mov 40h, @R1 ; 同样将R1指向的地址的内容(50h)存入地址40h mov 60h, 30h ; 将数值30h存入地址60h mov P2, 60h ; 将地址60h的内容(30h)移动到P2口 mov P0, #6Ah ; 将数值6Ah直接存入P0口 ``` 读写外部存储器通常需要通过A寄存器作为中介。例如,读取外部RAM2000h单元的内容到P3口: ```汇编 MOVA, #0A5h ; 将数值0A5h加载到A寄存器 MOV DPTR, #2000h ; 设置DPTR为2000h地址 MOVX @DPTR, A ; 将A寄存器的内容写入DPTR指定的地址(2000h) SWAPA ; 交换A寄存器的高8位和低8位 MOVXA, @DPTR ; 读取DPTR指定地址的内容回A寄存器 MOV P3, A ; 将A寄存器的内容(即2000h处的内容)移动到P3口 ``` 查表操作常常利用DPTR作为基址寄存器。假设1000h~1009h存储了0~9的平方,可以这样查找A的平方: ```汇编 MOVA, #5 ; 将数值5加载到A寄存器 MOV DPTR, #1000h ; 设置DPTR为表的起始地址1000h MOVCA, @A+DPTR ; 查找A对应的表项(即5的平方) MOV P0, A ; 将查找到的值(25)移动到P0口 ``` 加法指令包括单字节加法和双字节加法。以下是一个双字节加法的例子,结果分别存入R6和R7: ```汇编 MOVA, #34h ; 取被加数低8位 ADDA, #0F8h ; 低8位相加 MOVR6, A ; 低8位结果存R6 MOVA, #12h ; 取被加数高8位 ADDCA, #0A6h ; 高8位相加,并考虑进位(CY) MOVR7, A ; 高8位结果存R7 ``` 十进制调整指令`DAA`用于在执行加法或带进位加法后,调整累加器A的内容以符合BCD码格式。 ```汇编 MOVA, #7 ; 加数 ADDA, #8 ; 被加数 ;(A)=7+8=0Fh DAA ; 十进制调整 ;(A)=15h,经过DAA调整 ``` 减法指令练习通常涉及带借位的减法,这里未给出具体示例,但其原理与加法类似,可以通过`SUBB`或`SBB`指令实现。 这些基础的单片机编程概念和指令在实际应用中至关重要,理解和掌握它们对于进行有效的单片机系统设计和开发是必不可少的。