MOV A,ANGLE
MOV B ,#19H
add a,#01h
mov 61H,a ;25个脉冲的整数倍
;光电编码器信号处理程序
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中断0入口
LJMP SUB0
ORG 000BH ;定时器0中断入口
LJMP SUB1
ORG 0013H ;外部中断1入口
LJMP SUB2
org 002bh ;定时器2中断入口
ljmp t2t1
org 00c0h
main:call Init_Device
mov wdtcn,#00deh
mov wdtcn,#0adh ;前面的外部中断重新配置
mov th0,#0ffh
mov tl0,#0ffh
setb tr0 ;启动计数器0开始工作
sjmp $ ;中断返回处
org 100h
;外部中断0引发的x方向记转数
sub0:inc 5eh ;记脉冲数,为后面的定角度做准备
mov a, 5eh
cjne a,61h,L0 ;如果超过25个整数倍就清0
Mov 5eh,#00H
setb 6ah ;置内部某位为1作为标志
l0:jnb p1.0,t0t ;判断P1.0为低电平则跳转
mov a,52h
add a,#01h ;高电平则为正转加1
mov 52h,a
mov a ,53h ;如果C=1则跳至高字节操作
addc a,#0
mov 53h,a
clr c ;清楚C标志
reti
t0t:mov a,52h
subb a,#01h ;为低电平则为反转-1
mov 52h,a
mov a,53h
subb a,#01
mov 53h,a
clr c
ret
;Y方向引发的记转数
sub1: inc 5fh
mov a, 5fh
cjne a,61h,L1
MOV 5fh,#00H
setb 6bh
L1:mov ie,#82h ;开放T0中断禁止其他中断
jnb p1.1,t1t
mov a,54h
add a,#01h
mov 54h,a
mov a,55h
addc a,#0
mov 55h,a
mov ie,#3fh ;恢复成初始值
clr c
reti
t1t: mov a,54h
subb a,#01h
mov 54h,a
mov a,55h
subb a,#0
mov 55h,a
mov ie,#3fh
clr c
mov ie,#3fh
reti
;Z方向引发的计转数
sub2:inc 60h
mov a,60h
cjne a,61h,L2
MOv 60h,#00H
setb 6ch
L2:mov ie,#84h
jnb p1.2,t2t
mov a,56h
add a,#01h
mov 56h,a
mov a,57h
addc a,#0
mov 57h,a
mov ie,#3fh
clr c
reti
t2t:mov a,56h
subb a,#01h
mov 56h,a
mov a,57h
subb a,#0
mov 57h,a
mov ie,#3fh
clr c
mov ie,#3fh
reti
;以下程序为地磁传感器接收程序,定时器1做波特率发生器,波特率为9600,采用内部时钟为16MHZ
setb tr1 ;启动定时器1做波特率发生器,注意同时也启动了串口1
setb ren
mov r7,#04h
trs:jnb ri,$ ;判断一帧是否接收完毕 ri为1时接收完毕
clr ri
mov a,sbuf0
mov 5ah,a
inc 5ah
djnz r7,trs
mov r7,#04h ;循环四次把数据发送至5A~5d四个单元
ret
;以下为串口1的接收程序,PC和单片机的接收协议为A0+WORKMOD+参数+A0一共四个字节
;单片机收到A0后把收到的第一个字节送至30H单元存储,再根据WORKMOD的数据判断参数是存至31H还是32H
;如果WOKMOD是0,则参数在VB中的设置是为FF不存,如果是1存至31H,如果是2存至32H
setb tr1
setb ren
mov r7,#04h
rec:jnb ri,$ ;判断一帧是否接收完
clr ri
mov a, sbuf1
subb a,#0ah
jNZ,rec ;如果不等于A0则循环接收,等于则向下执行
jnb ri,$
clr ri
mov a,sbuf1
mov 30h,a ;把第一个字节存至30H
jnb ri,$
clr ri
mov a ,30h
cjne a,#0,recnum1 ;不为0则跳转
ret ;为0则退出重新接收
recnum1: cjne a,#1,recnum2 ;不为1则跳转至方式2
mov a,sbuf1
mov 31h,a
ret
recnum12: mov a,sbuf1
mov 32h,a
ret
;以下程序为数据发送程序,共为三部分,第一部分为定时发送,
;第二部分为定角度发送,第三部分为实时发送,它们的选择是由上位机发送过来的workmod的值判定的,约定为0为实时发送,1为
;定时,2为定角度
;定时发送为定时1ms的mscnt倍,实现的是一个mscnt倍1ms循环
certime:mov r1,50h ;起始地址
mov r2,0eh ;一次发送14个字节
setb tr2
sjmp $
t2t1: push 31H
mov a,31H
dec a
jz sent
reti
sent: mov a,@r1
mov sbuf1,a
jnb ti,$
clr ti
inc r1
djnz r2 ,sent
mov r2,#0eh
pop 31H
mov r2,#0eh
mov a,30h
cjne a,#0,choosemod3
sjmp now
choosemod3:mov a,30h
cjne a,#2,cerangle
reti
;定角度发送实现的是对1.2°的angle倍,实现1.2°的angle次循环,原理同上,这里的1.2°是以光电编码器为基准,而且1.2°的
;时候正好是25个脉冲 ,不过缺点是最多只能5°,如果需要超过5°的定角度发送需要扩展
cerangle: jb 6ah,sent2
jb 6bh,sent2
jb 6ch,sent2;三个当中有一个走了1.2°的整数倍就发送
sjmp $
sent2: mov r1,#50h ;起始地址
mov r2,#0eh ;一次发送14个字节
setb tr1
sjmp $
L4: mov a,@r1
mov sbuf1,a
jnb ti,$
clr ti
inc r1
djnz r2 ,L4
mov a,30h
cjne a,#0,choosemod1
sjmp NOW
choosemod1:mov a,30h
cjne a,#2,cerangle
mov r2,#0eh
ret
;实时发送
NOW: mov r1,50h ;起始地址
mov r2,0eh ;一次发送14个字节
setb tr1
sjmp $
L5: mov a,@r1
mov sbuf1,a
jnb ti,$
clr ti
inc r1
djnz r2 ,L5
mov r2,#0eh
mov a,30h
cjne a,#0, choosemod2
mov r2,#0eh
ret
choosemod2:mov a,30h
cjne a,#2,cerangle
sjmp certime1
end
本例完整程序下载:http://www.51hei.com/ziliao/file/dici.rar