基于51单片机PWM直流电机调速

设计思路

由于51系列单片机没有硬件PWM,因此想使用PWM调速,使用定时器模拟PWM。

设计框图

基于51单片机PWM直流电机调速_第1张图片

直流电机驱动电路

基于51单片机PWM直流电机调速_第2张图片

程序源码

#include 

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];
}

你可能感兴趣的:(单片机,单片机,51单片机)