求at89s51控制四项四拍步进电机的c语言驱动程序

求at89s51控制四项四拍步进电机的c语言驱动程序,第1张

#include <AT89X51h>

static unsigned int count; //计数

static int step_index; //步进索引数,值为0-7

static bit turn; //步进电机转动方向

static bit stop_flag; //步进电机停止标志

static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快

static int spcount; //步进电机转速参数计数

void delay(unsigned int endcount); //延时函数,延时为endcount05毫秒

void gorun(); //步进电机控制步进函数

void main(void)

{

count = 0;

step_index = 0;

spcount = 0;

stop_flag = 0;

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

EA = 1; //允许CPU中断

TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许

TH0 = 0xFE;

TL0 = 0x0C; //设定时每隔05ms中断一次

TR0 = 1; //开始计数

turn = 0;

speedlevel = 2;

delay(10000);

speedlevel = 1;

do{

speedlevel = 2;

delay(10000);

speedlevel = 1;

delay(10000);

stop_flag=1;

delay(10000);

stop_flag=0;

}while(1);

}

//定时器0中断处理

void timeint(void) interrupt 1

{

TH0=0xFE;

TL0=0x0C; //设定时每隔05ms中断一次

count++;

spcount--;

if(spcount<=0)

{

spcount = speedlevel;

gorun();

}

}

void delay(unsigned int endcount)

{

count=0;

do{}while(count<endcount);

}

void gorun()

{

if (stop_flag==1)

{

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

return;

}

switch(step_index)

{

case 0: //0

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 0;

break;

case 1: //0、1

P1_0 = 1;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 2: //1

P1_0 = 0;

P1_1 = 1;

P1_2 = 0;

P1_3 = 0;

break;

case 3: //1、2

P1_0 = 0;

P1_1 = 1;

P1_2 = 1;

P1_3 = 0;

break;

case 4: //2

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 0;

break;

case 5: //2、3

P1_0 = 0;

P1_1 = 0;

P1_2 = 1;

P1_3 = 1;

break;

case 6: //3

P1_0 = 0;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

break;

case 7: //3、0

P1_0 = 1;

P1_1 = 0;

P1_2 = 0;

P1_3 = 1;

}

if (turn==0)

{

step_index++;

if (step_index>7)

step_index=0;

}

else

{

step_index--;

if (step_index<0)

step_index=7;

}

}

自己再稍微改动一下

本人没用过A4988,但你给出的数据有明显错误:

1、VBB(电机电源):最小8V最大35V,你用(VMOT接+5V)5V;(A4988资料上没VMOT这一接口)。

2、ENABLE(使能)端口接+A4988才能工作,你给它0V即是叫它休息不必工作。

以上

转载

用单片机控制步进电机

步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

一、步进电机常识

常见的步进电机分三种:永磁式(PM),反应式(VR)和混合式(HB),永磁式步进一般为两相,转矩和体积较小,步进角一般为75度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为15度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为18度而五相步进角一般为072度。这种步进电机的应用最为广泛。

二、永磁式步进电机的控制

下面以电子爱好者业余制作中常用的永磁式步进电机为例,来介绍如何用单片机控制步进电机。

图1是35BY型永磁步进电机的外形图,图2是该电机的接线图,从图中可以看出,电机共有四组线圈,四组线圈的一个端点连在一起引出,这样一共有5根引出线。要使用步进电机转动,只要轮流给各引出端通电即可。将COM端标识为C,只要AC、C、BC、C,轮流加电就能驱动步进电机运转,加电的方式可以有多种,如果将COM端接正电源,那么只要用开关元件(如三极管),将A、B、 轮流接地。

下表列出了该电机的一些典型参数:

表1 35BY48S03型步机电机参数型号 步距角 相数 电压 电流 电阻 最大静转距 定位转距 转动惯量35BY48S03 75 4 12 026 47 180 65 25

