求单片机控制步进电机简单的c程序

是用AT89S52单片机控制12V4相5线 步进电机 驱动芯片是UL2003
只要能控制电机 每隔1秒转几圈就行了
请各位大侠们帮一下忙 急用!非常感谢~
打个比方1秒转三圈 然后停止 要每次停止的位置不变 然后一秒后再转动 不断的重复

C语言程序如下:
#include<reg 51.h>
#define uint unsigned int
Sbit k1=p3.4;//启动开关
Sbit k2=p3.5;//换向开关
Sbit s2=p3.2;//加速按钮
Sbit s3=p3.3;//减速按钮
Void idr_int0(void);//外部中断0中断服务函数声明
Void idr_int1(void);
Void zd_t0ist(void);
Uint speed,count,r1,I,t,k;
Main()
{k=0;
T=0;
r1=0x11;
speed=0;
count=1;
tmod=0x01;
et0=1;
ea=1;
ex0=1;
ex1=1;
if(k2==0)
p0=0xbf;
else p0=0xf9;
if (speed==0)
{p2=0xc0;
Tr0=0;
}
Else tr0=1;
}
}
}
Void isr_int0(void)interrupt();
{
If(speed<7)
Speed=speed+1;
While(s2==0)
{For(i=0;i<10;i++);}
}
Void isr_int0(void)interrupt2;
Th0=0xcf;
Tl0=0x2c;
For(;;)
{
If (k1==0)
{p0=0xff;
P2=0xff;
Speed=0;
Tr0=0}
Else
{
If(k2==0)
P0=0xbf;
Else p0=0xf9;
If(speed==0)
{p2=0xc0;
Tr0=0;
}
Else tr0=1;
}
}
}
Void isr_int0(void)interrupt()
{
If(speed<7)
Speed=speed+1;
While(s2==0)
{for(i=0;i<10;i++);}
}
Void isr_int1(void)interrupt2
{
If(speed>0)
Speed=speed-1;
While(s3==0)
{for(i=0;;i<10;i++);}
}
Void zd_t0ist(void)interrupt 1
{
Th0=0xd8;
Tl0=0xf0;
Switch(speed)
{
Case0;p2=0xc0;count=0;break;
Case1;p2=0xf9;count=60;break;
Case2;p2=0xa4;count=40;break;
Case3;p2=0xb0;count=35break;
Case4;p2=0x99;count=30;break;
Case5;p2=0x92;count=28;break;
Case6;p2=0x82;count=25;break;
Case7;p2=0xf8;count=21;break;
Default:break;
}
If(t==0)
T=count;
If(t>0)
T=t-1;
If(k2==0)
{
If(t==0)
{
Switch(k)
{
Case0;p1=0x01;break;
Case1;p1=0x02;break;
Case2;p1=0x04;break;
Case3;p1=0x08;break;
Default:break;
}
k=k+1;
if(k==4)
k=0;
}
}
Else
{
If(t==0)
{
Switch(k)
{
Case0;p1=0x08;break;
Case1;p1=0x04;break;
Case2;p1=0x02;break;
Case3;p1=0x01;break;
Default:break;
}
K=k+1;
If(==4)
K=0;
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-15
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
#include <reg52.h>
unsigned char code F_Rotation[4]={0x08,0x10,0x20,0x40};//正转表格
unsigned char code B_Rotation[4]={0x40,0x20,0x10,0x08};//反转表格

void Delay(unsigned int i)//延时
{
while(--i);
}

main()
{

unsigned char i;

while(1)
{
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速
}
}
}追问

对了 请问下步进电机轴心所带动的的东西(比如指针类) 能精确的定位吗 (每一次停止的位置)

追答

这个应该没有, 不过 舵机 的话,有,舵机的具体型号你可以上网查查,做机器人用的一般多是端机,旋转185度,可分为 256格,单片机可精确控制

本回答被提问者和网友采纳
第2个回答  2020-04-22
几相的步进电机啊?用不用驱动芯片?用的话选什么型号的驱动芯片?你要说具体点啊!
先给你三相的,个不用驱动芯片的步进电机程序。(驱动电路自己做)
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uint
time
void
timer1(void)
interrupt
1
using
1{
//定时器0中断,定时1ms//
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
time++;
}
void
delay(uint
n){
//一般延时
while(--n);
}
void
delay(uint
dtime){
//延时
TR0=1;
while(time<=dtime);
time=0;
TR0=0;
}
void
moto(bit
cf,uchar
n,uint
dtime){
//电机驱动子程序,
uchar
idata
zhpai[4]={0x78,0xb8,0xd8,0xe8};
uchar
idata
fpai[4]={0xe8,0xd8,0xb8,0x78};
uchar
i,l=0;
if(cf==0)
//正转,A-B-C-A
for(i=0;i<n;i++){
P1=zhpai[l];//P1.7~1.4为输出口,分别为A、B、C、D
l++;
delay(dtime);
if(l==4)l=0;
}
else{
//反转,C-B-A-C
for(i=0;i<n;i++){
P1=fpai[l];
l++;
delay(dtime);
if(l==4)l=0;
}
}
}
void
main(){
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
while(1){
moto(0,4,70);//正转,转四相,每相间隔70ms
delay(10000);
moto(1,4,70);//反转,转四相,每相间隔70ms
delay(10000);
}
}
改为四相了,你看看吧。不懂再问吧。
第3个回答  2011-04-10
让步进电机一秒转几圈不大可能

单片机控制步进电机要求:有加速、减速、停止、正转、反转按钮,电机是四...
我用的是控制一个步进电机的,这个是我以前写的,你的要求在下面的程序做修改就行了;程序如下:include <reg52.h> define uchar unsigned char define uint unsigned int \/\/uchar table[]={0x18,0x30,0x60,0x48,0x48,0x60,0x30,0x18}; \/\/二相励磁 uchar table[]={0x08,0x10,0x20,0x...

求单片机c语言控制步进电机调速程序
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:include unsigned char code f_rotation[4]={0x08,0x10,0x20,0x40};\/\/正转表格 unsigned ...

单片机C语音控制步进电机正反转程序
首先,定义步进电机的四相绕组为A、B、C、D,通过脉冲控制其正反转。正转控制代码示例:c include define DELAY_1 0.001s void delay(int n){ int i;for (i = 0; i < n; i++);} void main(){ while (1){ \/\/ AB→BC→CD→DA→AB顺序脉冲输入 \/\/ 步进电机正转 P1 = 0x01; ...

步进电机驱动程序C语言
sbit bujin_zx_stop = P3^3; \/* 接步进电机 ,正向到位传感器 ,为 0 停机 *\/ sbit bujin_fx_stop = P3^4; \/* 接步进电机 ,反向到位传感器 ,为 0 停机 *\/ sbit shache = P3^5; \/* 接刹车控制继电器 0 电位有效 *\/ sbit pri_dj = P3^6; \/* 接主...

求用51型的单片机控制步进电机,要求步进电机转90度后停5秒,再转90度...
这两种驱动器的单片机程序当然是不一样的 用C语言编程很简单:(第一种驱动器)for(i=0;i<4;i++){ for(j=0;j<3;j++)\/\/循环3次每次4步,12步是90度 { P0=1;delay_ms(2);P0=2;delay_ms(2);P0=4;delay_ms(2);P0=8;delay_ms(2);} delay_ms(5000);} ...

求51单片机控制步进电机,实现其间歇运动的程序,最好要有C语言的
void qudong(unsigned char t,bit flag) \/\/ t范围0~4控制转速,flag表示正反转 { unsigned char zz,i;if(t) \/\/ 先判断t是否为0,如果是,就没必要进行下面的判断 { if(flag) \/\/flag=1;为正转 { switch(t) \/\/ 选出几级速度 { case 1: zz=4;break;case 2: zz=...

用单片机控制步进电机正反转,简单易懂的C语言程序,最好带注释,步进电机...
看题主的情况应该是不太了解编程,向你推荐表控,在不会编程的情况下,可以利用中文表格设置轻松实现步进电机的正反转。具体参见下图:第1行设置由输入端X1作为启动,Y1输出3万个脉冲,脉冲频率600赫兹(每秒600个脉冲的频率),由于只有Y1输出脉冲,没有设置方向输出端,所以电机正转。第3、4行由X2...

关于51单片机控制步进电机编程(c语言),求助
uchar key_l,key,i;uchar code temp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};uchar code temp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};uchar code aa[16]=" :";uchar code smg[]=" shun zhuan mian kuai gen kuai ting zhi fan zhuan ...

我想用STC12C5A60S单片机控制STI6608驱动步进电机动作,请问C程序怎么...
这个STI6608驱动器输入信号是Pluse+DIR方式控制,可以带2个步进电机。Reset可以置位步进电机到位置1。刚启动是置位1次就可以了。以下编一简单的演示程序:include<reg51.h>#define uchar unsigned char#define uint unsigned charsbit pluse1=P1^0;sbit pluse2=P1^1;sbit dir1=P1^2;sbit dir2=P1...

51单片机控制步进电机
下面是程序:include <reg51.h> \/\/选用晶振11.0592MHz unsigned int m=0,n=0; \/\/设置循环的周期 unsigned char start=0,t0temp=0;sbit Y0=P0^0; \/\/控制步进电机的管脚 delay(){ unsigned char i,j;for(i=m;i>0;i--)for(j=n;i>0;j--);} main(){ \/\/自检测T0时间设...

相似回答