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.zg4o1577.cn/ziliao/file/dici.rar