返回主页 单片机教程XL2000开发板 单片机学习 自制编程器 单片机资料 软件下载 电子技术产品介绍如何购买 论坛



;********************************************************************************
;遥控电机程序, 按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转 *
;0-9步,同时数码管分别显示当前的数字!步进电机端口:P1.0,P1.1,P1.2,P1.3, *
;遥控端口P3.7,数码管动态扫描端口P0,P2 *
;********************************************************************************
;* 日期: 2007-3-25 *
;* 版本: 3.0 *
;* 作者: 深圳学林电子有限公司 专业8051单片机教程站 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com http://www.8951.com 更多例程请登陆网站 *
;********************************************************************************
;* 硬件:此程序在本公司xlisp系列单片机实验仪运行通过 *
;********************************************************************************
;* 【版权】 Copyright(C)深圳学林电子有限公司 www.51c51.com All Rights Reserved *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;********************************************************************************

(上图p1.0-1.3连接步进电机的输入)

hex格式文件下载(点右键,目标另存为hex即可直接烧写)


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