基于51单片机的闭环直流电机控制系统(PWM,反馈)proteus,原理图、流程图、物料清单、仿真图、源代码

基于51单片机的闭环直流电机控制系统(PWM,反馈)proteus,原理图、流程图、物料清单、仿真图、源代码
请添加图片描述

1.仿真电路引脚说明
采用AT89C51单片机,晶振为12MHz,2个四位的共阴数码管,一个显示速度设定值,一个显示速度测量值,单位r/min;
P1.0用于产生PWM,用于直流电机调速;
P1.1~P1.4接4个独立按键,分别实现按下速度设定值加10,加1,减10,减1;
P2.0~P2.7接共阴数码管的段选,连接见仿真图;
P0.0P0.7用于数码管位选,P0.3P0.0对应实时速度的显示位选;P1.7~P1.4对应速度设定值的显示位选;
P3.2/INT0用于采集测速传感器的秒冲;

2.程序要求
四个按键(加10,加1,减10,减1)设置速度初定值,并送4位共阴数码管显示;测量实时速度,送另一个4位共阴数码管显示。能利用产生占空比可调的PWM控制速度到达设定值,由此形成闭环PWM调速直流电机。

【调速用的是先快速调节,然后转慢速调节的算法】请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include "reg51.h"			 //此文件中定义了单片机的一些特殊功能寄存器

#define uint unsigned int	  //对数据类型进行声明定义
#define uchar unsigned char

sbit pwm=P1^0;//PWM

sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
//===============================
uint speed=0;
uint time=0,sec=0;//计时
uint sudu=200;//速度设定
uint pwm_time=500;//占空比0-1000
uint k;
//===================================================显示相关
uchar code smgduan0[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9,无小数点
uchar code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示0~9,有小数点

uchar see[8]={0x3f,0x06,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//显存,设定速度+当前速度

sbit smg1=P2^0;
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit smg5=P2^4;
sbit smg6=P2^5;
sbit smg7=P2^6;
sbit smg8=P2^7;

void delay(uint i)//延时
{
while(i--)
{
	if(sec<1000)
		sec++;
	else
		sec=0;
	if(sec<pwm_time)
		pwm=1;
	else
		pwm=0;
}
}

void display()//显示
{
  uchar i;
  for(i=0;i<8;i++)
  {
  P0=0;
  P2=~(1<<i);
  P0=see[i];
  delay(100);
  }
}
//============================================================
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	//设置INT0
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。	
	EA=1;//打开总中断
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=(65536-50000)/256;	//给定时器赋初值
	TL0=(65536-50000)%256;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器
	delay(50000);
	while(1)
	{
		display();//显示
		
		if((k<sudu)&&(sudu-k>10)&&(pwm_time<1000))
		{			
			pwm_time++;
		}
		if((k>sudu)&&(k-sudu>10)&&(pwm_time>1))
			pwm_time--;	
		if(!key1) //按键检测
		{
		   if(sudu<1000)
		   	   sudu+=10;
			while(!key1);
		}
		if(!key2)
		{
		   if(sudu<1000)
		   	   sudu++;
			while(!key2);
		}
		if(!key3)
		{
		   if(sudu>1)
		   	   sudu-=10;
			while(!key3);
		}
		if(!key4)
		{
		   if(sudu>1)
		   	   sudu--;
			while(!key4);
		}
			
	}				
}

void Int0()	interrupt 0		//外部中断0的中断函数
{
speed++;//速度计数	
}

void Timer0() interrupt 1
{		
	//=========================速度测量
	if(time<20)
		time++;
	else
	{
	time=0;		  //计算速度
	k=speed;
	speed=0;
	see[0]=smgduan0[sudu/1000];
	see[1]=smgduan0[sudu%1000/100];
	see[2]=smgduan0[sudu%100/10];
	see[3]=smgduan0[sudu%10];
	see[4]=smgduan0[k/1000];
	see[5]=smgduan0[k%1000/100];
	see[6]=smgduan0[k%100/10];
	see[7]=smgduan0[k%10];
	//调速,微调
		if((k<sudu)&&(sudu-k<11)&&(pwm_time<1000))
		{			
			pwm_time++;
		}
		if((k>sudu)&&(k-sudu<11)&&(pwm_time>1))
			pwm_time--;	
	}
	TH0=(65536-50000)/256;	//给定时器赋初值
	TL0=(65536-50000)%256;
}

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值