📄 电机控制.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 + -