?? 電機控制.asm
字號:
;*********************************************
;Controller:ST7920
;MCU:AT89C51 ,晶體頻率:12MHz
;LCM:128*64
;LCM型號:帶中文字庫的128X64-0402
;LCM 接口:1:GND 2:VCC 3:V0 4.RS 5:RW 6:E 7--14:DB0-DB7 15:PSB 16:NC 17:RST 18:Vout
;**********************************************
RS EQU P2.4 ;RS=“H”,表示DB7——DB0為顯示數據
;RS=“L”,表示DB7——DB0為顯示指令數據
RW EQU P2.5 ;R/W=“H”,E=“H”,數據被讀到DB7——DB0
;R/W=“L”,E=“H→L”, DB7——DB0的數據被寫到IR或DR
E EQU P2.6 ;使能信號
PSB EQU P2.7 ;H:8位或4位并口方式,L:串口方式(見注釋1)
RST EQU P2.0 ;復位端,低電平有效
;模塊內部接有上電復位電路,因此在不需要經常復位的場合可將該端懸空
COM EQU 30H ;DD RAM 地址存放單元
DAT EQU 31H ;漢字代碼數據存放單元
LEN DATA 3FH ;高電平比例初值存放單元
GAO DATA 40H ;高電平存放單元
DI DATA 41H ;低電平存放單元
GORD BIT 20H ;高電平或低電平位判斷存放單元
JI_SHU1 DATA 42H ;中斷計數值低位存放單元
JI_SHU2 DATA 43H ;中斷計數值高位存放單元
TIMER DATA 44H ;定時循環次數存放單元
T_H DATA 45H ;十進制BCD數(17~24)位數存放單元
T_M DATA 46H ;十進制BCD數(9~16)位數存放單元
T_S DATA 47H ;十進制BCD數(1~8)位數存放單元
KEYBUF EQU 48H ;鍵號存放單元
SDJ DATA 49H ;設定鍵是否調用功能子程序偏儀量存儲單元
SDJPD DATA 4AH ;設定鍵奇偶判值斷存儲單元
BI_JIAO DATA 50H ;設定時的是否比較調用子程序偏移量存儲單元
;******************************以上是接口定義
;電機轉數檢測顯示
ORG 0000H
AJMP START
ORG 000BH
AJMP DVT0
ORG 0013H
AJMP INT1
ORG 001BH
AJMP TIMER1
ORG 0040H
START: MOV SP,#60H
MOV R0,#00H
CLR A
QING: MOV @R0,A ;將數據存放單元清零
DJNZ R0,QING
;=================================
;設置液晶的工作方式
DISP: CLR PSB
LCALL DELAY
SETB PSB ;將PSB置1,通信方式為8位數據并口
LCALL DELAY
MOV COM,#30H ;功能設置---8BIT控制界面,基本指令集
ACALL WRI ;調用寫指令子程序
LCALL DELAY ;延遲39uS
MOV COM,#0CH ;顯示打開,光標關,反白顯示關
ACALL WRI ;調用寫指令子程序
LCALL DELAY ;延遲39uS
MOV COM,#01H ;清除屏幕顯示,將DDRAM的地址計數器歸零
ACALL WRI ;調用寫指令子程序
LCALL DELAY ;延遲39uS
MOV COM,#06H ;DDRAM的地址計數器(AC)加1
ACALL WRI ;調用寫指令子程序
LCALL DELAY ;延遲39uS
;================================================
;初始顯示設定子程序
;第一行顯示子程序
MOV R0,#32H
DISPLAY:MOV COM,#80H ;DD RAM 地址-----10000000,即第一行顯示單元起始地址
ACALL WRI
MOV 32H,#10H ;32H為"轉"字偏移量
MOV 33H,#12H ;33H為"速"字偏移量
ACALL DIS
;第二行顯示子程序
MOV COM,#90H ;DD RAM 地址-----10010000,即第二行顯示單元起始地址
ACALL WRI
MOV 32H,#30H ;32H為"關"字偏移量
MOV 33H,#32H ;33H為"閉"字偏移量
ACALL DIS
;第三行顯示子程序
MOV COM,#88H ;DD RAM 地址-----10001000,即第三行顯示單元起始地址
ACALL WRI
MOV 32H,#10H ;32H為"轉"字偏移量
MOV 33H,#18H ;33H為"向"字偏移量
MOV 35H,#1EH ;33H為" "字偏移量
MOV 36H,#1EH ;33H為" "字偏移量
ACALL DIS1
MOV COM,#98H ;DD RAM 地址-----10011000,即第四行顯示單元起始地址
ACALL WRI
MOV 32H,#24H ;32H為"狀"字偏移量
MOV 33H,#26H ;33H為"態"字偏移量
MOV 35H,#28H ;33H為"停"字偏移量
MOV 36H,#2AH ;33H為"止"字偏移量
ACALL DIS1
;==============================
;各定時器、中斷和相關單元的初始設置
MOV JI_SHU1,#00H ;計數單元清零
MOV JI_SHU2,#00H
MOV TIMER,#20 ;置定時循環次數20次
MOV R1,#6 ;設定顯示單元個數
MOV SDJPD,#00H ;設定鍵奇偶判值初值為0
MOV BI_JIAO,#00H ;不比較調用子程序偏移量初值
SETB GORD ;置高低電平判斷位為1
MOV GAO,LEN ;置高電平初值
MOV A,#100 ;置周期總長值
SUBB A,GAO ;求低電平比例值
MOV DI,A ;存低電平比例值
MOV TMOD,#11H;置定時器0和1為定時工作方式1
MOV TH0,#0FFH;賦定時器初值,定時時間為100us
MOV TL0,#0ECH
MOV TH1,#3CH ;賦定時器初值,定時時間為50ms
MOV TL1,#0B0H
SETB PT0 ;置定時器0為優先
SETB ET0 ;開定時器0
SETB IT1 ;置中斷1為邊沿觸發方式
SETB ET1 ;開定時器0
SETB EA
SETB EX1 ;開中斷
SETB TR1
SETB TR0
LOOP:NOP ;陷阱等待中斷
NOP
NOP
NOP
AJMP LOOP
;=================================
;產生100赫茲的可調方波子程序
DVT0:PUSH PSW ;保護現場
PUSH A
MOV TH0,#0FFH;重新賦初值
MOV TL0,#0ECH
MOV A,LEN
CJNE A,#0,PD1 ;判斷高電平比例初值是否為0
CLR P2.1
AJMP DVT2
PD1: CJNE A,#100,PD2;判斷高電平比例初值是否為100
SETB P2.1
AJMP DVT2
PD2: JNB GORD,DVT1;判斷高低電平位是否為0,為0轉
DJNZ GAO,DVT2;判斷高電平是否已完
CLR P2.1 ;置P2.1為低電平
CLR GORD ;置高低電平位為0
MOV GAO,LEN
MOV A,#100
SUBB A,GAO
MOV DI,A ;求低電平比例值
AJMP DVT2
DVT1:DJNZ DI,DVT2 ;判斷低電平是否已完
SETB P2.1 ;置P2.1為高電平
SETB GORD ;置高低電平位為1
MOV GAO,LEN
DVT2:POP A ;恢復現場
POP PSW
RETI ;返回中斷
;===========================================
INT1: PUSH PSW
PUSH A
INC JI_SHU1 ;中斷計數值低位加1
MOV A,JI_SHU1
CJNE A,#00,INT11 ;判斷是否溢出
INC JI_SHU2 ;中斷計數值高位加1
INT11:POP A
POP PSW ;中斷返回
RETI
TIMER1:CLR TR1 ;關定時器1
CLR EX1
PUSH PSW
PUSH A
ACALL WAIT
JB P2.2,GUAN_FX
JB P2.0,FAN
JNB P2.0,ZHENG
GUAN_FX:
MOV COM,#8BH ;DD RAM 地址-----10001011,即第三行顯示第四個字的地址
ACALL WRI
MOV 32H,#1EH ;32H為"正"字偏移量
MOV 33H,#1EH ;33H為"轉"字偏移量
MOV R2,#2
ACALL DISP1
HUI1: MOV TH1,#3CH ;重新賦定時器1的初值
MOV TL1,#0B0H
DJNZ TIMER,TIMER11;判斷定時時間1秒是否已到
CLR EX1 ;關中斷1,停止計數
ACALL JI_SUAN ;調用相關的子程序
MOV TIMER,#20 ;重賦定時循環次數
MOV JI_SHU1,#00H ;中斷計數單元情零
MOV JI_SHU2,#00H
TIMER11:POP A
POP PSW
SETB EX1 ;重新開中斷1
SETB TR1 ;重新開定時器1
RETI
ZHENG:MOV COM,#8BH ;DD RAM 地址-----10001011,即第三行顯示第四個字的地址
ACALL WRI
MOV 32H,#20H ;32H為"正"字偏移量
MOV 33H,#10H ;33H為"轉"字偏移量
MOV R2,#2
ACALL DISP1
AJMP HUI1
FAN: MOV COM,#8BH ;DD RAM 地址-----10001011,即第三行顯示第四個字的地址
ACALL WRI
MOV 32H,#22H ;32H為"反"字偏移量
MOV 33H,#10H ;33H為"轉"字偏移量
MOV R2,#2
ACALL DISP1
AJMP HUI1
;============================
;每分鐘的脈沖個數計算
JI_SUAN:CLR C
MOV A,JI_SHU1
MOV B,#6
MUL AB
MOV R7,A
MOV R6,B
MOV A,JI_SHU2
MOV B,#6
MUL AB
ADD A,R6
MOV R6,A
CLR A
ADDC A,B
MOV R5,A
;=============================
;十六進制轉BCD碼子程序
CLR A ;累加器清零
MOV T_H,A ;清除十進制數存放單元,準備轉換
MOV T_M,A
MOV T_S,A
MOV R2,#24 ;十六進制位數長度
CLR C
SBIN_SBCD1:MOV A,R7 ;R7左移一位并送回
RLC A
MOV R7,A
MOV A,R6 ;R6左移一位并送回
RLC A
MOV R6,A
MOV A,R5 ;R5左移一位并送回
RLC A
MOV R5,A
MOV A,T_S
ADDC A,T_S
DA A ;T_S乘2并調整后送回
MOV T_S,A
MOV A,T_M
ADDC A,T_M
DA A ;T_M乘2并調整后送回
MOV T_M,A
MOV A,T_H
ADDC A,T_H
DA A ;T_H乘2并調整后送回
MOV T_H,A
DJNZ R2,SBIN_SBCD1 ;循環運行24次得到BCD碼結果
;============================================
;八位BCD 碼轉四位BCD碼子程序
CLR A
MOV 33H,A
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A
BA_SI_BCD: MOV A,T_S
MOV B,A
ANL A,#0FH ;將T_S里面的數據存放寄存器B里后再進行與操作得到低四位
MOV 37H,A ;并存放到數碼管顯示的第一位地址40H里面
MOV A,B
SWAP A ;從寄存器取回原來保存的數,再進行高低位互換
ANL A,#0FH ;進行與操作后得到高四位
MOV 36H,A ;最后存放到數碼管顯示的第二位地址41H里面
MOV A,T_M ;同上
MOV B,A
ANL A,#0FH
MOV 35H,A
MOV A,B
SWAP A
ANL A,#0FH
MOV 34H,A
MOV A,T_H
ANL A,#0FH
MOV 33H,A
MOV COM,#82H ;DD RAM 地址-----10000010,即第一行顯示第三個字的地址
ACALL WRI
MOV 32H,#0AH ;32H為(:)偏移量
MOV R2,#6
ACALL DISP2
MOV DPTR,#BJ_KG
MOV A,BI_JIAO
JMP @A+DPTR
GUAN: RET
BJ_KG: AJMP GUAN
AJMP KAI
KAI: CLR C
MOV A,37H
SUBB A,4FH
MOV A,36H
SUBB A,4EH
MOV A,35H
SUBB A,4DH
MOV A,34H
SUBB A,4CH
MOV A,33H
SUBB A,4BH
JC JIA_1
DEC LEN
MOV A,LEN
CJNE A,#0FFH,GUAN
MOV LEN,#0
AJMP GUAN
JIA_1: INC LEN
MOV A,LEN
CJNE A,#101,GUAN
MOV LEN,#100
AJMP GUAN
;==========================================
;液晶初始顯示調用子程序
DIS: MOV R2,#2 ;顯示字的字數
ACALL DISP1 ;調用字顯示
MOV 32H,#0AH ;32H為(:)偏移量
MOV 33H,#00H ;33H到39H為轉數偏移量
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#00H
MOV 37H,#00H
MOV R2,#6 ;顯示數字的字數
ACALL DISP2 ;調用半角字符顯示
MOV 32H,#10H ;32H為"轉"字偏移量
MOV R2,#1 ;顯示字的字數
ACALL DISP1 ;調用字顯示
MOV 32H,#0CH ;32H為(/)偏移量
MOV 33H,#0EH ;33H為(m)偏移量
MOV 34H,#0DH ;32H為(i)偏移量
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -