Counter DATA 57H ;顯示計數(shù)器
DISPBUF DATA 58H ;顯示緩沖區(qū)
ORG 0000H
AJMP MAIN
ORG 000BH
JMP DISP
ORG 001BH
JMP DJZD
ORG 30H
MAIN:
MOV SP,#5FH
MOV P1,#0FFH
MOV A,#Hidden
MOV DispBuf,A
MOV DispBuf+1,A
MOV DispBuf+2,A
MOV DjCount,#11110111B
MOV SPEED,#MinSpd ;起始轉(zhuǎn)動速度送入計數(shù)器
CLR StartEnd ;停轉(zhuǎn)狀態(tài)
MOV TMOD,#00010001B ;
MOV TH0,#HIGH(65536-3000)
MOV TL0,#LOW(65536-3000)
MOV TH1,#0FFH;
MOV TL1,#0FFH
SETB TR0
SETB EA
SETB ET0
SETB ET1
LOOP: ACALL KEY ;鍵盤程序
JNB F0,m_NEXT1 ;無鍵繼續(xù)
ACALL KEYPROC ;否則調(diào)用鍵盤處理程序
m_NEXT1:
MOV A,Speed
MOV B,#10
DIV AB
MOV DispBuf+5,B ;最低位
MOV B,#10
DIV AB
MOV DispBuf+4,B
MOV DispBuf+3,A
JB StartEnd,m_Next2
CLR TR1 ;關(guān)閉電機
JMP LOOP
ORL P1,#11110000B
m_Next2:
SETB TR1 ;啟動電機
AJMP LOOP ;主程序結(jié)束
;---------------------------------------
D10ms:
……
;---------延時程序,鍵盤處理中調(diào)用
KEYPROC:
MOV A,B ;獲取鍵值
JB ACC.2,StartStop ;分析鍵的代碼,某位被按下,則該位為1
JB ACC.3,KeySty
JB ACC.4,UpSpd
JB ACC.5,DowSpd
AJMP KEY_RET
StartStop:
SETB StartEnd ;啟動
AJMP KEY_RET
KeySty:
CLR StartEnd; ;停止
AJMP KEY_RET
UpSpd:
INC SPEED;
MOV A,SPEED
CJNE A,#MaxSpd,K1 ;到了最多的次數(shù)?
DEC SPEED ;是則減去1,保證下次仍為該值
K1:
AJMP KEY_RET
DowSpd:
DEC SPEED
MOV A,SPEED
CJNE A,#MAXSPD,KEY_RET ;不等(未到最大值),返回
MOV SPEED,#MinSpd;
KEY_RET:
RET
KEY:
……獲取鍵值的程序
RET
DjZd: ;定時器T1用于電機轉(zhuǎn)速控制
PUSH ACC
PUSH PSW
MOV A,Speed
SUBB A,#MinSpd ;減基準數(shù)
MOV DPTR,#DjH
MOVC A,@A+DPTR
MOV TH1,A
MOV A,Speed
SUBB A,#MinSpd
MOV DPTR,#DjL
MOVC A,@A+DPTR
MOV TL1,A
MOV A,DjCount
CPL A
ORL P1,A
MOV A,DjCount
JNB ACC.7,d_Next1
JMP d_Next2
d_Next1:
MOV DjCount,#11110111B
d_Next2:
MOV A,DjCount
RL A
MOV DjCount,A ;回存
ANL P1,A
POP PSW
POP ACC
RETI
DjH: DB 76,82,89,95,100,106,110,115,119,123,12……
DjL: DB 0,236,86,73,212,0,214,96,163,165
……
DISP: ;顯示程序
POP PSW
POP ACC
……
RETI
BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END
3.程序分析
本程序主要由鍵盤程序、顯示器程序、步進電機驅(qū)動程序三部份組成,主程序首先初始化各變量,將顯示器的高3位消隱,步進電機驅(qū)動的各引腳均輸出高電平,然后調(diào)用鍵盤程序,并作判斷,如果有鍵按下,則調(diào)用鍵盤處理程序,否則直接轉(zhuǎn)下一步。下一步是將當(dāng)前的轉(zhuǎn)速值轉(zhuǎn)換為BCD碼,送入顯示緩沖區(qū);接著判斷StartEnd這個位變量,是“1”還是“0”,如果是“1”,則開啟定時器T1,否則關(guān)閉定時器T1,為防止關(guān)閉時某一相線圈長期通電,因此,在關(guān)閉定時器T1時,將P1.0~P1.3均置高。至此,主程序的工作即結(jié)束。這里為簡便起見,這里沒有做高位“0”消隱的工作,即如果速度為10轉(zhuǎn)/分,則顯示值“010”,讀者可以自行加入相關(guān)的代碼來處理這一工作。
步進電機的驅(qū)動工作是在定時器T1的中斷服務(wù)程序中實現(xiàn)的,由前述分析,每次的定時時間到達以后,需要將P1.0~P1.3依次接通,程度中用了一個變量DjCntr來實現(xiàn)這一功能,在主程序初始化時,該變量被賦予初值11110111B,進入到定時中斷以后,將該變量取出送ACC累加器,并在累加器中進行左移,這樣,該數(shù)值就變?yōu)?110 1111,然后將該數(shù)與P1相“與”,此時,P1.4即輸出低電平,第二次進入中斷時,先將該數(shù)取反,成為 0001 0000,然后將該數(shù)與P1相“或”,這樣,P1.4即輸出高電平,關(guān)斷了相應(yīng)的線圈,然后將該數(shù)重新取出,并作左移,即 1110,1111右移成為1101 1111,將該數(shù)與P1相“與”,這樣P1.5即輸出低電平,依次類推,P1.7~P1.4即循環(huán)輸出低電平。當(dāng)這一數(shù)據(jù)變?yōu)?111 1111后,需要作適當(dāng)?shù)母膭?將數(shù)據(jù)重新變回 1111 0111,進行第二次循環(huán),相關(guān)代碼,請讀者自行分析。
定時時間又是如何確定的呢?這里用的是查表的方法,首先用Excel計算得出在每一種轉(zhuǎn)速下的TH值和TL值,然后,分別放入DjH和DjL表中,在進入T1中斷程序之后,將速度值變量Speed送入累加器ACC,然后減去基數(shù)25,使其基數(shù)從0開始計數(shù),然后分別查表,送入TH1和TL1,實現(xiàn)重置定時初值的目的。
看完這一部份內(nèi)容以后,請讀者自行完成以下工作:
1. 更改程序,將S1定義為“啟動/停止”,而S2定義為“方向”,按下S2,切換電機旋轉(zhuǎn)方向。
2. 更改程序,要求轉(zhuǎn)速從1到100。
3. 更改程序,實現(xiàn)首位無效零消隱。





