blink.a51 内容如下:
- ; 外设端口切换寄存器 2 的地址
- P_SW2 DATA 0BAH
- ; 端口模式配置寄存器的地址
- P1M0 DATA 092H
- P1M1 DATA 091H
- ORG 0000H ; 设置程序的起始地址为 0000H,即程序的入口点
- LJMP MAIN ; 通过长跳转指令 (LJMP) 跳转到 MAIN 主程序的地址
- ORG 0100H ; 设置程序的重定位地址为 0100H,用于存放中断向量等信息
- ; 主程序:
- MAIN:
- MOV SP, #5FH ; 设置堆栈指针
-
- ORL P_SW2, #80H ; 使能访问 XFR
-
- MOV P1M0, #00H ; 清空 P1M0 寄存器
- MOV P1M1, #00H ; 清空 P1M1 寄存器
-
- MOV P1M0, #0FFH ;设置 P1 为推挽输出模式。#0FFH 中的 0 不能省略
- MOV P1M1, #00H
-
- LJMP LOOP ; 跳转到循环体
- ; 循环体
- LOOP:
- MOV P1, #0FFH ; 将 0xFF 赋值给 P1 寄存器,即将端口 P1 的所有引脚设为高电平,熄灭小灯
- LCALL DELAY_1S ; 延时一段时间
- MOV P1, #00H ; 将 0 赋值给 P1 寄存器,即将端口 P1 的所有引脚设为低电平,点亮小灯
- LCALL DELAY_1S ; 延时一段时间
- AJMP LOOP ; 无条件跳转到循环体
- ; ====================延时1秒子程序====================
- DELAY_1S: ; 延时子程序,12MHz 晶振延时 1.002035 秒
- MOV R4, #10 ; 设置 R4 寄存器为 10,1 指令周期
-
- L3:
- MOV R2, #200 ; 设置 R2 寄存器为 200,1 指令周期
-
- L1:
- MOV R3, #249 ; 设置 R3 寄存器为 249,1 指令周期
- L2:
- DJNZ R3, L2 ; 2 指令周期
-
- DJNZ R2, L1 ; 2 指令周期
- DJNZ R4, L3 ; 2 指令周期
-
- RET ; 2 指令周期
- ; 循环体延时时间: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002032s
- ; 加上 LCALL 指令和第一条 MOV 指令以及最后一条 RET 指令算出来整个函数的时间为 1.002035s
- ; =====================================================
- END
复制代码
Proteus 8 Professional 仿真结果如下图:
|