有了这些参数,不难设计出控制电路,因其工作电压为12V,最大电流为026A,因此用一块开路输出达林顿驱动器(ULN2003)来作为驱动,通过P14~P17来控制各线圈的接通与切断,电路如图3所示。开机时,P14~P17均为高电平,依次将P14~P17切换为低电平即可驱动步进电机运行,注意在切换之前将前一个输出引脚变为高电平。如果要改变电机的转动速度只要改变两次接通之间的时间,而要改变电机的转动方向,只要改变各线圈接通的顺序。

图1 35BY48S03型步进电机外形图

图2 35BY48S03型步进电机的接线图

图3 单片机控制35BY48S03型步进电机的电路原理图

三、步进电机的驱动实例

要求:控制电路如图3所示,开机后,电机不转,按下启动键,电机旋转,速度为25转/分,按下加1键,速度增加,按下减1键,速度降低,最高速度为100转/分,最低转带为25转/分,按下停止键,电机停转。速度值要求在数码管上显示出来。

1.要求分析

按上面的分析,改变转速,只要改变P10~P13轮流变低电平的时间即可达到要求,这个时间不应采用延时来实现,因为会影响到其他功能的实现。这里以定时的方式来实现。下面首先计算一下定时时间。

按要求,最低转速为25转/分,而上述步进电机的步距角为75,即每48个脉冲为1周,即在最低转速时,要求为1200脉冲/分,相当于50ms/脉冲。而在最高转速时,要求为100转/分,即48000脉冲/分,相当于125ms/脉冲。可以列出下表

表1 步进电机转速与定时器定时常数关系

速度 单步时间(us) TH1 TL1 实际定时(us)

25 50000 76 0 499968

26 48077 82 236 4807418

27 46296 89 86 4629261

28 44643 95 73 44640155

⋯ … … … …

100 12500 211 0 124992

表中不仅计算出了TH1和TL1,而且还计算出了在这个定时常数下,真实的定时时间,可以根据这个计算值来估算真实速度与理论速度的误差值。

表中TH1和TL1是根据定时时间算出来的定时初值,这里用到的晶振是110592M。有了上述表格,程序就不难实现了,使用定时/计数器T1为定时器,定时时间到后切换输出脚即可。

2.程序实现

定义DSB-1A实验板的S1为启动键,S2为停止键,S3为加1键,S4为减1键,程序如下:

StartEnd bit 01H ;起动及停止标志

MinSpd EQU 25 ;起始转动速度

MaxSpd EQU 100 ;最高转动速度

Speed DATA 23H ;流动速度计数

DjCount DATA 24H ;控制电机输出的一个值,初始为11110 111

Hidden EQU 10H ;消隐码

Counter DATA 57H ;显示计数器

DISPBUF DATA 58H ;显示缓冲区

ORG 0000H

AJMP MAIN

ORG 000BH

JMP DISP

ORG 001BH

JMP DJZD

ORG 30H

MAIN:

MOV SP,#5FH

MOV P1,#0FFH

MOV A,#Hidden

MOV DispBuf,A

MOV DispBuf+1,A

MOV DispBuf+2,A

MOV DjCount,#11110111B

MOV SPEED,#MinSpd;起始转动速度送入计数器

CLR StartEnd;停转状态

MOV TMOD,#00010001B ;

MOV TH0,#HIGH(65536-3000)

MOV TL0,#LOW(65536-3000)

MOV TH1,#0FFH;

MOV TL1,#0FFH

SETB TR0

SETB EA

SETB ET0

SETB ET1

LOOP: ACALL KEY ;键盘程序

JNB F0,m_NEXT1 ;无键继续

ACALL KEYPROC ;否则调用键盘处理程序

m_NEXT1:

MOV A,Speed

MOV B,#10

DIV AB

MOV DispBuf+5,B ;最低位

MOV B,#10

DIV AB

MOV DispBuf+4,B

MOV DispBuf+3,A

JB StartEnd,m_Next2

CLR TR1 ;关闭电机

JMP LOOP

ORL P1,#11110000B

m_Next2:

SETB TR1 ;启动电机

AJMP LOOP ;主程序结束

;---------------------------------------

D10ms:

⋯⋯

;---------延时程序,键盘处理中调用

