步进电机驱动程序(汇编)
四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:驱动电路:程序:大家对照一下程序就知道,本程序采用了八拍工作方式/***********************************************项目:步进电机正反转(EE01学习板演示程序)**作者:一线工人**网站:电子工程师之家*********************************************/#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};/********************************************************/ /*/* 延时t毫秒/* 11.0592MHz时钟,延时约1ms/*/********************************************************/ void delay(uint t){uint k;while(t--){for(k=0; k<123; k++){ }}}/********************************************************/ /*/*步进电机正转/*/********************************************************/ void motor_ffw(uint n){uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈{for (i=0; i<8; i++) //一个周期转30度{P0 = FFW; //取数据delay(15); //调节转速}}}/********************************************************/ /*/*步进电机反转/*/********************************************************/ void motor_rev(uint n){uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈{for (i=0; i<8; i++) //一个周期转30度{P0 = REV; //取数据delay(15); //调节转速}}}/******************************************************** ** 主程序**********************************************************/main(){while(1){motor_ffw(5); //电机正转delay(1000); //换向延时motor_rev(5); //电机反转delay(1000); //换向延时}}本文来自: 电子工程师之家。
四相步进电机驱动程序及工作原理

四相步进电机驱动程序及工作原理1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
开始时,开关SB接通电源,SA、SC、SD断开,B相磁极与转子0、3号齿对齐,同时,转子的1、4号齿就与C、D相绕组磁极产生错齿,2、5号齿就与D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线与1、4号齿之间磁力线的作用,使转子转动,1、4号齿与C相绕组的磁极对齐。
而0、3号齿与A、B相绕组产生错齿,2、5号齿就与A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:驱动电路:程序:大家对照一下程序就知道,本程序采用了八拍工作方式**项目:步进电机正反转(EE01学习板演示程序)**一线工人**网站:电子工程师之家#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar codeFFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};/* 延时t毫秒/* 11.0592MHz时钟,延时约1msvoid delay(uint t)uint k;while(t--)for(k=0; k<123; k++)/*步进电机正转void motor_ffw(uint n)uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈for (i=0; i<8; i++) //一个周期转30度P0 = FFW; //取数据delay(15); //调节转速/*步进电机反转void motor_rev(uint n)uchar i;uint j;for (j=0; j<12*n; j++) //转1×n圈for (i=0; i<8; i++) //一个周期转30度P0 = REV; //取数据delay(15); //调节转速* 主程序main()while(1)motor_ffw(5); //电机正转delay(1000); //换向延时motor_rev(5); //电机反转delay(1000); //换向延时。
C51汇编中断控制步进电机程序

C51汇编初学功能:使用INT0的中断服务程序控制步进电机正向步进;使用INT1中断服务程序控制步进电机反向步进。
电路:设计思路:①主程序在完成对INT0和INT1的设置后,可进入死循环(等待中断请求)。
②为便于实验观察和操作,设INT0和INT1中断触发方式为边沿。
③步进电机的转动控制由外部中断的服务程序来实现。
④当前步进电机的相位通电状态信息可以使用片内RAM中的一个字节单元来存储。
设计参考:①主程序需要设置的中断控制位如下:IT0和IT1 外部中断触发方式控制0=电平1=边沿(下降沿)EX0和EX1 外部中断允许控制0=屏蔽1=允许PX0和PX1 中断优先级级别控制0=低级1=高级在同级别(PX0=PX1)时INT0的优先级高于INT1EA 中断允许总控制0=屏蔽1=允许②外部中断服务程序的入口地址:0003H 外部中断00013H 外部中断1程序:PHASE_OUT EQU 30H ;步进电机相位通电状态VAR_END EQU 31H ;转动次数STACK_INI EQU VAR_END+1ORG 0000H ;复位入口LJMP RESETORG 0003H ;外部中断0 服务程序入口LJMP INT_EX0ORG 000BH ;定时器/计数器0 溢出中断服务程序入口RETIORG 0013H ;外部中断1 服务程序入口LJMP INT_EX1ORG 001BH ;定时器/计数器1 溢出中断服务程序入口RETIORG 0023H ;串行口中断服务程序入口RETIORG 040H ;复位处理程序RESET: MOV SP,#STACK_INI ;设置栈底指针MAIN: SETB IT0SETB IT1SETB EX0SETB EX1SETB PX0SETB PX1MOV PHASE_OUT,#01HMOV VAR_END,#03H ;转动次数为3SETB EASJMP $INT_EX0:MOV R0,VAR_END ;转动次数INTX0: MOV A,PHASE_OUTRR ACJNE A,#80H,I0MOV A,#08HI0: MOV PHASE_OUT,AMOV P1,ADELAY0: MOV R1,#5LP10: MOV R2,#255LP20: MOV R3,#255DJNZ R3,$DJNZ R2,LP20DJNZ R1,LP10DJNZ R0,INTX0RETIINT_EX1:MOV R0,VAR_END ;转动次数INTX1: MOV A,PHASE_OUTRL ACJNE A,#10H,I1MOV A,#01HI1: MOV PHASE_OUT,AMOV P1,ADELAY1: MOV R1,#5LP11: MOV R2,#255LP21: MOV R3,#255DJNZ R3,$DJNZ R2,LP21DJNZ R1,LP11DJNZ R0,INTX1RETIEND。
步进电机启动停止正反转控制程序的汇编语言的实现

