我想用STC12C5A60S单片机控制STI6608驱动步进电机动作,请问C程序怎么写

我想用STC12C5A60S单片机控制STI6608驱动步进电机动作,请问C程序怎么写,第1张

这个STI6608驱动器输入信号是Pluse+DIR方式控制,可以带2个步进电机。Reset可以置位步进电机到位置1。刚启动是置位1次就可以了。以下编一简单的演示程序:

#include<reg51h>

#define uchar unsigned char

#define uint unsigned char

sbit pluse1=P1^0;

sbit pluse2=P1^1;

sbit dir1=P1^2;

sbit dir2=P1^3;

sbit reset1=P1^4;

sbit reset2=P1^5;

void delay(uint a)

{

uint i;

while(a--)for(i=0;i<1100;i++);

}

main()

{

uint i;

reset1=0;

reset2=0;

delay(1000);

reset1=1;

reset2=1;

while(1)

    {

    for(i=0;i<4800;i++)

        {

        pluse1=~pluse1;

        dir1=1;

        delay(5);

        }

    for(i=0;i<4800;i++)

        {

        pluse2=~pluse2;

        dir2=1;

        delay(5);

        }

    for(i=0;i<4800;i++)

        {

        pluse1=~pluse1;

        dir1=0;

        delay(5);

    for(i=0;i<4800;i++)

        {

        pluse2=~pluse2;

        dir2=0;

        delay(5);

        }        

    }

}

#include<reg52h>

#include<intrinsh>

#define mode 0x81 // 方式0,A口、B口输出,C口高4位输出,低4位输入

# include "stdioh"

# include "stringh"

# include "mathh"

xdata unsigned char PA _at_ 0x7f00;

xdata unsigned char PB _at_ 0x7f01;

xdata unsigned char PC _at_ 0x7f02;

xdata unsigned char caas _at_ 0x7f03; //控制字

sbit P32=P3^2;

sbit P33=P3^3;

sbit P35=P3^5;

#define uchar unsigned char

#define uint unsigned int

unsigned char h,Pos ;

unsigned int R,NX,NY;

unsigned char key;

code unsigned char KeyTable[] = { // 键码定义

0x0f, 0x0b, 0x07, 0x03,

0x0e, 0, 0x06, 0x02,

0x0d, 0x09, 0x05, 0x01,

0x0c, 0x08, 0x04, 0x00

};

code unsigned char LEDMAP[] = { // 八段管显示码

0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,

0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71

};

unsigned char Code_ ; // 字符代码寄存器

#define PD1 61 // 122/2 分成左右两半屏(122x32)

unsigned char Column;

unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址

unsigned char Code_ ; // 字符代码寄存器

unsigned char Command; // 指令寄存器

unsigned char LCDData; // 数据寄存器

xdata unsigned char CWADD1 _at_ 0x1cff; // 写指令代码地址(E1)

xdata unsigned char DWADD1 _at_ 0x1eff; // 写显示数据地址(E1)

xdata unsigned char CRADD1 _at_ 0x1dff; // 读状态字地址(E1)

xdata unsigned char DRADD1 _at_ 0x1fff; // 读显示数据地址(E1)

xdata unsigned char CWADD2 _at_ 0x3cff; // 写指令代码地址(E2)

xdata unsigned char DWADD2 _at_ 0x3eff; // 写显示数进地址(E2)

xdata unsigned char CRADD2 _at_ 0x3dff; // 读状态字地址(E2)

xdata unsigned char DRADD2 _at_ 0x3fff; // 读显示数据地址(E2)

//----------------------液晶-----------------

// 清屏

// 中文显示程序 /

/直线 插 补8/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=50;y>0;y--);

}

void zhengx()

{

PA=0x00;

delay(10);

PA=0x01;

delay(10);

}

void fux()

{

PA=0x02;

delay(10);

PA=0x03;

delay(10);

}

void zhengy()

{

PB=0x00;

delay(10);

PB=0x10;

delay(10);

}

void fuy()

{

PB=0x20;

delay(10);

PB=0x30;

delay(10);

}

void zhixian(int NX,int NY)