KEYPROC:

MOV A,B ;获取键值

JB ACC2,StartStop ;分析键的代码,某位被按下,则该位为1

JB ACC3,KeySty

JB ACC4,UpSpd

JB ACC5,DowSpd

AJMP KEY_RET

StartStop:

SETB StartEnd 启动

AJMP KEY_RET

KeySty:

CLR StartEnd; ;停止

AJMP KEY_RET

UpSpd:

INC SPEED;

MOV A,SPEED

CJNE A,#MaxSpd,K1 ;到了最多的次数

DEC SPEED ;是则减去1,保证下次仍为该值

K1:

AJMP KEY_RET

DowSpd:

DEC SPEED

MOV A,SPEED

CJNE A,#MAXSPD,KEY_RET;不等(未到最大值),返回

MOV SPEED,#MinSpd;

KEY_RET:

RET

KEY:

⋯⋯获取键值的程序

RET

DjZd: ;定时器T1用于电机转速控制

PUSH ACC

PUSH PSW

MOV A,Speed

SUBB A,#MinSpd ;减基准数

MOV DPTR,#DjH

MOVC A,@A+DPTR

MOV TH1,A

MOV A,Speed

SUBB A,#MinSpd

MOV DPTR,#DjL

MOVC A,@A+DPTR

MOV TL1,A

MOV A,DjCount

CPL A

ORL P1,A

MOV A,DjCount

JNB ACC7,d_Next1

JMP d_Next2

d_Next1:

MOV DjCount,#11110111B

d_Next2:

MOV A,DjCount

RL A

MOV DjCount,A ;回存

ANL P1,A

POP PSW

POP ACC

RETI

DjH: DB 76,82,89,95,100,106,110,115,119,123,12……

DjL: DB 0,236,86,73,212,0,214,96,163,165

⋯⋯

DISP: ;显示程序

POP PSW

POP ACC

⋯⋯

RETI

BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH

DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH

END

3.程序分析

本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器的高3位消隐,步进电机驱动的各引脚均输出高电平,然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序,否则直接转下一步。下一步是将当前的转速值转换为BCD码,送入显示缓冲区;接着判断StartEnd这个位变量,是“1”还是“0”,如果是“1”,则开启定时器T1,否则关闭定时器T1,为防止关闭时某一相线圈长期通电,因此,在关闭定时器T1时,将P10~P13均置高。至此,主程序的工作即结束。这里为简便起见,这里没有做高位“0”消隐的工作,即如果速度为10转/分,则显示值“010”,读者可以自行加入相关的代码来处理这一工作。

步进电机的驱动工作是在定时器T1的中断服务程序中实现的,由前述分析,每次的定时时间到达以后,需要将P10~P13依次接通,程度中用了一个变量DjCntr来实现这一功能,在主程序初始化时,该变量被赋予初值11110111B,进入到定时中断以后,将该变量取出送ACC累加器,并在累加器中进行左移,这样,该数值就变为11101111,然后将该数与P1相“与”,此时,P14即输出低电平,第二次进入中断时,先将该数取反,成为0001 0000,然后将该数与P1相“或”,这样,P14即输出高电平,关断了相应的线圈,然后将该数重新取出,并作左移,即 1110,1111右移成为1101 1111,将该数与P1相“与”,这样P15即输出低电平,依次类推,P17~P14即循环输出低电平。当这一数据变为01111111后,需要作适当的改动,将数据重新变回 1111 0111,进行第二次循环,相关代码,请读者自行分析。

定时时间又是如何确定的呢?这里用的是查表的方法,首先用Excel计算得出在每一种转速下的TH值和TL值,然后,分别放入DjH和DjL表中,在进入T1中断程序之后,将速度值变量Speed送入累加器ACC,然后减去基数25,使其基数从0开始计数,然后分别查表,送入TH1和TL1,实现重置定时初值的目的。

看完这一部份内容以后,请读者自行完成以下工作:

1. 更改程序,将S1定义为“启动/停止”,而S2定义为“方向”,按下S2,切换电机旋转方向。