DELAY 1MS MACRO TIME ;延时宏命令LOCAL AALOCAL BBPUSH CXMOV CX,TIMEAA: PUSH CXMOV CX,1000BB: NOPLOOP BBPOP CXLOOP AAPOP CXENDMDA TA SEGMENTTABA DB 01H,03H,02H,06H,04H,05H;正转的模型TABB DB 05H,04H,06H,02H,03H,01H;反转的模型DA TA ENDSCODE SEGMENTZZ PROC NEARPUSH DSMOV AX,DA TAMOV DS,AXMOV AX,0PUSH AXMOV DX,203HMOV AL,80HOUT DX,AL ;8255的控制字设定MOV DX,200HMOV AL,0OUT DX,AL ;先输出制动命令MOV CX,360 ;设定正转步数DD:MOV BL,6 ;六拍MOV DX,200HLEA DI,TABA ;指针指向正转的数字模型CC: MOV AL,[DI]OUT DX,ALDELAY 1MS 10INC DI ;指针加1,指向下一步的数字模型DEC BL ;拍数减1JNZ CC ;六拍未结束,则继续循环LOOP DD;360个周期的六拍未结束,继续循环ZZ ENDPFZ PROC NEARMOV CX,400 ;设定反转步数FF: MOV BL,6MOV DX,200HLEA DI,TABB ;指针指向反转的数字模型EE: MOV AL,[DI]OUT DX,ALDELAY 1MS 10DEC DI ;指针减1,指向反转下一步数字模型DEC BLJNZ EELOOP FFFZ ENDPMOV DX,200HMOV AL,0OUT DX,AL ;结束后,输出制动命令RETMAIN ENDPCODE ENDSEND START。
L298N驱动步进电机程序(带PWM)

MCU选择的是stm32F103RBT6,步进电机选择4相5线5V步进电机马达减速电机28BYJ-48-5V,驱动选择的是L298N模块,模块供电选择12V供电(5V可能带不起来),模块的OUT1、OUT2接小型步进电机的一个线圈,OUT3、OUT4接另一个线圈,注意L298N模块的GND和MCU 的GND相连。
*******************************************************************************步进电机头文件Stepmotor.h#ifndef __MOTOR_H#define __MOTOR_Hvoid Motor_Init(void);void Motor_Go(void);#endif源文件Stepmotor.c#include "stepmotor.h"#include "sys.h"void Motor_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8;//PB3接IN1 PB5接IN2 PB7接IN3 PB8接IN4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);//GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8);******************************************************************************* PWM调制头文件mypwm.h#ifndef __TIMER_H#define __TIMER_H#include "sys.h"void MYTIMER3_Init(u16 arr,u16 psc);void TIM3_PWM_Init(u16 arr,u16 psc);#endif源文件mypwm.c#include " mypwm.h#include "stm32f10x.h"void TIM3_PWM_Init(u16 arr,u16 psc){TIM_OCInitTypeDef TIM_OCInitTypestucture;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstucture;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);//使能PC端口,复用时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//PC6接ENA PC7接ENB GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz GPIO_Init(GPIOC, &GPIO_InitStructure);//GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//TIM_TimeBaseInitstucture.TIM_Period=arr;//自动装载值TIM_TimeBaseInitstucture.TIM_Prescaler=psc;//预分频值TIM_TimeBaseInitstucture.TIM_CounterMode=TIM_CounterMode_Up;//计数模式向上TIM_TimeBaseInitstucture.TIM_ClockDivision=0 ;//TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstucture);TIM_OCInitTypestucture.TIM_OCMode=TIM_OCMode_PWM1 ;//模式1TIM_OCInitTypestucture.TIM_OCPolarity=TIM_OCPolarity_High;//高电平TIM_OCInitTypestucture.TIM_Pulse=599;//改变数值调节占空比TIM_OCInitTypestucture.TIM_OutputState=TIM_OutputState_Enable;//使能TIM_OC1Init(TIM3,&TIM_OCInitTypestucture);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载TIM_OCInitTypestucture.TIM_OCMode=TIM_OCMode_PWM1 ;//模式1TIM_OCInitTypestucture.TIM_OCPolarity=TIM_OCPolarity_High;//高电平TIM_OCInitTypestucture.TIM_Pulse=599;TIM_OCInitTypestucture.TIM_OutputState=TIM_OutputState_Enable;//使能TIM_OC2Init(TIM3,&TIM_OCInitTypestucture);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能预装载TIM_Cmd(TIM3,ENABLE);//使能定时器}*******************************************************************************主函数#include "stepmotor.h"#include "stm32f10x.h"#include "delay.h"#include "timer.h"int main(){delay_init();Motor_Init();TIM3_PWM_Init(999,71);// 72M/(71+1)(999+1)=1K hzwhile(1) //正转{GPIO_SetBits(GPIOB,GPIO_Pin_5| GPIO_Pin_7| GPIO_Pin_8);//0111GPIO_ResetBits(GPIOB,GPIO_Pin_3);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_7| GPIO_Pin_8);//1011GPIO_ResetBits(GPIOB,GPIO_Pin_5);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_8);//1101GPIO_ResetBits(GPIOB,GPIO_Pin_7);delay_ms(4);GPIO_SetBits(GPIOB,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_7);//1110GPIO_ResetBits(GPIOB,GPIO_Pin_8);delay_ms(4);}}。
步进电机驱动程序(二相四线可使用4、8节拍)

