這是段直流電機閉環調速的程序,求大神幫忙啊!跪謝!!!
ORG 0000H
SJMP DISPLAY
ORG 0003H
LJMP BUTTON ; 外部0中斷入口地址
ORG 000BH
LJMP DINGSHI ; 定時中斷T0入口地址
RS EQU P3.0
RW EQU P3.1
E EQU P3.4
ORG 0030H ; 此次直流電機的設計以LCD字符夜晶的
; 顯示程序為主程序
DISPLAY:
SETB EA ; 打開中斷總開關
SETB EX0 ; 打開外部中斷0開關
SETB IT0 ; 打開外部中斷0下降沿觸發
MOV TMOD,#01H ; 設置定時工作方式
MOV TL0,#0FFH ; 設置定時初值
MOV TH0,#0FFH
SETB ET0 ; 打開定時中斷T0開關
CLR P0.5
CLR P0.6
CLR P0.7
SETB TR0 ; 定時器T0開始定時
MOV DPTR,#TAB ; 夜晶顯示的字符首地址
MOV R0,#00H ; 脈寬的初值
MOV R1,#16 ; "SET SPEED PLEASE"的字符個數
MOV R3,#00H
MOV R4,#00H
LP9:
LCALL CHUSHI
LP2:
ACALL BUSY
MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
ACALL DATAS
INC DPTR
DJNZ R1,LP2
LP3:
CJNE R3,#00H,LP4
CJNE R4,#00H,LP4
SJMP LP3
LP4: MOV R7,#00H ; 中斷的標志
MOV R5,#09H ; CURRENT : 的字符個數
ACALL BUSY
MOV P1,#0C0H
ACALL ENABLE
MOV DPTR,#MMTAB
ACALL BUSY
LP5:
MOV A,#00H
MOVC A,@A+DPTR
MOV P1,A
INC DPTR
ACALL DATAS
ACALL BUSY
DJNZ R5,LP5
MOV DPTR,#STAB
MOV A,R2
MOV P1,A
ACALL DATAS
ACALL BUSY
MOV A,R3 ; 顯示速度的十位
MOVC A,@A+DPTR
MOV P1,A
ACALL DATAS
ACALL BUSY
MOV A,R4 ; 顯示速度的個位
MOVC A,@A+DPTR
MOV P1,A
ACALL DATAS ; 使夜晶始終顯示當前電機的速度
LP8:
CJNE R7,#00H,LP7 ; 速度不變時等待
LJMP LP8 ; 速度變時重新讀入速度
LP7:
SJMP LP4
CHUSHI: ; 使夜晶顯示的一些初始設置
ACALL BUSY
MOV P1,#00000001B ; 清屏并光標復位
ACALL ENABLE
ACALL BUSY
MOV P1,#00111000B ; 設置顯示模式:8位2行5×7點陣
ACALL ENABLE
ACALL BUSY
MOV P1,#00001111B ; 顯示器開、光標開、光標允許閃爍
ACALL ENABLE
ACALL BUSY
MOV P1,#00000110B ; 文字不動,光標自動右移
ACALL ENABLE
ACALL BUSY
MOV P1,#80H ; 寫入顯示起始地址
ACALL ENABLE
RET
ENABLE: ; 寫入控制命令的子程序
SETB E
CLR RS
CLR RW
CLR E
RET
DATAS: ; 寫入數據子程序
SETB E
SETB RS
CLR RW
CLR E
RET
BUSY: ; 準備寫入數據
CLR E
MOV P1,#0FFH
CLR RS
SETB RW
SETB E
JB P1.7,BUSY
RET
ORG 2000H
DINGSHI: ; 定時中斷服務程序
CPL P0.7
JNB P0.7,Z1 ; 周期一定
MOV A,#0FFH
SUBB A,R0
MOV TH0,A
SETB TR0
RETI
Z1: MOV TH0,R0 ; 脈寬
SETB TR0
RETI
BUTTON: ; 從控制鍵盤中讀取操作命令
PUSH ACC
CLR EX0
CLR EA
INC R7 ;
MOV A,#0FFH
MOV P2,A
MOV A,P2
JNB ACC.0,AA0
JNB ACC.1,KK0
JNB ACC.2,ZZ
JNB ACC.3,FF
JNB ACC.4,WW0
AJMP QQ
AA0: CJNE R0,#0FFH, AA1 ; 加速操作
AJMP QQ
AA1: MOV A,R0
ADD A,#5
MOV R0,A
AJMP QQ
KK0: CJNE R0,#00,MM ; 減速操作
AJMP QQ
MM: MOV A,R0
SUBB A,#5
MOV R0,A
AJMP QQ
QQ: MOV A,R0
MOV B,#5
DIV AB
MOV B,#10
DIV AB
MOV R3,A
MOV R4,B
SETB EX0
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EA
POP ACC
RETI
ZZ: SETB P0.5 ; 正轉操作
CLR P0.6
MOV R2,#2BH ; 正轉標志 "+"
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB EA
POP ACC
RETI
FF: CLR P0.5 ; 反轉操作
SETB P0.6
MOV R2,#2DH ; 反轉標志 "-"
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB EA
POP ACC
RETI
WW0: CLR P0.5 ; 停止操作
CLR P0.6
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB EA
POP ACC
RETI
DELAY: ; 延時子程序
MOV R5,#0E0H
MM0: MOV R6,#30H
MM1: DJNZ R6,MM1
DJNZ R5,MM0
RET
TAB: DB 53H,45H,54H,20H
DB 53H,50H,45H,45H ; "SET SPEED PLEASE" 代碼
DB 44H,20H,50H,4CH
DB 45H,41H,53H,45H
STAB: DB 30H,31H,32H,33H
DB 34H,35H,36H,37H ; "0,1,2,3,4,5,6,7" 代碼
DB 38H,39H,41H,42H ; "8,9,A,B,C,D,E,F"
DB 43H,44H,45H,46H
MMTAB: DB 43H,4FH,52H,52H
DB 45H,4EH,54H,20H ; " CURRENT : " 代碼
DB 3AH
END
為什么呢?
匯編程序的代碼效率、執行速度、時間的精確度都不是c語言能比的。
但是由于其編寫存在一定的難度,沒有c語言顯得簡易。
但是既然匯編程序已經編寫好了,不存在編寫的問題了,為什么要走回頭路呢??
如果想作為一個模塊插入其他工程中,也一點問題都沒有!!有人說匯編語言不易實現模塊化(甚至有些教程也如是說),那是瞎說!!
看看有些工程包含的.A51或.asm就知道了。
其實匯編模塊的調用和c語言模塊的調用沒多少不同。
這個程序要給別人看,C語言更直觀,別人容易讀懂。 大神,求幫忙啊!
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |