b2c信息网

您现在的位置是:首页 > 热点问题 > 正文

热点问题

步进电机驱动程序源码(步进电机驱动代码)

hacker2022-10-04 11:55:17热点问题89
本文目录一览:1、单片机控制步进电机2、

本文目录一览:

单片机控制步进电机

这是我自己做过的。源码都给你了

#includereg52.h

#includeintrins.h

#includeabsacc.h

#includestring.h

#define uchar unsigned char

#define uint unsigned int

uint count; //当前计数值

uint distance;

bit intt=1;

unsigned char cont=0;

unsigned char co=0;

uchar buf;

//uchar m,lm,cm;

/**************针脚定义************/

sbit rect_wave=P2^0; //晶振控制信号

sbit RS=P1^0;

sbit RW=P1^1;

sbit EN=P1^2;

sbit CLR=P1^3;

sbit DATA=P1^4;

sbit CLK=P1^5;

sbit d=P2^1;

sbit cp=P2^2;

sbit dir=P2^3;

/***********************************/

/**************函数声明************/

void time0over(void); //定时器计时程序

void clrlcd(void); //clr LCD

void c_send(unsigned char y); //发命令

void reset(void); // reset LCD

void d_send(unsigned char x); //发数据

void pos(unsigned char pos); //设定显示位置

void l_delay(unsigned int t); //长延时

void trans(j);

void ret(void); //初始化系统

void retcont(void); //定时器复位

void math(void); //计算测量距离

/***************************/

void init(void)

{ TH1=0xf3;

TL1=0xf3;

PCON=0x80;

TR1=1;

SCON=0x50; /*串口初始化设置,波特率4800BPS*/

}

//*******************************//

void send(uchar dat) /*发送子程序*/

{ //uchar i;

/*发送一个数据*/

SBUF=dat;

while(TI==0);

TI=0;

}

/***********************************/

void turn (void) //电机转动控制

{

unsigned char x;

cont++;

cp=~cp;

l_delay(50);

cp=~cp;

co++;

if(co == 3)

{d=~d;

}

if(co == 4)

{d=~d;

co=0;

}

if (cont == 200) //判断是否进行反转复位

{dir=~dir;

cont=0;

for(x=0;x 200;x++)

{cp=~cp;

l_delay(5);

cp=~cp;

co++;

if(co == 3)

{d=~d;

}

if(co == 4)

{d=~d;

co=0;

}

}

dir=~dir;

cont=0;

}

}

/**************子程序**********************/

void int0 () interrupt 0 //中断0服务程序

{

EX0=0; //关闭中断

TR0=0; //关闭定时器

TF0=0; //标志位清零

rect_wave=0; //停止发送超声波

intt=0;

}

void work(void)

{

if(!intt)

{

intt=1;

if (distance 400)

{

buf=distance;

send(buf);

turn();

math();} //计算所测得的距离

l_delay(5); //延时

retcont(); //定时器复位

rect_wave=1;

count=0;

}

}

void math(void) //计算所测得的距离

{ uchar m,lm,cm;

cm=distance%10; //取距离的最低位

distance=distance/10; //取距离的次高位

lm=distance%10;

distance=distance/10; //取距离的最高位

m=distance%10;

clrlcd(); //输出计算结果

pos(0);

d_send('d');

d_send('i');

d_send('s');

d_send('=');

//pos(4);

d_send(m+0x30);

d_send(lm+0x30);

d_send(cm+0x30);

d_send('c');

d_send('m');

l_delay(500);

}

void time0over(void) //定时器计时程序

{ TF0=0;

count++;

distance=count;

}

/*

void trans(j)

{

switch(j)

{

case 0: d_send('0');break;

case 1: d_send('1');break;

case 2: d_send('2');break;

case 3: d_send('3');break;

case 4: d_send('4');break;

case 5: d_send('5');break;

case 6: d_send('6');break;

case 7: d_send('7');break;

case 8: d_send('8');break;

case 9: d_send('9');break;

}

}

*/

delay() //延时

{

int i;

for(i=0;i1000;i++);

}

void l_delay(unsigned int t) //延时

{

unsigned int p;

unsigned int j;

for(j=0;jt;j++)

{

for(p=0;p1000;p++);

}

}