以下是STM32F1的代码部分(我是按照8拍的方式写的)
硬件的连线方式单片机IO口PB12 电机A+
PB13 电机A-
PB14 电机B+
PB14 电机B-
#define AA_H GPIO_SetBits(GPIOB, GPIO_Pin_12 ); #define AA_L GPIO_ResetBits(GPIOB, GPIO_Pin_12 ); #define AD_H GPIO_SetBits(GPIOB, GPIO_Pin_13 ); #define AD_L GPIO_ResetBits(GPIOB, GPIO_Pin_13 ); #define BA_H GPIO_SetBits(GPIOB, GPIO_Pin_14 ); #define BA_L GPIO_ResetBits(GPIOB, GPIO_Pin_14 ); #define BD_H GPIO_SetBits(GPIOB, GPIO_Pin_15 ); #define BD_L GPIO_ResetBits(GPIOB, GPIO_Pin_15 );
void motor_run(void) { AA_H; AD_L; BA_L; BD_L; delay_ms(5); AA_H; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_L; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_H; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_L; delay_ms(5); AA_L; AD_H; BA_L; BD_H; delay_ms(5); AA_L; AD_L; BA_L; BD_H; delay_ms(5); AA_H; AD_L; BA_L; BD_H; delay_ms(5); }
步进电机内部结构、驱动原理图和汇编程序

步进电机在控制系统中具有广泛的应用。
它可以把脉冲信号转换成角位移,并且可用作电磁制动轮、电磁差分器、或角位移发生器等。
有时从一些旧设备上拆下的步进电机(这种电机一般没有损坏)要改作它用,一般需自己设计驱动器。
本文介绍的就是为从一日本产旧式打印机上拆下的步进电机而设计的驱动器。
本文先介绍该步进电机的工作原理,然后介绍了其驱动器的软、硬件设计。
1. 步进电机的工作原理该步进电机为一四相步进电机,采用单极性直流电源供电。
只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。
图1是该四相反应式步进电机工作原理示意图。
图1 四相步进电机步进示意图开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。
当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。
而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。
依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。
四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。
单四拍与双四拍的步距角相等,但单四拍的转动力矩小。
八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。
单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示:a. 单四拍b. 双四拍c八拍图2.步进电机工作时序波形图2.基于AT89C2051的步进电机驱动器系统电路原理步进电机驱动器系统电路原理如图3:图3 步进电机驱动器系统电路原理图AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。
(整理)51单片机驱动步进电机电路及程序1.

