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

📄 selrun1.asm

📁 51控制电机滚动的程序
💻 ASM
字号:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PositiveChar     EQU   0BH           ;电机正转信息
ReverseChar      EQU   01H           ;电机反转信息
Myself           EQU   0FH           ;本机地址 
StepMotorOn      EQU   0BH           ;电机运行总开关打开信息 
Error            EQU   0AAH          ;出错信息 
Success          EQU   55H           ;成功信息
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Rceivebuffer     EQU   30H           ;平扫OR滚扫地址寄存器
ReceiveLength    EQU   31H           ;接受数据长度寄存器
StepMotor        EQU   32H           ;电机运行总开关寄存器
SpeedL8          EQU   33H           ;速度低字节寄存器
SpeedH8          EQU   34H           ;速度高字节寄存器
PositiveRunning  EQU   35H           ;正反转控制寄存器
SendBuffer       EQU   3DH           ;发送缓冲器
SpeedL           EQU   40H           ;速度低字节寄存器
SpeedH           EQU   41H           ;速度高字节寄存器
CheckSum         EQU   42H           ;校验寄存器
StartFlag        BIT   01H           ;启动加速标志
Positive         BIT   P1.6 
Reverse          BIT   P1.7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ORG    0000H
        AJMP   MAIN
        ORG    0003H
        NOP
        NOP
        LJMP   ERR
        ORG    000BH
        AJMP   TIMER0
        ORG    0013H
        NOP
        NOP
        LJMP   ERR
        ORG    001BH
        NOP
        NOP
        LJMP   ERR
        ORG    0023H
        AJMP   IntSeries
        NOP
	NOP
	LJMP   ERR    
;;;;;;;;;;;;;;;;;;;;;;;;;	     
	    ORG    0030H
MAIN:       MOV    SP,#60H
            clr    p1.0
            ACALL  ClearBuffer   
            ACALL  INITIAL
            SJMP  $              
        
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ControllProcessPro:
            MOV   A,StepMotor
            CJNE  A, #StepMotorOn, EndControllProcess   ;不相等就退出,结束运行
            
            MOV   SpeedL,SpeedL8
        JugeSpeedH:
            
            MOV   SpeedH,SpeedH8
            
            MOV   A,PositiveRunning          ;判断是正转还是反转
            CJNE  A,#PositiveChar,JugeDirect1
            
            SETB  70H      ;正转标志
            ACALL  START
            SETB   Reverse
            AJMP   EndPro 
       JugeDirect1:
            MOV   A,PositiveRunning
            CJNE   A, #ReverseChar, EndControllProcess
            CLR  70H       ;反转标志
            ACALL  START
            SETB  Positive
            AJMP  EndPro
    
    
 EndControllProcess:
            clr p1.0
            LCALL  Initial
   EndPro:  RET
   
   
;;;;;;初始化定时器0,并启动;;;;;;                
START:      setb  p1.0
            MOV    52H,#0FFH      ;设置启动缓冲脉冲个数低字节
            MOV    53H,#10H       ;设置启动缓冲脉冲个数高字节
            SETB   StartFlag      ;设置启动标志
            MOV    TMOD, #21H      
            MOV    TH0, #0FFH     ;设置启动缓冲速度高字节
            MOV    TL0, #30H       ;设置启动缓冲速度低字节
            SETB   TR0            ;启动计数
            SETB   ET0            ;开中断
            RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIMER0: PUSH  ACC
        MOV   A,StepMotor
        CJNE  A, #StepMotorOn, ControlStop  ;不相等就退出,结束运行
        JB     StartFlag,L00    ;若是启动则转 
        MOV    TH0, SpeedH      ;正常速度控制   
	MOV    TL0, SpeedL
	AJMP   L02
 L00:   MOV    TH0, #0FFH      ;启动速度控制
	MOV    TL0, #30H
        
L02:    JNB    70H,DIRECT       ;反转则转
        CPL    Positive             ;正转
        JNB   StartFlag,EXITTIMER0   ;不是启动过程则正常运行
        DJNZ  52H,EXITTIMER0
        DJNZ  53H,EXITTIMER0
        CLR   StartFlag            ;启动过程结束则清启动标志
      
        AJMP   EXITTIMER0
        
DIRECT: CPL    Reverse           ;反转
        JNB   StartFlag,EXITTIMER0  ;不是启动过程则正常运行
        DJNZ  52H,EXITTIMER0
        DJNZ  53H,EXITTIMER0
        CLR   StartFlag            ;启动过程结束则清启动标志
        
        NOP
        NOP
EXITTIMER0:POP   ACC
           RETI
           RETI
           RETI
           
           
ControlStop:clr  p1.0
            LCALL   Initial
            AJMP   EXITTIMER0 

