步进电机驱动程序源码(步进电机驱动代码)
本文目录一览:
单片机控制步进电机
这是我自己做过的。源码都给你了
#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();函数里面,这个就是电机动一下的函数。
原程序不完整,没有相应函数、变量的定义及意义说明。难以确切理解。