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

本文介绍了一种利用51系列单片机通过定时器模拟PWM信号来实现直流电机调速的方法。该方案详细展示了如何通过软件编程控制电机的正转、反转及停转,并实现了电机速度调节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计思路

由于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];
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值