?? 程序原.asm
字號:
ED_DATA EQU 40H ;顯示數據區,共4個單元,存儲格式
;1234
DELAY_TIME_H EQU 46H ;延時控制位,用于決定電機的轉速
DELAY_TIME_L EQU 45H
TIME_SETP_H EQU 00H ;每次步進的長度
TIME_SETP_L EQU 0C8H
MAX_DELAY_H EQU 0ECH ;延時上限
MAX_DELAY_L EQU 78H
MIN_DELAY_H EQU 8AH ;延時下限
MIN_DELAY_L EQU 0D0H
COUNT EQU 48H ;決定輸出步序,
FLAG EQU 49H
SPEED EQU 50H ;速度等級
ORG 0000H
JMP MAIN
ORG 0003H ;外中斷0
JMP Int
NOP
NOP
CALL Err ;軟件陷阱
ORG 000BH ;定時中斷0
JMP Timer0
NOP
NOP
CALL Err ;軟件陷阱
ORG 0013H ;外中斷1
JMP Int3
NOP
NOP
CALL Err ;軟件陷阱
ORG 001BH ;定時器中斷1
JMP Timer1
NOP
NOP
CALL Err ;軟件陷阱
;//////////////////////////////////////////////////////////////////////////
ORG 0080H
MAIN:
CALL Init
CALL Int
CALL Int3
JMP $
;////////////////////////////中斷服務程序區////////////////////
Timer0:
RETI
Timer1: ;為保證輸出的連續,用中斷來輸出
CLR TR1 ;停止計數
MOV TH1,DELAY_TIME_H ;置計數器初值
MOV TL1,DELAY_TIME_L
MOV A,FLAG
JNZ Timer1_Loop1
INC COUNT ;加一
INC COUNT
Timer1_Loop1:
DEC COUNT ;減一
MOV A,COUNT ;范圍限制
CJNE A,#06H,Timer1_Loop2
MOV COUNT,#00H
Timer1_Loop2:
CJNE A,#0FFH,Timer1_Loop3
MOV COUNT,#05H
Timer1_Loop3:
MOV A,COUNT
MOV DPTR,#DATA_CODE ;查表
MOVC A,@A+DPTR ;讀控制碼
ANL P1,#0F0H ;輸出
ORL P1,A
SETB TR1 ;開計數器
RETI
Int: ;電機加速,即增大計數器初值
CLR ET0 ;關外部中斷0
INC SPEED ;查表顯示轉速
CALL JUDEG ;判斷范圍
CALL LED_SHOW ;改變速度等級顯示
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延時高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延時低位
MOV R6,A
MOV A,SPEED
JNZ Int_Loop1
MOV R5,#1 ;減速
JMP Int_Loop2
Int_Loop1:
MOV R5,#0 ;加速
Int_Loop2:
CALL Chang_Speed
;等待按鍵釋放
INT_Wait:
JB P3.2,INT_END
CALL Delay
JMP INT_Wait
INT_END:
SETB ET0 ;開中斷
RETI
;電機減速,即減小計數器初值
Int3:
CLR ET1
DEC SPEED
CALL JUDEG ;判斷范圍
CALL LED_SHOW ;改變速度等級顯示
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延時高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延時低位
MOV R6,A
MOV A,SPEED
CJNE A,#05H,Int3_Loop1
MOV R5,#0 ;加速
JMP Int3_Loop2
Int3_Loop1:
MOV R5,#1 ;減速
Int3_Loop2:
CALL Chang_Speed
;等待按鍵釋放
INT3_Wait:
JB P3.3,INT3_END
CALL Delay
JMP INT3_Wait
INT3_END:
SETB ET1
RETI
Err:
MOV A,#00H ;返回
PUSH Acc
PUSH Acc
RET
;/////////////////////////////普通函數區/////////////////////
;初始化函數
Init:
MOV SP,#60H ;設定堆棧
MOV TMOD,#10H ;選用定時器1,工作方式1
MOV TH1,#8AH ;置計數器初值,初始化為延時
MOV TL1,#0D0H
MOV FLAG,#00H ;正傳控制
MOV COUNT,#00H
MOV DELAY_TIME_H,#00H ;寫延時控制字
MOV DELAY_TIME_L,#00H
MOV SPEED,#00H ;速度等級1
MOV TCON,#00H ;設置中斷觸發方式為低電平觸發
MOV IP,#08H ;設定Timer1的中斷優先級為最高
;MOV IE,#8AH
MOV IE,#8FH ;開除串行中斷外的所有中斷,開總中斷
SETB TR1 ;開始計數
CALL LED_SHOW
MOV A,SPEED
RL A ;A x 2
MOV DPTR,#SPEED_CODE
PUSH Acc
MOVC A,@A+DPTR ;取延時高位
MOV R7,A
INC DPTR
POP Acc
MOVC A,@A+DPTR ;取延時低位
MOV R6,A
MOV R5,#00H
CALL Chang_Speed
RET
JUDEG:
PUSH Acc
MOV A,SPEED;
CJNE A,#06H,JUDEG_NEXT1
MOV SPEED,#00H
JUDEG_NEXT1:
CJNE A,#0FFH,JUDEG_NEXT2
MOV SPEED,#05H
JUDEG_NEXT2:
POP Acc
RET
;顯示轉速程序
LED_SHOW:
PUSH Acc
MOV A,SPEED
INC A
MOV DPTR,#LED_CODE0
MOVC A,@A+DPTR ;查表顯示速度等級
MOV P2,A
POP Acc
RET
;最終速度值放在R7/R6中,R7為高位 ,R5=0速度增加,R5=1速度減小
Chang_Speed:
PUSH Acc
Chang_Speed_Loop:
MOV A,R5
JZ Chang_Speed_Loop1
CALL Dec_Speed ;減速
CALL Delay ;延時
CLR C
MOV A,R6
SUBB A,DELAY_TIME_L
MOV A,R7
SUBB A,DELAY_TIME_H
JC Chang_Speed_Loop
JMP Chang_Speed_Loop2
Chang_Speed_Loop1:
CALL Add_Speed
CALL Delay ;延時
CLR C
MOV A,R6
SUBB A,DELAY_TIME_L
MOV A,R7
SUBB A,DELAY_TIME_H
JNC Chang_Speed_Loop
Chang_Speed_Loop2:
MOV DELAY_TIME_L,R6 ;確保最終速度穩定
MOV DELAY_TIME_H,R7
POP Acc
RET
Add_Speed:
PUSH Acc
MOV A,DELAY_TIME_L ;改變延時值
ADD A,#TIME_SETP_L
MOV DELAY_TIME_L,A
MOV A,DELAY_TIME_H
ADDC A,#TIME_SETP_H
MOV DELAY_TIME_H,A
POP Acc
RET
Dec_Speed:
PUSH Acc
CLR C
MOV A,DELAY_TIME_L ;改變延時值
SUBB A,#TIME_SETP_L
MOV DELAY_TIME_L,A
MOV A,DELAY_TIME_H
SUBB A,#TIME_SETP_H
MOV DELAY_TIME_H,A
POP Acc
RET
Delay: ;延時
PUSH Acc
MOV R0,#64H
LOOP_LEDW:
MOV A,0FFH
loop_led:
DEC A
NOP
JNZ loop_led
DJNZ R0,LOOP_LEDW
POP Acc
RET
;///////////////////////////DATA///////////////////////////////
DATA_CODE: DB 01h,03h,02h,06h,04h,05h ;電機控制代碼
NOP
NOP
CALL Err ;軟件陷阱
LED_CODE0: ;共陽極代碼
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
NOP
NOP
CALL Err ;軟件陷阱
LED_CODE1: ;共陰極代碼
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
NOP
NOP
CALL Err ;軟件陷阱
SPEED_CODE:
DB 08AH,0D0H ;1檔轉速的延時值,高位在前
DB 09EH,058H ; 2檔轉速的延時值
DB 0B1H,0E0H ; 3檔轉速的延時值
DB 0C5H,068H ; 4檔轉速的延時值
DB 0D8H,0F0H ; 5檔轉速的延時值
DB 0ECH,077H ; 6檔轉速的延時值
ORG 0300H
NOP
NOP
CALL Err ;軟件陷阱
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -