.include "8515def.inc" ; 器件配制文件, 本实验使用AT90S8515
.def dt = r22 ; 定义dt等于r22
.org $000 ; 程序首地址
rjmp reset4 ; 跳过中断区
.org $010 ; 主程序首地址,注意,不同器件的中断地址范围是不同的!
reset4:
ldi r17,$02 ;置堆栈指针,AT90S8515的RAM最大地址为$025F, 设堆栈底为$025F
ldi r16,$5f
out sph,r17 ; 高位堆栈sph=$02
out spl,r16 ; 低位堆栈spl=$5f
shiyan4:
ldi r17,$ff
out ddrb,r17 ; pb口方向寄存器设置为输出,1为输出
out portb,r17 ; 设pb口内部上拉
out ddrd,r17 ; pd口方向寄存器设置为输出,1为输出
out portd,r17 ; 设pd口内部上拉
start3: ; 设置舵机摆动周期常数, 即调节节拍常数
LDI R23,$11
LDI R25,$11
;R23=R25=$50摆动周期1S; 如=$30摆动周期0.5S
; 如=20-10摆动周期, 也可理解为调节拍范围
;$8强劲舞曲 ; $18 男儿当自强 ;$11 少年梦
; 可作自唱自演跳舞机器人设计用。
start6: ; 舵机向-60度方向移动
sbi $18,0 ; 置pb.0为1
rcall de10 ;1ms,-60度
cbi $18,0 ; 清pb.0为0
rcall de10 ;1ms,-60度
rcall de185 ;19ms
DEC R23 ;R23-1
CPI R23,$01 ;R23 与立即数$01比较
BRSH start6 ;大于等于则转移到, 小于顺序执行
rcall de200 ; 调用2ms延时程序
start60: ; 舵机向+60度方向移动
sbi $18,0 ; 置pb.0为1
rcall de20 ;2ms,+60度
cbi $18,0 ; 清pb.0为0
rcall de20 ; 调用2ms,+60度
rcall de18 ; 调用18ms
DEC R25 ;R25-1
CPI R25,$01 ; ;R25 与立即数$01比较
BRSH start60 ;大于等于则转移到, 小于顺序执行
rcall de200 ; 调用20ms
rjmp start3 ;循环检测
de10: ; 1ms延时子程序
ldi dt,21 ;1ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de15: ; 1.5ms延时子程序
ldi dt,26 ;1.5ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de20: ; 2ms延时子程序
ldi dt,28 ;2ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de18: ; 18ms延时子程序
ldi dt,63 ;18ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de185: ; 19ms延时子程序
ldi dt,64 ;18.8ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de19: ; 20ms延时子程序
ldi dt,65 ;19.6ms
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
de200: ;20ms延时子程序
ldi dt,50 ;2ms,DT=100-10无多大变化
rcall delay ; 调用通用延时子程序
ret ; 子程序返回
;延时时间对照表
;**********************************
;fos=8MHz
;dt time dt time dt time
;22 1ms 26 1.5ms 29 2ms
;51 10ms 63 18ms 64 18.8ms
;65 19.6ms 144 200ms 197 500ms
;249 1s
;**********************************
delay: ; 通用延时子程, 子程序2级嵌套
push dt ; 进栈,需2t
del1: push dt ; 进栈,需2t
del2: push dt ; 进栈,需2t
del3: dec dt ; dt-1,需1t
brne del3 ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
pop dt ; 出栈, 需2t
dec dt ; dt-1,需1t
brne del2 ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
pop dt ; 出栈, 需2t
dec dt ; dt-1,需1t
brne del1 ; 上条指令执行后Z=0转, Z=1顺执, 需1t/2t
pop dt ; 出栈, 需2t
ret ; 子程序返回, 需4t |