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

📄 6221mada.asm

📁 步进电机的源代码
💻 ASM
字号:

;遥控电机程序, 按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转
;0-9步,同时数码管分别显示当前的数字!
;***************************************************************************
;*  sxj1974@163.com		     (51c51 test web)     www.8951.com     *
;*  Create by :石学军      www.51c51.com 更多例程请登陆网站        	   *
;***************************************************************************
	org 00h
    JMP MAIN
	ORG 30H
MAIN:
    MOV P1,#0FFH
	MOV P2,#0FFH
	MOV P3,#0FFH
START:
    JB P3.7,$	;等待遥控信号出现
SB:
    MOV R4,#8   ;8毫秒为高电平错误
SBA:
    MOV R5,#250
SBB:
    JB P3.7,SXB1
    DJNZ R5,SBB
    DJNZ R4,SBA
    MOV R4,#2
    JMP SBC
SXB1:
    MOV R5,#5
SXB2:             ;去掉20US的尖峰干扰信号
    JNB P3.7,SBB
    DJNZ R5,SXB2
    JMP START
SBC:
    MOV R5,#250
SB1:
	JB P3.7,SB2 	;2MS内不为高电平错误(监测9MS的低电平引导码)
    DJNZ R5,SB1
    DJNZ R4,SBC
    JMP START
SB2:                ;去掉20US的尖峰干扰信号
    MOV R5,#5
SB2_A:
    JNB P3.7,SB1
    DJNZ R5,SB2_A
    MOV R4,#3
SB2_1:
    MOV R5,#250
SB3:                 ;监测4.5MS高电平,如3MS内出现低电平错误
    JNB P3.7,SXC
    DJNZ R5,SB3
    DJNZ R4,SB2_1
    MOV R4,#2
    JMP SB3_1
SXC:                 ;去掉20US的尖峰干扰信号
    MOV R5,#5
SXC1:
    JB P3.7,SB3
    DJNZ R5,SXC1
    JMP START
SB3_1:                ;监测4.5MS高电平,如5MS内不为低电平错误
    MOV R5,#250
SB3_2:
    JNB P3.7,SB4
    DJNZ R5,SB3_2
    DJNZ R4,SB3_1
    JMP START
SB4:                   ;去掉20US的尖峰干扰信号
    MOV R5,#5
SB4_1:
    JB P3.7,SB3_2
    DJNZ R5,SB4_1
	MOV R1,#1AH 	;设定1AH为起始RAM区
	MOV R2,#4
PP: MOV R3,#8
JJJJ:
    MOV R5,#250
JJJJ2:               ;1MS内不为低电平错误
    JB P3.7,JJJJ3
    DJNZ R5,JJJJ2
    JMP START
JJJJ3:
	LCALL YS1 	;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
	MOV C,P3.7  	;将P3.7引脚此时的电平状态0或1存入C中
	JNC UUU     	;如果为0就跳转到UUU
    MOV R5,#250
JJJJ4:
    JNB P3.7,UUU
    NOP
    DJNZ R5,JJJJ4
    JMP START
UUU:	MOV A,@R1 	;将R1中地址的给A
	RRC A            ;将C中的值0或1移入A中的最低位
	MOV @R1,A       ;将A中的数暂时存放在R1中
	DJNZ R3,JJJJ    ;接收地址码的高8位
	INC R1      	;对R1中的值加1,换成下一个RAM
	DJNZ R2,PP  	;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;以下对代码是否正确和定义进行识别
	MOV A,1AH	;比较高8位地址码
	XRL A,#00000000B ;判断1AH的值是否等于00000000,相等的话A为0
	JNZ EXIT	;如果不相等说明解码失败退出解码程序
	MOV A,1BH	;比较低8位地址
	XRL A,#11111111B ;再判断高8位地址是否正确
	JNZ EXIT	;如果不相等说明解码失败退出解码程序
	LCALL YS3
	MOV A,1CH	;比较数据码和数据反码是否正确?
	CPL A
	XRL A,1DH 	;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
	JNZ EXIT	;如果不相等说明解码失败退出解码程序
	LCALL YS3
	CLR P2.6 	;选中数码管
	CLR P3.3	;解码成功喇叭响?
	AJMP BIJIAO
