MOV A,ANGLE
MOV B ,#19H
add a,#01h
mov 61H,a ;25個(gè)脈沖的整數(shù)倍
;光電編碼器信號(hào)處理程序
ORG 0000H
LJMP MAIN
ORG 0003H ;外部中斷0入口
LJMP SUB0
ORG 000BH ;定時(shí)器0中斷入口
LJMP SUB1
ORG 0013H ;外部中斷1入口
LJMP SUB2
org 002bh ;定時(shí)器2中斷入口
ljmp t2t1
org 00c0h
main:call Init_Device
mov wdtcn,#00deh
mov wdtcn,#0adh ;前面的外部中斷重新配置
mov th0,#0ffh
mov tl0,#0ffh
setb tr0 ;啟動(dòng)計(jì)數(shù)器0開始工作
sjmp $ ;中斷返回處
org 100h
;外部中斷0引發(fā)的x方向記轉(zhuǎn)數(shù)
sub0:inc 5eh ;記脈沖數(shù),為后面的定角度做準(zhǔn)備
mov a, 5eh
cjne a,61h,L0 ;如果超過(guò)25個(gè)整數(shù)倍就清0
Mov 5eh,#00H
setb 6ah ;置內(nèi)部某位為1作為標(biāo)志
l0:jnb p1.0,t0t ;判斷P1.0為低電平則跳轉(zhuǎn)
mov a,52h
add a,#01h ;高電平則為正轉(zhuǎn)加1
mov 52h,a
mov a ,53h ;如果C=1則跳至高字節(jié)操作
addc a,#0
mov 53h,a
clr c ;清楚C標(biāo)志
reti
t0t:mov a,52h
subb a,#01h ;為低電平則為反轉(zhuǎn)-1
mov 52h,a
mov a,53h
subb a,#01
mov 53h,a
clr c
ret
;Y方向引發(fā)的記轉(zhuǎn)數(shù)
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 ;恢復(fù)成初始值
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方向引發(fā)的計(jì)轉(zhuǎn)數(shù)
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
;以下程序?yàn)榈卮艂鞲衅鹘邮粘绦,定時(shí)器1做波特率發(fā)生器,波特率為9600,采用內(nèi)部時(shí)鐘為16MHZ
setb tr1 ;啟動(dòng)定時(shí)器1做波特率發(fā)生器,注意同時(shí)也啟動(dòng)了串口1
setb ren
mov r7,#04h
trs:jnb ri,$ ;判斷一幀是否接收完畢 ri為1時(shí)接收完畢
clr ri
mov a,sbuf0
mov 5ah,a
inc 5ah
djnz r7,trs
mov r7,#04h ;循環(huán)四次把數(shù)據(jù)發(fā)送至5A~5d四個(gè)單元
ret
;以下為串口1的接收程序,PC和單片機(jī)的接收協(xié)議為A0+WORKMOD+參數(shù)+A0一共四個(gè)字節(jié)
;單片機(jī)收到A0后把收到的第一個(gè)字節(jié)送至30H單元存儲(chǔ),再根據(jù)WORKMOD的數(shù)據(jù)判斷參數(shù)是存至31H還是32H
;如果WOKMOD是0,則參數(shù)在VB中的設(shè)置是為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則循環(huán)接收,等于則向下執(zhí)行
jnb ri,$
clr ri
mov a,sbuf1
mov 30h,a ;把第一個(gè)字節(jié)存至30H
jnb ri,$
clr ri
mov a ,30h
cjne a,#0,recnum1 ;不為0則跳轉(zhuǎn)
ret ;為0則退出重新接收
recnum1: cjne a,#1,recnum2 ;不為1則跳轉(zhuǎn)至方式2
mov a,sbuf1
mov 31h,a
ret
recnum12: mov a,sbuf1
mov 32h,a
ret
;以下程序?yàn)閿?shù)據(jù)發(fā)送程序,共為三部分,第一部分為定時(shí)發(fā)送,
;第二部分為定角度發(fā)送,第三部分為實(shí)時(shí)發(fā)送,它們的選擇是由上位機(jī)發(fā)送過(guò)來(lái)的workmod的值判定的,約定為0為實(shí)時(shí)發(fā)送,1為
;定時(shí),2為定角度
;定時(shí)發(fā)送為定時(shí)1ms的mscnt倍,實(shí)現(xiàn)的是一個(gè)mscnt倍1ms循環(huán)
certime:mov r1,50h ;起始地址
mov r2,0eh ;一次發(fā)送14個(gè)字節(jié)
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
;定角度發(fā)送實(shí)現(xiàn)的是對(duì)1.2°的angle倍,實(shí)現(xiàn)1.2°的angle次循環(huán),原理同上,這里的1.2°是以光電編碼器為基準(zhǔn),而且1.2°的
;時(shí)候正好是25個(gè)脈沖 ,不過(guò)缺點(diǎn)是最多只能5°,如果需要超過(guò)5°的定角度發(fā)送需要擴(kuò)展
cerangle: jb 6ah,sent2
jb 6bh,sent2
jb 6ch,sent2;三個(gè)當(dāng)中有一個(gè)走了1.2°的整數(shù)倍就發(fā)送
sjmp $
sent2: mov r1,#50h ;起始地址
mov r2,#0eh ;一次發(fā)送14個(gè)字節(jié)
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
;實(shí)時(shí)發(fā)送
NOW: mov r1,50h ;起始地址
mov r2,0eh ;一次發(fā)送14個(gè)字節(jié)
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.torrancerestoration.com/ziliao/file/dici.rar