;;;;;;;串口中断处理子程序;;;;;;;
IntSeries:   CLR    EA
             CLR    TR0
             PUSH   ACC
             JNB   TI,ReceiveBlock    ;是接收中断则转去接收中断处理
             CLR   TI                 ;进入发送中断处理
             JNB    F0,WaitNextInt           ;接收错误则等待重新接收
        ContinueOld:
             LCALL  ControllProcessPro  ;接收正确则进入过程控制处理子程序
             AJMP  WaitNextInt 
            
       ReceiveBlock:               ;进入接收中断处理
             
             LCALL  ReceiveaChar   ;调用接收一个字节子程序
             JNB    SM2,ReceiveDataBlock  ;如果是数据则转去数据处理
         ReceptAddress:    
             CJNE   @R0,#Myself,RestoreOld  ;如果不是呼叫本机则继续原来的动作
             MOV    Sendbuffer,#Myself    ;是本机则响应
             MOV    R0,#ReceiveLength     ;初始化接收数据起始地址
             CLR    SM2                   ;准备接收数据 
             MOV    R4,#00H               ;接收数据长度
             MOV    CheckSum,#00H         ;校验和初始化    
             CLR    TB8
             MOV    SBUF,Sendbuffer
             AJMP   WaitNextInt  
        ReceiveDataBlock:
             JB    RB8,ReceptAddress    ;如果是地址则转去地址处理 
             MOV   A,@R0
             ADD   A,CheckSum           ;接收数据相加,以便于判断校验和是否正确
             MOV   CheckSum,A
             INC   R0
             INC   R4
             MOV   A,R4
             CJNE  A,ReceiveLength,WaitNextInt  ;未接收完则等待下一次接收
             CLR   C
             DEC   R0
             MOV   A,CheckSum
             SUBB  A,@R0
             ANL   A,#0FEH
             MOV   CheckSum,A
             MOV   A,@R0
             ANL   A,#0FEH
             MOV   R0,#Rceivebuffer
             CJNE  A,CheckSum,JugeCheckSum       ;校验和错误则转去错误处理
             MOV   Sendbuffer,#Success           ;校验和正确则准备发送成功信息
             SETB  SM2                           ;置位SM2,下一次只有接收到地址才响应
             SETB  F0                            ;置接收成功标志
             AJMP  WaitReceiveInt
     JugeCheckSum:
               MOV   Sendbuffer,#Error           ;校验和错误则准备发送出错信息  
               CLR   SM2                         ;准备重新接收数据
               CLR   F0                          ;置接收出错标志
    WaitReceiveInt: 
             CLR    TB8  
             MOV    SBUF,Sendbuffer            ;启动发送信息 
    
    
    WaitNextInt:
               CLR    TI
               POP    ACC
               SETB   EA 
               RETI            
     WaitCall:
               SETB  SM2
               CLR   F0	
               AJMP  WaitNextInt
               
      
RestoreOld: POP    ACC
            SETB   EA 
            SETB   TR0            ;启动计数
            SETB   ET0             ;开中断
            RETI                   
               
;;;;;接受一个字节子程序;;;;;;
ReceiveaChar:CLR  RI
             MOV  A,SBUF
             MOV  @R0,A
             RET
             
;;;;;;清接收缓冲区子程序;;;;;;;;
ClearBuffer:   MOV   R0,#Rceivebuffer
               MOV   R4,#0AH
        
    ClearRceive:
               MOV   @R0,#00H 
               INC   R0
               DJNZ  R4,ClearRceive
               RET
               
;;;;;;;;;;;;;;;;;;;;;;;
        
Initial:CLR    EA
        MOV    R0,#Rceivebuffer ;接收起始地址(即主机呼叫地址)
        MOV    CheckSum,#00H ;清校验和寄存器 
        MOV    StepMotor,#00H
        CLR    StartFlag    ;清启动加速标志
        MOV    TMOD, #21H   ;定时器1工作方式置为2(可重装载),定时器0工作方式置为1
        MOV    SCON, #0f0H  ;串口工作方式设置为3 
        MOV    PCON,#80H    ;波特率加倍
        SETB   SM2          ;表示只有当RB8=1(接收的是地址),才响应
        MOV    TH1,#0FDH    ;波特率设置为19.2K
        MOV    TL1,#0FDH
        CLR    F0           ;正确接收完数据则置位F0,单片机就可以进行下一步处理
        CLR    TI
        CLR    RI
        SETB   Positive        ;电机正转
        SETB   Reverse         ;电机反转 
        CLR    TR0             ;禁止定时器0计数
        CLR    IT0             ;禁止定时器0中断
        SETB   TR1             ;启动定时器1计数
        SETB   PS              ;使串口中断优先权最高
        SETB   EA
        SETB   ES              ;允许串口中断 
        RET    
        RET
        RET
        
;;;;;;;;;;;;;;;;;;;;;;;
ERR:	CLR	EA
	MOV	DPTR,#ESTART
	PUSH	DPL
	PUSH	DPH
	RETI	
	
ESTART:	MOV	DPTR,#0000H
	PUSH	DPL
	PUSH	DPH
	RETI
	

	ORG	300H
	NOP
	NOP
	LJMP	ERR
	ORG	350H
	NOP
	NOP
	LJMP	ERR
	END
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -