.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 |