求单片机控制步进电机简单的c程序
是用AT89S52单片机控制12V4相5线步进电机驱动芯片是UL2003只要能控制电机每隔1秒转几圈就行了请各位大侠们帮一下忙急用!非常感谢~打个比方1秒转三圈然后停止要...
是用AT89S52单片机控制12V4相5线 步进电机 驱动芯片是UL2003
只要能控制电机 每隔1秒转几圈就行了
请各位大侠们帮一下忙 急用!非常感谢~
打个比方1秒转三圈 然后停止 要每次停止的位置不变 然后一秒后再转动 不断的重复 展开
只要能控制电机 每隔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;
}
}
}
#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;
}
}
}
德晟智能
2024-09-04 广告
2024-09-04 广告
舵机伺服电机是一种在自动控制系统中广泛应用的执行元件。它具有快速响应、精准定位的特点,能够将电压信号转化为转矩和转速,以驱动控制对象。在东莞市德晟智能科技有限公司的产品中,舵机伺服电机扮演着重要的角色,广泛应用于各种精密电子设备、交通运输工...
点击进入详情页
本回答由德晟智能提供
展开全部
给你一段简单的程序代码,控制步进电机的,不过你要好好看看程序的编写,以适应你的硬件(主要是连线),你可以在实现这个的基础上实现你所说的目标,个人觉得你参考这个程序然后自己实现你所说的功能比较好:
#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); //改变这个参数可以调整电机转速
}
}
}
#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格,单片机可精确控制
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
几相的步进电机啊?用不用驱动芯片?用的话选什么型号的驱动芯片?你要说具体点啊!
先给你三相的,个不用驱动芯片的步进电机程序。(驱动电路自己做)
#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);
}
}
改为四相了,你看看吧。不懂再问吧。
先给你三相的,个不用驱动芯片的步进电机程序。(驱动电路自己做)
#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);
}
}
改为四相了,你看看吧。不懂再问吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
让步进电机一秒转几圈不大可能
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询