⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电机控制.asm

📁 Proteus实例集锦(包括电路图.仿真程序,各种各样的电路
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************************************
 ;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 + -