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调速的主要内容,如果未能解决你的问题,请参考以下文章
blinker控制步进电机起保停,正反转,加减速(Arduino uno+esp8266+TB6600驱动器)