;判断在118毫秒内是否有连发码
AA:	MOV R1,#25
XX:	ACALL YS2
	JNB P3.7,HH	;跳转到判断连发代码是否正确的程序段
	DJNZ R1,XX
EXIT: 	;对所有端口清零

	AJMP START
;连发码判断程序段-----------
HH:	MOV R6,#4
S: 	ACALL YS1	;调用882微秒延时子程序
	JB P3.7,EXIT	;延时882微秒后判断P3.7脚是否出现高电平如果有就退出解码程序
	DJNZ R6, S	;重复4次,目的是确认连发码的低电平信号波形
	JNB P3.7, $ 	;等待高电?
	LCALL YS3
	AJMP AA

BIJIAO:
    MOV R0,#18 ;一共18个按键
    MOV DPTR,#TAB_REM ;遥控键值查表
LOOKUP_1:
    MOV A,R0         ;查表偏移量
    MOVC A,@A+DPTR
    XRL A,1cH        ;比较键值
    JZ REM_BAK0       ;相等转移
    DJNZ R0,LOOKUP_1   ;直到18个健比较完毕
    JMP EXIT         ;都不对退出
REM_BAK0:               ;键值处理
    MOV A,R0            ;R0
    MOV R1,A             ;
    SUBB A,#9            ;如果大于9则反转并将值减去9
    JC REM_BAK1           ;小余或等于9到正转
    INC A                 ;加1
    MOV R1,A               ; 查显示码表
    MOV DPTR,#TABLE1      ;
    MOVC A,@A+DPTR
    MOV P0,A              ;送显示
    CLR P2.6               ;开显示

REM_REV:                   ;反转程序
    CALL REV
    CALL delay             ;转速
    DJNZ R1,REM_REV         ;转动的步数到了停止
    JMP AA
REM_BAK1:                   ;正转程序
    NOP
    MOV A,R1	  ;按键数值判断执
    MOV DPTR,#TABLE1     ; 查显示码表
    MOVC A,@A+DPTR
    MOV P0,A                  ;送显示
    CLR P2.6                    ;开显示

REM_FOR:                      ;正转
    CALL FOR
    CALL DELAY
    DJNZ R1,REM_FOR
    JMP AA
for: mov r0,#00h               ;正转到tab取码指针初值
for1:mov a,r0                  ;取码
         mov dptr,#table        ;
         movc a,@a+dptr
         jz FOREXT              ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始正转
         call delay             ;转动的速度
         inc r0                 ;取下一个码
         jmp for1               ;继续正转
rev:mov r0,#05h                 ;反转到tab取码指针初值
rev1:mov a,r0
         mov dptr,#table           ;取码
         movc a,@a+table
         jz FOREXT                 ;是否到了结束码00h
         cpl a                  ;把acc反向
         mov p1,a               ;输出到p1开始反转
         call delay            ;转动的速度
         inc r0                 ;取下一个码
         jmp rev1               ;继续反转
FOREXT:
         RET
          
YS1:	 MOV R4,#20	 ;延时子程序1,精确延时882微秒
	D1: MOV R5,#20
	DJNZ R5,$
	DJNZ R4,D1
	RET
YS2: MOV R4,#10 	;延时子程序2,精确延时4740微秒
	D2: MOV R5,#235
	DJNZ R5,$
	DJNZ R4,D2
	RET
YS3:	MOV R4,#2	;延时程序3,精确延时1000微秒
	D3:MOV R5,#248
	DJNZ R5,$
	DJNZ R4,D3
	RET
 
TAB_REM:   ;遥控的键值
    DB 00H
    DB 10H,03H,01H,06H,09H,1DH,1FH,0DH,19H
    DB 11H,15H,17H,12H,16H,4CH,40H,48H,04H
    
delay:   mov r3,#40               ;步进电机的转速20ms
m3:      mov r2,#248
          djnz r2,$
          djnz r3,m3
          ret
TABLE1:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h;数码管的码表
        ;0 1 2 3 4 5 6 7 8 9
table:
      db 03h,09h,0ch,06h    ;正转表
      db 00                  ;正转结束
      db 03h,06h,0ch,09h    ;反转
      db 00                  ;反转结束
      end

⌨️ 快捷键说明

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