在这里介绍一下用51单片机驱动步进电机的方法。
这款步进电机的驱动电压12V,步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、 5:黄色、6:黑色。
采用51驱动ULN2003的方法进行驱动。
ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。
;******************************************************************** *************;**************************** 步进电机的驱动***************************************; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19;---------------------------------------------------------------------------------; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 本步进电机步进角为 7.5度 . 一圈 360 度 , 需要 48 个脉冲完成!!!;---------------------------------------------------------------------------------; A组线圈对应 P2.4; B组线圈对应 P2.5; C组线圈对应 P2.6; D组线圈对应 P2.7; 正转次序: AB组--BC组--CD组--DA组 (即一个脉冲,正转 7.5 度);----------------------------------------------------------------------------------;---------------------------- 正转--------------------------ORG 0000HLJMP MAINORG 0100HMAIN:MOV R3,#144 正转 3 圈共 144 脉冲START:MOV R0,#00HSTART1:MOV P2,#00HMOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START 对 A 的判断,当 A = 0 时则转到 STARTMOV P2,ALCALL DELAYINC R0DJNZ R3,START1MOV P2,#00HLCALL DELAY1;-----------------------------反转------------------------MOV R3,#144 反转一圈共 144 个脉冲START2:MOV P2,#00HMOV R0,#05START3:MOV A,R0MOV DPTR,#TABLEMOVC A,@A+DPTRJZ START2MOV P2,ACALL DELAYINC R0DJNZ R3,START3MOV P2,#00HLCALL DELAY1LJMP MAINDELAY: MOV R7,#40 步进电机的转速M3: MOV R6,#248DJNZ R6,$DJNZ R7,M3RETDELAY1: MOV R4,#20 2S 延时子程序DEL2: MOV R3,#200DEL3: MOV R2,#250DJNZ R2,$DJNZ R3,DEL3DJNZ R4,DEL2RETTABLE:DB 30H,60H,0C0H,90H 正转表DB 00 正转结束DB 30H,90H,0C0H,60H 反转表DB 00 反转结束END。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附件:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP Speed_Up
ORG 0013H
LJMP Speed_Down
ORG 0100H
MAIN:
;打开外部中断IT0/IT1
SETB EA
SETB EX0
SETB EX1
SETB IT0
SETB IT1
;扫描键盘,无键按下显示0,并继续扫描
MAKEY:
MOV DPTR,#TAB
MOV A,#0
MOVC A,@A+DPTR
MOV P0,A
MOV P3,#0FFH
MOV A,P3
CPL A
JZ MAKEY
LCALL D10MS
JZ MAKEY
;当有键按下时,启动步行电机转动
Speed EQU 20H
Num EQU 21H
MOV Speed,#60 ;Speed初始化,Speed控制延时的时间,即脉冲的频率
MOV Num,#1 ;Num初始化,Num存放数码管显示的转速数值
JNB ACC.4,TO_TWO ;默认设置为正向转动,转速为1,当有反向键按下,按反向转动
;------------------------ 1号程序:控制步行电机正转--------------------------------
TO_ONE:
MOV R7,#4
MOV A,#01H
MOV P3,#0FFH
LP1:
MOV P1,A
LCALL DELAY
LCALL DISPLAY
RL A ; 正向输入脉冲信号
DJNZ R7,LP1
JNB P3.4,TO_TWO ; 有反向键按下,跳转到2号程序
LJMP TO_ONE
;------------------------2号程序:控制步行电机反转---------------------------------- TO_TWO:
MOV R7,#4
MOV A,#08H
MOV P3,#0FFH
LP2:
MOV P1,A
LCALL DELAY
LCALL DISPLAY
RR A ; 反向输入脉冲信号
DJNZ R7,LP2
JNB P3.5,TO_ONE ;有正向键按下,跳转到1号程序
LJMP TO_TWO
;----------------------------中断服务程序----------------------------------------------- Speed_Up: ; 外部中断IT0,控制加速
PUSH ACC
LCALL D10MS
MOV A,Speed
CJNE A,#12,L1 ; 最大速度时,速度不再增加
LJMP L2
L1: ; 速度加1(减小脉冲周期)
SUBB A,#12
MOV Speed,A
INC Num
L2: POP ACC
RETI
Speed_Down: ;外部中断IT1,控制减速
PUSH ACC
LCALL D10MS
MOV A,Speed
CJNE A,#60,L3 ;最小速度时,速度不再减小
LJMP L4
L3: ;速度减1(增大脉冲周期)
ADD A,#12
MOV Speed,A
DEC Num
L4: POP ACC
RETI
;----------------------------------延时、显示子程序--------------------------------------------- DISPLAY: ;显示子程序,显示步行电机的转速
PUSH ACC
MOV A,Num
MOVC A,@A+DPTR
MOV P0,A
POP ACC
RET
DELAY: ;延时子程序,用于产生脉冲信号,并可通过改变延时来改变脉冲的频率PUSH ACC
MOV R6,Speed
d1:
MOV R5,#100
DJNZ R5,$
DJNZ R6,d1
POP ACC
RET
D10MS: ;延时10ms,软件去抖动
MOV R4,#10
D1MS:
MOV R3,#249
DL: NOP
NOP
DJNZ R3,DL
DJNZ R4,D1MS
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H ;速度显示:0~5
END。