设计思路
由于51系列单片机没有硬件PWM,因此想使用PWM调速,使用定时器模拟PWM。
设计框图
直流电机驱动电路
程序源码
#include <reg52.h>
sbit P20=P2^0;
sbit P21=P2^1;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;
void display_num(int n1);
void Timer0_init();
unsigned char Duty=0;
unsigned char pre_P3;
unsigned char num_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(int i)
{
while(i--);
}
void main()
{
P0=num_code[0];
P2=0xFF;
Timer0_init();
P26=1;
P27=1;
while(1)
{
if(P3!=pre_P3)
{
delay(100);
if(P3!=pre_P3)
{
if(P32==0)
{
TR0=1;
Duty++;
if(Duty>10)
Duty=0;
}
if(P33==0)//正转
{
TR0=0;
P26=1;
P27=0;
}
if(P34==0)//反转
{
TR0=0;
P26=0;
P27=1;
}
if(P35==0)//停转
{
TR0=0;
P26=1;
P27=1;
}
}
}
pre_P3=P3;
display_num(Duty);
}
}
void Timer0_init()
{
TMOD=(TMOD&0xF0)|0x01;
TH0=(65526-1000/1.085)/256;
TL0=65526-1000/1.085;
TR0=1;
ET0=1;
EA=1;
}
//定时器0中断
void timer0() interrupt 1
{
static unsigned char pwm_t=0;//周期计数变量
TH0=(65526-1000/1.085)/256;
TL0=65526-1000/1.085;
pwm_t++;
if(pwm_t>10)
pwm_t=0;
if(pwm_t==Duty)
P26=1;
else
P26=0;
}
void display_num(int n1)
{
int x,y;
x=n1/10;
y=n1%10;
P21=1;
P20=0;
P0=num_code[y];
P21=0;
P20=1;
P0=num_code[0];
}