×
单片机 > 单片机程序设计 > 详情

基于89C2051产生PWM信号来控制直流电机调速程序

发布时间:2020-05-26 发布时间:
|

本例程利用2051的T0产生双路PWM信号,推动L293D或L298N为直流电机调速,程序已通过调试。接L298N时相应的管脚上最好接上10K的上拉电阻。 
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */ 

#include 
#include 
#define uchar unsigned char 
#define uint unsigned int 
sbit en1=P1^0; /* L298的Enable A */ 
sbit en2=P1^1; /* L298的Enable B */ 
sbit s1=P1^2; /* L298的Input 1 */ 
sbit s2=P1^3; /* L298的Input 2 */ 
sbit s3=P1^4; /* L298的Input 3 */ 
sbit s4=P1^5; /* L298的Input 4 */ 
uchar t=0; /* 中断计数器 */ 
uchar m1=0; /* 电机1速度值 */ 
uchar m2=0; /* 电机2速度值 */ 
uchar tmp1,tmp2; /* 电机当前速度值 */ 

/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */ 
void motor(uchar index, char speed) 

if(speed>=-100 && speed<=100) 

if(index==1) /* 电机1的处理 */ 

m1=abs(speed); /* 取速度的绝对值 */ 
if(speed<0) /* 速度值为负则反转 */ 

s1=0; 
s2=1; 

else /* 不为负数则正转 */ 

s1=1; 
s2=0; 


if(index==2) /* 电机2的处理 */ 

m2=abs(speed); /* 电机2的速度控制 */ 
if(speed<0) /* 电机2的方向控制 */ 

s3=0; 
s4=1; 

else 

s3=1; 
s4=0; 





void delay(uint j) /* 简易延时函数 */ 

for(j;j>0;j--); 


void main() 

uchar i; 
TMOD=0x02; /* 设定T0的工作模式为2 */ 
TH0=0x9B; /* 装入定时器的初值 */ 
TL0=0x9B; 
EA=1; /* 开中断 */ 
ET0=1; /* 定时器0允许中断 */ 
TR0=1; /* 启动定时器0 */ 
while(1) /* 电机实际控制演示 */ 

for(i=0;i<=100;i++) /* 正转加速 */ 

motor(1,i); 
motor(2,i); 
delay(5000); 

for(i=100;i>0;i--) /* 正转减速 */ 

motor(1,i); 
motor(2,i); 
delay(5000); 

for(i=0;i<=100;i++) /* 反转加速 */ 

motor(1,-i); 
motor(2,-i); 
delay(5000); 

for(i=100;i>0;i--) /* 反转减速 */ 

motor(1,-i); 
motor(2,-i); 
delay(5000); 




void timer0() interrupt 1 /* T0中断服务程序 */ 

if(t==0) /* 1个PWM周期完成后才会接受新数值 */ 

tmp1=m1; 
tmp2=m2; 

if(tif(tt++; 
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */ 

关键字:89C2051  PWM信号  直流电机  调速程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计