51单片机中如何用c语言控制直流电机正反转

51单片机中如何用c语言控制直流电机正反转,第1张

#include <reg52h>

#define uint unsigned int

#define uchar unsigned char

sbit IN1=P1^0;

sbit ENA=P1^1; //左轮 1

sbit IN2=P1^2;//左轮2

sbit IN3=P1^3;//右轮 1

sbit ENB=P1^4;

sbit IN4=P1^5;//右轮 2

sbit left=P0^0;

sbit right=P0^1;

//sbit middle=P0^2;

void delay(uint z)

{

uint x,y;

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

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

}

void init()

{

ENA=0; // 1

ENB=0; //

IN1=0; // 0

IN2=0; // 2

IN3=0;

IN4=0;

}

void pwm()

{

ENA=1;

ENB=1;

}

void dianji()

{

if(left==0&&right==0) //前进

{

IN1=1;

IN2=0;

IN3=1;

IN4=0;

pwm();

}

else if(left==0&&right==1) //右转

{

IN1=1;

IN2=0;

IN3=0;

IN4=1;

pwm();

} else if(left=1&&right==0)// 左转

{

IN1=0;

IN2=1;

IN3=1;

IN4=0;

pwm();

}

}

void main()

{

init();

while(1)

{

dianji();

}

}

1、先设计软件,马达控制用PWM脉冲驱动,程序中利用定时器中断对显示器进行刷新显示。

2、在主程序中利用键盘判断按键状态,分别设置加、减、速度、温度按键,并建立个功能子程序。

3、测速功能利用定时器设定单位时间内检测光电开关检测技术次数,然后换算成分转速,并存于内部寄存器备用,当判断按键程序为转速显示是调用即可,或在主程序中先设置显示为转速模式。

4、速度加、减也单独建立寄存器保存数据。

5、温度采用18B20数字温度芯片。

6、硬件设计需要注意强电和弱电的隔离,驱动信号直接用光耦隔离就OK ,驱动马达需注意脉冲干扰。

希望对你能有所帮助~!

LN2003也是一个7路反向器电路,即当输入端为高电平时ULN2003输出端为低电平,当输入端为低电平时ULN2003输出端为高电平,继电器得电吸合。

#include<stch>

#define it unsigned int

sbit s0=P3^2;//两个按钮

sbit s1=P3^3;//两个按钮

sbit j0=P3^4;//继电器控制口,这3个IO口要和你实际电路去更改。

void ys(it); //声明延时函数

void main()

{

while(1)

{

if(s0==0) //判断S按键是否按下 {

ys(5000); //延时消抖

if(s0==0) //在次判断按键是否真的按下(在次判断很有必要)

{

j0=1; //让继电器关闭

while(s0==0); //判断S按键是否放开,如果没有放开继续等待。放开后执行下面的代码。

}

}

if(s1==0) //判断S按键是否按下 {

ys(5000);

if(s1==0)

{

j0=0; //让继电器打开

while(s1==0);

}

}

}

}

void ys(it a) //延时函数

{

it x;

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

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

}

#include <reg52h>

sbit KEY1 = P3^2;

sbit PWM = P1^0;

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(30000);

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;//低电平

}

}

以上就是关于51单片机中如何用c语言控制直流电机正反转全部的内容,包括:51单片机中如何用c语言控制直流电机正反转、关于MCS51直流电机转速控制、求助51单片机通过uln2003控制继电器驱动直流电机的C语言和电路图,谢谢了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存