51单片机+L293D控制直流电机起保停和PWM调速

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机+L293D控制直流电机起保停和PWM调速相关的知识,希望对你有一定的参考价值。

51单片机+L293D控制直流电机起保停和PWM调速

  • 仿真演示
    在这里插入图片描述

*程序源码

#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit IN0=P2^0;//电机驱动引脚1
sbit IN1=P2^1;//电机驱动引脚2
sbit E=P2^2;//电机使能引脚
sbit key0=P1^0;//pwm增调节引脚
sbit key1=P1^1;//pwm减调节引脚
sbit key_stop=P1^2;
sbit key_star=P1^3;
uint T1_H,T1_L,T0_H,T0_L;
uchar a=50 ;
uchar fr;		 //a表示占空比:0-100,fr*100后为PWM频率值调节范围:1-255。
uchar flag=0;
uchar flag0=0;
uchar flag_stop=0;
uchar flag_star=0;
void chuzhi();
void motor()
{
	IN0=1;
	if(a==100)
	{
	a=100;
	}
}

void inittimer()
{
	
	TMOD=0x01;
	ET0=1;
	EA=1;
	TR0=1;
	IN1=0;
}

void datdeal()
{
	if(key0==0&&flag==0)
	{
		flag=1;
	}
	if(flag==1&&key0==1)
	{
		a=((a==0)?0:(a-10));
		flag=0;
	}
	if(key1==0&&flag0==0)
	{
		flag0=1;
	}
	if(flag0==1&&key1==1)
	{
	a=((a==100)?100:(a+10));
		flag0=0;
	}
	if(flag_stop==0&&key_stop==0)
	{
		flag_stop=1;
	}
	if(flag_stop==1&&key_stop==1)
	{
	ET0=0;//启用Timer0溢出中断
	EA=0;//启用中断
	TR0=0;
		IE=0;
	E=0;

		flag_stop=0;
	}
		if(flag_star==0&&key_star==0)
	{
		flag_star=1;
	}
	if(flag_star==1&&key_star==1)
	{
		a=50;
	ET0=1;	
	EA=1;
	TR0=1;
	E=1;
		
		flag_star=0;
	}
}
	
void main()
{	fr=5;
	inittimer();
	while(1)
	{
			chuzhi();
		datdeal();
		motor();
	
	}
}

void timer_isr() interrupt 1
{
	IN0=~IN0;
if(IN0==1) { TH0=T1_H;TL0=T1_L; }//若正在供电,赋供电初值,使供电维持对应时间;
if(IN0==0) { TH0=T0_H;TL0=T0_L; }//若正在断电,赋断电初值;使断电维持对应时间;	

}
void chuzhi()	//注意此处不可写为65536,
                //否则当a为0或100时,产生溢出,造成错乱。
				//这样也造成实际定时产生的占空比,与a%相比存在轻微偏差。
{	
	T0_H=(65535-10000/fr+a*100/fr)/256;
	T0_L=(65535-10000/fr+a*100/fr)%256; 
	//断电时间初值;	 
	
	T1_H=(65535-a*100/fr)/256;
	T1_L=(65535-a*100/fr)%256; 	 
	//供电时间初值;	
}

以上是关于51单片机+L293D控制直流电机起保停和PWM调速的主要内容,如果未能解决你的问题,请参考以下文章

51单片机+L293D控制直流电机起保停正反转

blinker控制步进电机起保停,正反转,加减速(Arduino uno+esp8266+TB6600驱动器)

外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)

Proteus仿真51单片机+直流电机PWM调速实验

直流电机+L298N电机驱动模块

IRAM136驱动电机需要哪些引脚