{int FM, NXY, XOY,ZF,z;

FM=0;

{if(NX>0)

if(NY>0)

XOY=1;

else

XOY=4;

else

if(NY>0)

XOY=2;

else

XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)

{ {if(NX>0)

if(NY>0)

XOY=1;

else

XOY=4;

else

if(NY>0)

XOY=2;

else

XOY=3;}

for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)

{ if(FM>=0)

{if(XOY==1||XOY==4)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();

}

FM=FM-fabs(NY);

}

else

{if(XOY==1||XOY==2)

{

ZF=3;

zhengy();

}

else

{ZF=4;

fuy();

}

FM=FM+fabs(NX);

}

}

for(z=0;z<200;z++)

{P35 = 0;

delay(10);

P35 = 1;

delay(10);

}

}

}

/圆 弧 插 补8/

void yuanhu1( int X0,int Y0, int NX, int NY ,int RNS )

{

int NXY,BS,ZF,XM,YM,z;

int FM=0;

BS=fabs(NX-X0) + fabs(NY-Y0);

XM=fabs(X0);

YM=fabs(Y0);

for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)

{

if(RNS==1||RNS==3||RNS==6||RNS==8)

{

if(FM<0)

{

if(RNS==1||RNS==8)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();}

FM=FM+2fabs(XM)+1;

XM=XM+1;

}

else

{

if(RNS==1||RNS==6)

{

ZF=3;

fuy();

}

else

{ZF=4;

zhengy();

}

FM=FM-2fabs(YM)+1;

YM=YM-1;

}

}

else

if(FM>=0)

{

if(RNS==2||RNS==7)

{ZF=1;

zhengx();

}

else

{ZF=2;

fux();

}

FM=FM-2fabs(XM)+1;

XM=XM-1;

}

else

{

if(RNS==2||RNS==5)

{ZF=3;

zhengy();}

else

{ZF=4;

fuy();}

FM=FM+2fabs(YM)+1;

YM=YM+1;

}

}

if(P32==0||P33==0)

{

for(z=0;z<200;z++)

{P35 = 0;

delay(10);

P35 = 1;

delay(10);

}

}

}

int shuzhi1 ()

{

int i=0,j=0,k=3;

while (1)

{

if(testkey())

{ delay(300);

delay1();

if(testkey())

{ j=getkey();

if(j!=14)

{i=i10 + j;

k--;}

}}

if(k==0)

break;

}

return i;

}

int shuzhi2 ()

{

int i=0,j=0,k=3;

while (1)

{

if(testkey())

{ delay(300);

delay1();

if(testkey())

{ j=getkey();

if(j!=14)

{i=i10 + j;

k--;}

}}

if(k==0)

break;

}

return i;

}

void yuanhuchabu1()

{ int q=0;

delay(300);

R=shuzhi1();

yj1();

q=R/100;

Page_ = 0x00;

Column = 0x35;

Code_ = q;

WriteCHN8x16();

q=R%100;

q=q/10;

Page_ = 0x00;

Column = 0x40;

Code_ = q;

WriteCHN8x16();

q=R%10;

Page_ = 0x00;

Column = 0x48;

Code_ = q;

WriteCHN8x16();

yuanhu1(R,0,0,R,5);

yuanhu1(0,R,-R,0,6);

yuanhu1(-R,0,0,-R,7);

yuanhu1(0,-R,R,0,8);

}

void yuanhuchabu2()

{ int q=0;

delay(300);

R=shuzhi1();

yj1();

q=R/100;

Page_ = 0x00;

Column = 0x35;

Code_ = q;

WriteCHN8x16();

q=R%100;

q=q/10;

Page_ = 0x00;

Column = 0x40;

Code_ = q;

WriteCHN8x16();

q=R%10;

Page_ = 0x00;

Column = 0x48;

Code_ = q;

WriteCHN8x16();

yuanhu1(0,R,R,0,1);

yuanhu1(R,0,0,-R,4);

yuanhu1(0,-R,-R,0,3);

yuanhu1(-R,0,0,R,2);

}

void zhixianchabu()

