探測(cè)機(jī)器人系統(tǒng)的設(shè)計(jì)
探測(cè)機(jī)器人系統(tǒng)的設(shè)計(jì),探測(cè),機(jī)器人,系統(tǒng),設(shè)計(jì)
電機(jī)控制程序
org 00h
ajmp start
org 30h
START:? ;??檢測(cè)鍵盤狀態(tài)的程序
mov p0,#0ffh????? ?? ;置p0為輸入口,將P0口置為1,用于檢查按鍵是否按下
jnb p0.0,QIDONG????? ;按鍵S2按下,p0.0為0,進(jìn)入啟動(dòng)(正轉(zhuǎn))程序
jnb p0.1,FANZHUAN?? ;按鍵S3按下,p0.1為0,進(jìn)入反轉(zhuǎn)程序
jnb p0.2,JITING??????? ;按鍵S4按下,p0.2為0,進(jìn)入急停程序
jnb p0.3,JIASU???????? ;按鍵S5按下,p0.3為0,進(jìn)入加速程序
jnb p0.4,JIANSU??????? ;按鍵S6按下,p0.4為0,進(jìn)入減速程序
jnb p0.5,TINGZHI????? ? ;按鍵S7按下,P0.5為0,進(jìn)入停止程序
ajmp start
QIDONG. ;啟動(dòng)程序,默認(rèn)為順時(shí)針轉(zhuǎn)動(dòng),轉(zhuǎn)速為2000RPM
LCALL YANSHI?? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.0,QI
LJMP START ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
QI:???
clr p0.6????? ;p0.6接電機(jī)R/S端,將其清零表示電機(jī)可以運(yùn)行?????????
setb p0.7???? ;p0.7接DIR端,為1,則與COM端斷開,電機(jī)正轉(zhuǎn)
mov p2,#0Bh ;p2.0接CH1,p2.1接CH2,p2.2接CH3,將速度設(shè)定為2000RPM
lcall XIANSHI? ;顯示設(shè)定速度
LJMP START ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
FANZHUAN: ;反轉(zhuǎn)程序,也即逆時(shí)針轉(zhuǎn)動(dòng)
LCALL YANSHI?? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.1,FAN
LJMP START??? ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
FAN:????
clr p2.3???????????? ;接通BRK端,使電機(jī)急停
lcall PANTING?? ;調(diào)用判停程序,能從判停程序中返回,說明機(jī)已停
setb p2.3??????? ?? ;斷開BRK端,解除急停狀態(tài)
clr p0.7?????????? ? ;接通DIR端,使電機(jī)逆時(shí)針轉(zhuǎn)動(dòng)
lcall XIANSHI??? ?? ;顯示設(shè)定速度
LJMP START??? ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
;急停程序
LCALL YANSHI?? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.2,JI
LJMP START ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
JI:???
clr p2.3????????? ;接通BRK端,使電機(jī)急停
lcall PANTING???? ? ;調(diào)用判停程序,若能從中返回,說明電機(jī)已停
LJMP START? ? ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
JIASU: ;加速程序,每按一次鍵,加速500rpm
LCALL YANSHI? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.3,JIA
LJMP START? ? ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
JIA:?
mov a,p2???? ;將p2的值復(fù)制到累加器a中
anl a,#07h?? ?? ;取ch3ch2ch1的值,并放到累加器a中???
jz START??? ?? ;若a中值為0,則速度已經(jīng)最大,不再加速,回到檢測(cè)按鍵狀態(tài)程序??????
mov r0,p2
dec r0
mov p2,r0?????????? ;加速500rpm(參考電機(jī)驅(qū)動(dòng)器說明中的多段速度選擇部分)
lcall XIANSHI???? ?? ;顯示設(shè)定的速度
LJMP START????? ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
JIANSU: ;減速程序,每按一次鍵,減速500rpm
LCALL YANSHI? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.4,JIAN
LJMP START??? ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
JIAN:?
mov a,p2??
anl a,#07h?????????? ;取ch3ch2ch1的值???
cjne a,#07h,JS???? ;若a中數(shù)值為07h,則速度已為0,
ljmp START????? ?? ;若速度為0,則程序回到開始程序,不再減速,以防出錯(cuò)
JS:
mov a,P2
inc a???
mov P2,a?? ? ;減速500rpm(參考電機(jī)驅(qū)動(dòng)器說明中的多段速度選擇部分)
lcall XIANSHI?????? ;顯示設(shè)定的速度
ljmp START?? ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
TINGZHI: ;?停止程序
LCALL YANSHI? ;調(diào)用延時(shí)子程序,目的:軟件消除按鍵抖動(dòng)
JNB P0.5,TING
LJMP START??? ;軟件消抖后,若p0.0為1,則認(rèn)為按鍵未按下,回到檢測(cè)按鍵狀態(tài)程序
TING:??
setb p0.6??????? ;p0.6接R/S端,為1,則與COM端斷開
lcall PANTING??? ? ;調(diào)用判停程序,若能從中返回,說明電機(jī)已停
LJMP START???? ;執(zhí)行完啟動(dòng)程序后,回到檢測(cè)按鍵狀態(tài)程序
YANSHI: ;延時(shí)10ms,這是一個(gè)子程序,功能是延時(shí)10毫秒
mov a,#0????????? ;對(duì)累加器a置零,延時(shí)用
y:???
mov r1,#00h????? ? ;對(duì)寄存器r1置零,延時(shí)用
inc r1
cjne r1,#0ffh,y??? ;延時(shí)1ms
inc a
cjne a,#10,y????? ;延時(shí)10×1=10ms
ret
PANTING: ;判停程序,這是一個(gè)子程序,若能從判停程序中返回,則說明電機(jī)已停
jnb p2.4,yanshi250ms ;若speed端為0,則進(jìn)入延時(shí)程序
ajmp PANTING?? ;若speed端為1,則返回PANTING,等待speed端出現(xiàn)0電平
yanshi250ms:
clr p2.6??????????? ;允許對(duì)計(jì)數(shù)器置數(shù)
mov p3,#08h???????? ?? ;對(duì)計(jì)數(shù)器置入數(shù)8
setb p2.6??????? ??? ;計(jì)數(shù)器開始計(jì)數(shù)
mov a,#0?????????? ? ;對(duì)累加器a置零,延時(shí)用
y250:???
mov r1,#00h???????? ;對(duì)寄存器r1置零,延時(shí)用
inc r1
jb p2.5,PANTING??? ? ;若期間Tc為1,則電機(jī)未停,返回PANTING,繼續(xù)判斷
cjne r1,#0ffh,y250???? ;延時(shí)1ms
inc a
cjne a,#250,y250????? ;延時(shí)250ms,
ret???
;若至延時(shí)結(jié)束Tc一直不改變狀態(tài),則說明speed端口無脈沖輸出,認(rèn)為電機(jī)停轉(zhuǎn),程序
;返回。
;在電機(jī)停轉(zhuǎn)之前,單片機(jī)不響應(yīng)按鍵狀態(tài)的改變。
XIANSHI: ;顯示程序,這是一個(gè)子程序
mov a,p2??????????? ? ;將當(dāng)前的速度設(shè)定值讀入a中
anl a,#07h???????? ? ;取ch3ch2ch1的值,存入a中
mov b,#4
mul ab????? ;取得低位速度值對(duì)應(yīng)的相對(duì)地址,存入a中
add a,r3???????????? ;得到低位字符地址,放在a中
mov scon,#00h????? ? ;初始化串行口方式0
mov r2,#0?????????? ;利用r2來控制顯示字符數(shù)
mov dptr,#tab???? ?? ;字形表的入口地址
mov r3,a??????????? ;低位速度值地址存入r3
?x:????? add a,r2??? ;利用a與r2的和獲得字符地址
???????? movc a,@a+dptr??? ;查表獲得字型碼,放在a中
???????? mov sbuf,a????????? ;串口顯示
???? l:? jnb ti,l??? ;等待發(fā)送完畢
???????? clr ti???? ;發(fā)送標(biāo)志ti清零
???????? inc r2
???????? mov a,r3
???????? cjne? r2,#4,x??? ;發(fā)送四個(gè)字符
???????? ret
tab:?? db 03h,03h,49h,0dh
????? db 03h,03h,03h,0dh
????? db 03h,03h,49h,27h
????? db 03h,03h,03h,27h
????? db 03h,03h,49h,9fh
????? db 03h,03h,03h,9fh
????? db 03h,03h,49h,0ffh
????? db 03h,0ffh,0ffh,0ffh
END
收藏