89C52单片机驱动步进电机的C程序

89C52单片机驱动步进电机的C程序,第1张

#include "reg52h"

//Motor

sbit F1 = P1^0;

sbit F2 = P1^1;

sbit F3 = P1^2;

sbit F4 = P1^3;

///////////////////////////////////////

//步进电机驱动

unsigned char MotorStep=0;

unsigned int MotorTimer = 0;

unsigned int TIM,CT;

void InitMotor()

{

F1 = 1;

F2 = 1;

F3 = 1;

F4 = 1;

}

void SetMotor()

{

// if(Speed == 0) return;

switch(MotorStep)

{

case 0:

if(TIM)

{

F1 = 0;

F2 = 0;

F3 = 1;

F4 = 1;

MotorStep = 1;

TIM=0;

}

break;

case 1:

if(TIM)

{

F1 = 1;

F2 = 0;

F3 = 0;

F4 = 1;

MotorStep = 2;

TIM=0;

}

break;

case 2:

if(TIM)

{

F1 = 1;

F2 = 1;

F3 = 0;

F4 = 0;

MotorStep = 3;

TIM=0;

}

break;

case 3:

if(TIM)

{

F1 = 0;

F2 = 1;

F3 = 1;

F4 = 0;

MotorStep = 0;

TIM=0;

}

break;

}

}

void system_Ini()

{

TMOD|= 0x11;

TH0=0xDC; //110592M

TL0=0x00;

IE = 0x8A;

TR0 = 1;

}

main()

{ system_Ini();

InitMotor();

while(1)

{

SetMotor();

}

}

/

[ t1 (05ms)中断] 中断中做 PWM 输出

------------1000/(002ms250)=200Hz

/

void Tzd(void) interrupt 1

{

TH0 = 0xfe; //110592

TL0 = 0x33;

if( CT++==20)

{TIM=1;

CT=0;

}

}

希望对你有所帮助,这个亲自试过,可以的!

还有其他控制方式的~

最近正好自己在搞一个小车,经过测试了,可用,有不懂得地方再联系:

驱动用的l298n。

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar rec_int_flag=0;

void delay_ms(uint x);

void motor_con(uchar angle,uchar speed ,uchar back,uchar direction);

uchar code Fan[8]={0, 0x0b, 0x09, 0x0d, 0x05, 0x07, 0x06, 0x0e};

//1010 ,1011, 1001 ,1101,0101,0111,0110, 1110

uchar code Zhen[8] ={0x0e, 0x06, 0x07, 0x05, 0x0d, 0x09, 0x0b, 0};

// 1110 ,0110 ,0111, 0101,1101,1001,1011,1010

void main()

{

while(1)

{

motor_con(1,20,0,2);

if(rec_int_flag==1)

{

while(1);

}

}

}

void delay_ms(uint x)

{

uchar i,j;

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

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

}

void rev_int(void) interrupt 0

{

rec_int_flag=1;

}

/

函数说明:

direction==0时左轮动,为1时右轮动,为2时直行。

转动角度为(72度angle)。

back==1时代表后退,back==0时代表前进。

speed用于延时speed毫秒来调速。

P0为左轮电机,P1为右轮电机

/

void motor_con(uchar angle,uchar speed ,uchar back,uchar direction)

{

uchar m,n;

switch(back)

{

case 1: //判断前进后退与否 0代表前进

{

for(m=0;m<angle;m++) //前进角度

{

for(n=0;n<8;n++)

{

if(direction==0) P1=Fan[n]; //左转右转或直行。

else if(direction==1) P0=Fan[n];

else {P1=Fan[n];P0=Fan[n];}

delay_ms(speed); //调速

}

}

}break;

case 0:

{

for(m=0;m<angle;m++)

{

for(n=0;n<8;n++)

{

if(direction==0) P1=Zhen[n];

else if(direction==1) P0=Zhen[n];

else {P1=Zhen[n];P0=Zhen[n];}

delay_ms(speed);

}

}

}break;

default: break;

}

}

//功能:直流电机正转调试程序

//编译环境: KEIL UVISION2

//单片机晶振: 无特殊要求

//作者:忠兴电子元件店

//日期:20100817

#include<reg52h>

sbit P2_0=P2^0;//M1启动

sbit P2_1=P2^1;//M2启动

sbit P2_2=P2^2;//M1停止

sbit P2_3=P2^3;//M2停止

sbit P1_0=P1^0;//M1

sbit P1_1=P1^1;//M1

sbit P1_2=P1^2;//M2

sbit P1_3=P1^3;//M2

main()

{

while(1)

{

if(P2_0==0)//M1启动

{

P1_0=1;

P1_1=0;

}

if(P2_1==0)//M2启动

{

P1_2=1;

P1_3=0;

}

if(P2_2==0)//M1停止

{

P1_0=1;

P1_1=1;

}

if(P2_3==0)//M2停止

{

P1_2=1;

P1_3=1;

}

}

}

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

名称:直流电机调速

内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法

2、硬件要求:直流电机 定时器

3、试验现象:按键调速,PWM部分显示速度档位,电机根据档位调节速度 这个需要把电机驱动输入端和PWM端连接起来

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

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit KEY1 = P3^1; //定义调速按键

sbit PWM = P1^5; //定义调速端口

unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 01ms

unsigned char PWM_ON ;//定义高电平时间

//

/ 延时函数 /

//

void delay(unsigned int cnt)

{

while(--cnt);

}

//

/ 主函数 /

//

main()

{

unsigned char PWM_Num;//定义档位

TMOD |=0x01;//定时器设置 1ms in 12M crystal

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

IE= 0x82; //打开中断

TR0=1;

CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步

while(1)

{

if(!KEY1)

{

delay(10000);

if(!KEY1)

{

PWM_Num++;

if(PWM_Num==4)PWM_Num=0;

switch(PWM_Num){

case 0:P0=0x06;PWM_ON=0;break;//高电平时长

case 1:P0=0x5B;PWM_ON=4;break;

case 2:P0=0x4F;PWM_ON=6;break;

case 3:P0=0x66;PWM_ON=8;break;

default:break;

}

}

}

}

}

//

/ 定时器中断函数 /

//

void tim(void) interrupt 1 using 1

{

static unsigned char count; //

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

if (count==PWM_ON)

{

PWM = 1; //灯灭

}

count++;

if(count == CYCLE)

{

count=0;

if(PWM_ON!=0) //如果左右时间是0 保持原来状态

PWM = 0; //灯亮

}

}

以上就是关于89C52单片机驱动步进电机的C程序全部的内容,包括:89C52单片机驱动步进电机的C程序、步进电机297 298驱动程序、谁能给一个L298N电机驱动程序(C语言或汇编语言都可以),谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9481009.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存