2. 更改程序,要求转速从1到100。

3. 更改程序,实现首位无效零消隐。

;步进电机正转

loop:mov R3,#0FFh ;30h送ff即-1

main:INC R3

mov a,R3

tt: MOV DPTR,#TAB

MOVC A,@A+DPTR

MOV P1,A ;送显示

mov r7,#5

dec r7

lcall delay ;延时一段时间

cjne a,#06H,main ;如果是最后一个数据重新开始

ljmp loop ; 否则R3 清除

ret

TAB: DB 03H,09H,0CH,06H ;步进电机正转表

DELAY: ; 延时程序

MOV R5,#255

D3:MOV R2,#25

D4: DJNZ R2,D4

DJNZ R5,D3

RET

;步进电机控制程序p32正转,p33反转,p34停止 步进电机接p10p11p12p13

org 00h

stop: orl p1,#0ffh ; 步进电机停止

loop:jnb p32,for2 ; 如果p32按下正转

jnb p33,rev2 ; 如果p33按下反转

jnb p34,stop1 ; 如果p34按下停止

jmp loop ;反复监测键盘

for: mov r0,#00h ;正转到tab取码指针初值

for1:mov a,r0 ;取码

mov dptr,#table ;

movc a,@a+dptr

jz for ;是否到了结束码00h

cpl a ;把acc反向

mov p1,a ;输出到p1开始正转

jnb p34,stop1 ; 如果p34按下停止

jnb p33,rev2 ; 如果p33按下反转

call delay ;转动的速度

inc r0 ;取下一个码

jmp for1 ;继续正转

rev:mov r0,#05h ;反转到tab取码指针初值

rev1:mov a,r0

mov dptr,#table ;取码

movc a,@a+table

jz rev ;是否到了结束码00h

cpl a ;把acc反向

mov p1,a ;输出到p1开始反转

jnb p34,stop1 ; 如果p34按下停止

jnb p33,rev2 ; 如果p33按下反转

call delay ;转动的速度

inc r0 ;取下一个码

jmp rev1 ;继续反转

stop1:call delay ; 按p34的消除抖动

jnb p34,$ ; p34放开否

call delay ;放开消除抖动

jmp stop

for2:call delay ; 按p32的消除抖动

jnb p32,$ ; p32放开否

call delay ;放开消除抖动

jmp for

rev2:call delay ; 按p33的消除抖动

jnb p33,$ ; p33放开否

call delay ;放开消除抖动

jmp rev

delay:mov r1,#40 ;步进电机的转速20ms

d1:mov r2,#248

djnz r2,$

djnz r1,d1

ret

table:

db 03h,09h,0ch,06h ;正转表

db 00 ;正转结束

db 03h,06h,0ch,09h ;反转

db 00 ;反转结束

end

;步进电机正转,反转各3圈

org 00h

x1:mov r3,#250

start:mov r0,#00h

start1:

mov p1,#0ffh

mov a,r0

mov dptr,#table

movc a,@a+dptr

jz start

cpl a

mov p1,a

call delay

inc r0

djnz r3,start1

mov r3,#250

start2:

mov p1,#0ffh

mov r0,#05

start3:mov a,r0

mov dptr,#table

movc a,@a+dptr

jz start2

cpl a

mov p1,a

call delay

inc r0

djnz r3,start3

jmp x1

delay: mov r5,#40;延时。

d1: mov r6,#10

d2: mov r7,#18

djnz r7,$

djnz r6,d2

djnz r5,d1

ret

table:

db 03h,09h,0ch,06h

db 00

db 06h,0ch,09h,03h

db 00

end

;步进电机正反快慢程序

org 00h

x1:mov r3,#48 ;一圈48步

start:mov r0,#00h ;正转取码初值

start1:

mov p1,#0ffh ;先停止

mov a,r0

mov dptr,#table

movc a,@a+dptr

jz start ;是否到了结束码00?

cpl a

mov p1,a ;输出运转

call delay ;调用慢速的延时转动

inc r0 ;取码指针加1取下一个码