void reset(void) // reset LCD

{

delay();

c_send(0x38);

c_send(0x01);

c_send(0x06);

c_send(0x0c);

c_send(0x80);

}

void clrlcd(void) // clr LCD

{

delay();

c_send(0x01);

}

void pos(unsigned char pos) //设定显示位置

{

c_send(pos | 0x80);

}

void c_send(unsigned char y) //发命令

{

unsigned char i;

EN=1;

RS=0;

RW=0;

for(i=0;i8;i++)

{

if(_crol_(y,i)0x80)

DATA=1;

else

DATA=0;

CLK=0;

CLK=1;

}

EN=0;

delay();

}

void d_send(unsigned char x) //发数据

{

unsigned char i;

EN=1;

RS=1;

RW=0;

for(i=0;i8;i++)

{

if(_crol_(x,i)0x80)

DATA=1;

else

DATA=0;

CLK=0;

CLK=1;

}

EN=0;

delay();

}

void ret(void) //初始化计数器

{ TMOD=0x22; //设置定时器计数器1为工作方式2

TH0=0xc6; //设置计数初值高字节

TL0=0xc6; //设置计数初值低字节

count=0;

IE=0x00; //禁止中断

TF0=0; //溢出标志位清零

TR0=1; //打开定时器1

rect_wave=1;

EA=1; //打开中断

IP=0x01; //外部中断0为高中断优先级

IT0=0; //外部中断低电平触发シ?

EX0=1;

}

void retcont(void)

{ TF0=0; //溢出标志位清零

TR0=1; //打开定时器1

EA=1; //打开中断

IP=0x01; //外部中断0为高中断优先级

IT0=0; //外部中断下降沿触发

EX0=1;

rect_wave=1;

}

/**************主程序************/

void main(void)

{ rect_wave=0;

reset();

l_delay(10);

ret();

init();

math();

for(;;)

{

if(TF0)

{

time0over();

}

work();

}

}

怎样用51单片机接两相步进电机驱动器来控制步进电机?

脉冲信号就是像流水灯差不多,用两个口。

例如:

用到P1^0和P1^1;把P10制低电平,P11制高电平,延时一段时间后,P10制高电平 P11制低电平,如此循环,看程序:

#include "reg52.h"

sbit P10=P1^0;

sbit P11=P1^1;

void delay(unsigned int x)

P10=0;P11=1;

delay(1000);

P10=1;P11=0;

delay(1000);

}

}1-B1-B1A0;

两相四线程序  接P1口

#include "reg52.h"

#define uint unsigned int

#define uchar unsigned char

uchar code tab[]={0xfd,0xfb,0xf7,0xef};

uint i;

void delay(uint x)

{

uint y;

for(;x0;x--)

{

for(y=0;y124;y++);

void main()

while(1)

P1=tab[i];

i++;

if(i==4)

{

i=0;

}

delay(20);

扩展资料:

同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS,和WINBOND等;

常说的已经停产的89C51指的是ATMEL公司的 AT89C51单片机,同时是在原基础上增强了许多特性,如时钟,更优秀的是由Flash(程序存储器的内容至少可以改写1000次)存储器取代了原来的ROM(一次性写入),AT89C51的性能相对于8051已经算是非常优越的了。

参考资料来源:百度百科-步进电机

C语言 步进电机的正反转 启停 控制程序 求解释

中断2,启动-停止切换(通过切换flag_status),显示状态。do-while是延时。

中断1,计数器count增1,如果达到预设的数值tab[sp],计数器归零,标志flag置1。这个好像与速度有关。通过调整延时时间来调整速度。

中断0,读键盘。没有scan_key()的源代码,不知道里面有些什么操作。

while(1){...}循环是电机运转,flag_status是状态,1转动,0停止。

没有看到与正转反转有关的代码。也许在motor_cw_ccw();函数里面,这个就是电机动一下的函数。

原程序不完整,没有相应函数、变量的定义及意义说明。难以确切理解。

发表评论

评论列表

  • 鸢旧同尘(2022-10-04 12:11:29)回复取消回复

    // reset LCD{ delay(); c_send(0x38); c_send(0x01); c_send(0x06); c_send(0x0c); c_send(0x80);}void clrlcd(void) //