{ int q1=0,q2=0;

delay(300);

NX=shuzhi1();

delay(300);

NY=shuzhi2();

yj2();

Page_ = 0x00;

Column = 0x25;

Code_ = 0x10;

WriteCHN8x16();

q1=NX/100;

Page_ = 0x00;

Column = 0x30;

Code_ = q1;

WriteCHN8x16();

q1=NX%100;

q1=q1/10;

Page_ = 0x00;

Column = 0x37;

Code_ = q1;

WriteCHN8x16();

q1=NX%10;

Page_ = 0x00;

Column = 0x40;

Code_ = q1;

WriteCHN8x16();

q2=NY/100;

Page_ = 0x00;

Column = 0x50;

Code_ =q1;

WriteCHN8x16();

q2=NY%100;

q2=q2/10;

Page_ = 0x00;

Column = 0x58;

Code_ = q2;

WriteCHN8x16();

q2=NY%10;

Page_ = 0x00;

Column = 0x60;

Code_ = q2;

WriteCHN8x16();

Page_ = 0x00;

Column = 0x72;

Code_ = 0x11;

WriteCHN8x16();

zhixian(NX,NY );

}

void main()

{ int q=0,q1=0,q2=0;

caas=mode;

PA=0X00;

PB=0X00;

PC=0x00;

R=0X00;

while(1)

{

if(testkey())

{

delay1();

if(testKey())

{ delay1();

if(getkey()==15)

{

delay(300);

yuanhuchabu1();

}

else if(getkey()==10)

{ delay(300);

yuanhuchabu2();

}

else if(getkey()==13)

{

zhixianchabu();

}

else if(getkey()==1)

{

zhengx();

}

else if(getkey()==2)

{

fux();

}

else if(getkey()==3)

{

zhengy();

} else if(getkey()==4)

{

fuy();

}

}

}

if(GetKey()==12)

{ break;}

}

}

先看步进电机控制电机转动原理,把时序搞清楚,单片机控制驱动按照时序置管脚就OK

1、本程序用于测试4相步进电机常规驱动

2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来

3、速度不可以调节的过快,不然就没有力矩转动了

4、按s4(设置成独立按键模式)可以控制正反转

------------------------------------------------/

#include <reg52h>

bit Flag;//定义正反转标志位

unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格

unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格

//

/ 延时函数 /

//

void Delay(unsigned int i)//延时

{

while(--i);

}

//

/ 主函数 /

//

main()