djnz r3,start1 ;是否走了48步?

mov r3,#48 ;是则重新设定48步

start2:

mov p1,#0ffh

mov r0,#05 ;逆转的取码初值

start3:mov a,r0

mov dptr,#table

movc a,@a+dptr

jz start2

cpl a

mov p1,a

call delay2

inc r0

djnz r3,start3

jmp x1 ; 重复开始

DELAY: ; 延时程序 (慢速)

MOV R7,#255

D1:MOV R6,#50

D2: DJNZ R6,D2

DJNZ R7,D1

RET

DELAY2: ; 延时程序 (快速)

MOV R5,#255

D3:MOV R2,#25

D4: DJNZ R2,D4

DJNZ R5,D3

RET

table:

db 03h,09h,0ch,06h ;正转表

db 00

db 06h,0ch,09h,03h ;反转表

db 00

end

;遥控电机程序, 按遥控器0-9步进电机正转0-9步,按遥控器11-19步进电器分别反转

;0-9步,同时数码管分别显示当前的数字!

org 00h

JMP MAIN

ORG 30H

MAIN:

MOV P1,#0FFH

MOV P2,#0FFH

MOV P3,#0FFH

START:

JB P37,$ ;等待遥控信号出现

SB:

MOV R4,#8 ;8毫秒为高电平错误

SBA:

MOV R5,#250

SBB:

JB P37,SXB1

DJNZ R5,SBB

DJNZ R4,SBA

MOV R4,#2

JMP SBC

SXB1:

MOV R5,#5

SXB2: ;去掉20US的尖峰干扰信号

JNB P37,SBB

DJNZ R5,SXB2

JMP START

SBC:

MOV R5,#250

SB1:

JB P37,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)

DJNZ R5,SB1

DJNZ R4,SBC

JMP START

SB2: ;去掉20US的尖峰干扰信号

MOV R5,#5

SB2_A:

JNB P37,SB1

DJNZ R5,SB2_A

MOV R4,#3

SB2_1:

MOV R5,#250

SB3: ;监测45MS高电平,如3MS内出现低电平错误

JNB P37,SXC

DJNZ R5,SB3

DJNZ R4,SB2_1

MOV R4,#2

JMP SB3_1

SXC: ;去掉20US的尖峰干扰信号

MOV R5,#5

SXC1:

JB P37,SB3

DJNZ R5,SXC1

JMP START

SB3_1: ;监测45MS高电平,如5MS内不为低电平错误

MOV R5,#250

SB3_2:

JNB P37,SB4

DJNZ R5,SB3_2

DJNZ R4,SB3_1

JMP START

SB4: ;去掉20US的尖峰干扰信号

MOV R5,#5

SB4_1:

JB P37,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 P37,JJJJ3

DJNZ R5,JJJJ2

JMP START

JJJJ3:

LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

MOV C,P37 ;将P37引脚此时的电平状态0或1存入C中

JNC UUU ;如果为0就跳转到UUU

MOV R5,#250

JJJJ4:

JNB P37,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 P26 ;选中数码管

CLR P33 ;解码成功喇叭响

AJMP BIJIAO

;判断在118毫秒内是否有连发码

AA: MOV R1,#25

XX: ACALL YS2

JNB P37,HH ;跳转到判断连发代码是否正确的程序段

DJNZ R1,XX

EXIT: ;对所有端口清零

AJMP START

;连发码判断程序段-----------

HH: MOV R6,#4

S: ACALL YS1 ;调用882微秒延时子程序

JB P37,EXIT ;延时882微秒后判断P37脚是否出现高电平如果有就退出解码程序

DJNZ R6, S ;重复4次,目的是确认连发码的低电平信号波形

JNB P37, $ ;等待高电

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 P26 ;开显示

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 P26 ;开显示

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

以上就是关于求at89s51控制四项四拍步进电机的c语言驱动程序全部的内容,包括:求at89s51控制四项四拍步进电机的c语言驱动程序、STM32F10驱动A4988步进电机驱动模块程序、讨个步进电机的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10077972.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存