{

unsigned char i;

EX1=1; //外部中断0开

IT1=1; //边沿触发

EA=1; //全局中断开

while(!Flag)

{

P0=0x71;//显示 F 标示正转

for(i=0;i<4;i++) //4相

{

P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

while(Flag)

{

P0=0x7C;//显示 b 标示反转

for(i=0;i<4;i++) //4相

{

P1=B_Rotation[i]; //输出对应的相

Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大

}

}

}

//

/ 中断入口函数 /

//

void ISR_Key(void) interrupt 2 using 1

{

Delay(300);

Flag=!Flag; //s3按下触发一次,标志位取反

}

//P11(T0):Count They Distance

//P04:Tx

//P05:Rx

#include <C8051F310h> //SFR declarations

#include <stdioh> //Standard I/O definition file

#include <mathh> //Math library file

#include <Intrinsh>

#include <absacch>

unsigned int j,i;

char a=0;

unsigned int t=0;

//sbit led=P0^2;

//P00(PWM0):给定左轮速度

sbit vls=P0^4; //P04(GPIO):给定左轮方向

sbit vlf=P0^6; //P06(T0) :反馈左轮速度

sbit dlf=P1^0; //P10(GPIO):反馈左轮方向

//P02(PWM0):给定右轮速度

sbit vrs=P0^5; //P05(GPIO):给定右轮方向

sbit vrf=P0^7; //P07(T0) :反馈右轮速度

sbit drf=P1^1; //P11(GPIO):反馈右轮方向

int ol; //左轮给定值

int len;

int len_1,len_2;

int lyn_1,lyn_2;

int vl1,vl2; //反馈左轮速度值(取样周期内的方波数)

int lfz; //运算后赋给PWM的值

int lyn,lynn;

int lun=0,lun_1=0; //偏差校正值 即校正PWM输出

int lunp,luni,lund; //PID 校正值

int or; //右轮给定值

int ren;

int ren_1,ren_2;

int ryn_1,ryn_2;

int vr1,vr2; //反馈右轮速度值(取样周期内的方波数)

int rfz; //运算后赋给PWM的值

int ryn,rynn;

int run=0,run_1=0; //偏差校正值 即校正PWM输出

int runp,runi,rund; //PID 校正值

float kp=20; //比例系数18

float kd=02; //微分系数04

float lki; //积分系数

void pio_init(void);

void sys_init(void);

void t01_init(void);

void TIME3_INT(void);

void PID(void);

void interrupt_init(void);

void delay(unsigned int x);

void pwm1_1(void);

void main(void)

{

PCA0MD &= ~0x40; //关闭

pio_init(); //P11为测距输入端

sys_init();

t01_init();

pwm1_1();

TIME3_INT();

interrupt_init();

vls=1;vrs=0;

while(1)

{

ol=50;

or=50;

delay(1000);

ol=100;

or=100;

delay(1000);

ol=-50;

or=50;

delay(1000);

}

}

void PID(void)

{

/左轮PID调节/

if(dlf==1)

{

lyn=(vl2256+vl1); //dlf是左轮反馈方向,0表示向前 vl=TL0

}

else

{

lyn=-(vl2256+vl1); //dlf=1表示是向后退,速度应该为负值

}

len=ol-lyn; //误差=给定速度-反馈速度(取样周期内的方波数)

if(abs(len)<8)//30

{

lki=14; //ki值的确定14

}

else

{

lki=005; //积分系数:如果 | 给定值-反馈值 | 太大

} //则就可以不引入积分,或者引入的很小005

lunp=kp(len-len_1); //比例校正

luni=lkilen; //积分校正

lund=kd(len-2len_1+len_2); //微分校正

lun=lunp+luni+lund+lun_1; //总校正

/新旧数据更新/

len_2=len_1;

len_1=len; //len:当前取样周期内出现的速度偏差;len_1:上次取样周期内出现的速度偏差

lun_1=lun; //lun:当前取样周期内得出的PWM校正值;lun_1:上次取样周期内得出的PWM校正值

/新旧数据更新/

if(lun>255)

{

lun=255; //正速度

}

if(lun<-255)

{

lun=-255; //负速度

}

if(lun<0)

{

vls=1;

PCA0CPH0=-lun;

}

if(lun>=0)

{

vls=0;

PCA0CPH0=lun;

}

/右轮PID调节/

if(drf==0)

{

ryn=(vr2256+vr1); //drf是右轮反馈方向,0表示向前 vl=TL0

}

else

{

ryn=-(vr2256+vr1); //dlf=1表示是向后退,速度应该为负值

}

ren=or-ryn; //误差=给定速度-反馈速度(取样周期内的方波数)

if(abs(ren)<8)//30

{

lki=14; //ki值的确定14

}

else

{

lki=005; //积分系数:如果 | 给定值-反馈值 | 太大

} //则就可以不引入积分,或者引入的很小005

runp=kp(ren-ren_1); //比例校正

runi=lkiren; //积分校正

rund=kd(ren-2ren_1+ren_2); //微分校正

run=runp+runi+rund+run_1; //总校正

/新旧数据更新/

ren_2=ren_1;

ren_1=ren; //len:当前取样周期内出现的速度偏差;len_1:上次取样周期内出现的速度偏差

run_1=run; //lun:当前取样周期内得出的PWM校正值;lun_1:上次取样周期内得出的PWM校正值

/新旧数据更新/

if(run>255)

{

run=255; //正速度

}

if(run<-255)

{

run=-255; //负速度

}

if(run<0)

{

vrs=1;

PCA0CPH1=-run;

}

if(run>=0)

{

vrs=0;

PCA0CPH1=run;

}

//因为这里的PCA0CPH0越大,对应的电机速度越小,所以要255来减一下

}

void pio_init(void)

{

XBR0=0x00; //0000 0001

XBR1=0x72; //0111 0010 时能弱上拉 T0T1连接到脚口P06、P07 CEX0、CEX1连接到脚口P00、P01

P0MDIN=0xff; //模拟(0);数字(1) 1111 0011

P0MDOUT=0xc3;//开漏(0);推挽(1) 1111 1111

P0SKIP=0x3c; //0011 1100

P1MDIN=0xff; //1111 1111

P1MDOUT=0xfc;//

P1SKIP=0x00; //1111 1111

}

void sys_init(void) //12MHz

{

OSCICL=0x43;

OSCICN=0xc2;

CLKSEL=0x00;

}

void pwm1_1(void) //PWM的初始化

{

PCA0MD=0x08; //PCA时钟为12分频

PCA0CPL0=200; //左轮

PCA0CPM0=0x42; //设置左轮为8位PWM输出

PCA0CPH0=200;

PCA0CPL1=200; //平衡校正

PCA0CPM1=0x42; //设置为8位PWM输出

PCA0CPH1=200;

PCA0CN=0x40; //允许PCA工作

}

void t01_init(void)

{

TCON=0x50; //计数器1、2允许

TMOD=0x55; //定时器1、2采用16位计数功能

CKCON=0x00;

TH1=0x00; //用于采集左轮的速度

TL1=0x00;

TH0=0x00; //用于采集右轮的速度

TL0=0x00;

}

void TIME3_INT(void)

{

TMR3CN = 0x00; //定时器3为16位自动重载

CKCON &= ~0x40;

TMR3RLL = 0xff;

TMR3RLH = 0xd7;

TMR3L = 0xff;

TMR3H = 0xd7;

TMR3CN |= 0x04;

}

void T3_ISR() interrupt 14 //定时器3中断服务程序

{

//led=~led;

EA=0;

TCON &=~0x50; //关闭计数器0、1

vl1=TL0; //取左轮速度值

vl2=TH0;

vr1=TL1; //取右轮速度值

vr2=TH1;

TH1=0x00;

TL1=0x00;

TH0=0x00;

TL0=0x00;

PID(); //PID处理

TMR3CN &=~0x80; //清中断标志位

TCON |=0x50; //重新开计数器0、1

EA=1;

}

void interrupt_init(void)

{ IE=0x80;

IP=0x00;

EIE1|=0x80;

EIP1|=0x80;

}

void delay(unsigned int m) //延时程序

{

for(i=0;i<2000;i++)

{

for(j=0;j<m;j++){_nop_(); _nop_();}

}

}

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

#include<reg52h>

#include<intrinsh>

#include<absacch>

#include<stringh>

#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;i<1000;i++);

}

void l_delay(unsigned int t) //延时

{

unsigned int p;

unsigned int j;

for(j=0;j<t;j++)

{

for(p=0;p<1000;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;i<8;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;i<8;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();

}

}

#include <reg51h> //51芯片管脚定义头文件

#include <intrinsh>//内部包含延时函数 _nop_();

#define uchar unsigned char

#define uint unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};

uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

//

/

/ 延时t毫秒

/ 110592MHz时钟,延时约1ms

/

//

void delay(uint t)

{

uint k;

while(t--)

{

for(k=0; k<125; k++)

{ }

}

}

//

/

/步进电机正转

/

//

void motor_ffw(uint n)

{

uchar i;

uint j;

for (j=0; j<12n; j++) //转1×n圈

{

for (i=0; i<8; i++) //一个周期转30度

{

P1 = FFW[i]; //取数据

delay(15); //调节转速

}

}

}

//

/

/步进电机反转

/

//

void motor_rev(uint n)

{

uchar i;

uint j;

for (j=0; j<12n; j++) //转1×n圈

{

for (i=0; i<8; i++) //一个周期转30度

{

P1 = REV[i]; //取数据

delay(15); //调节转速

}

}

}

/

主程序

/

main()

{

while(1)

{

motor_ffw(5); //电机正转

delay(5000); //换向延时

//motor_rev(5); //电机反转

//delay(1000); //换向延时

}

}

//

#includeunsignedchari[]={0x00,0x01,0x02,0x04,0x08};voiddelay(unsignedints){while(s--);}main(){while(1){unsignedchara;for(a=1;a0;a--){P2=i[a];delay(50000);}}}记得给好评吆、、、

以上就是关于我想用STC12C5A60S单片机控制STI6608驱动步进电机动作,请问C程序怎么写全部的内容,包括:我想用STC12C5A60S单片机控制STI6608驱动步进电机动作,请问C程序怎么写、一个51单片机同时控制2个步进电机的C语言程序、如何使用单片机控制步进电机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存