基于51单片机及L298N的直流电机调速系统proteus仿真

本文介绍了一种基于51单片机的电机控制系统设计,通过使用定时器中断、外部中断等方式实现了电机的速度控制与监测。系统还集成了矩阵键盘输入及LCD显示功能,能够实现电机速度的设定与实时显示。

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

硬件设计

链接:https://pan.baidu.com/s/1W43ZK5Y66Zgp6vmCE2h58A
提取码:vzqn
在这里插入图片描述

代码设计

#include<reg51.h>
#include<intrins.h>	
#include<math.h>

#include "lcd.h"
#include "Key.h"
#include "Motor.h"
#include "LCD12864.h"
#include "KeyBoard.h"
#include "LCD12864.h"
#include "LcdShow.h"
#include "PID.h"

extern uchar State_Flag;
extern uchar Fwd_Flag;
extern uchar Rev_Flag;

unsigned int  KeyValue;

unsigned int idata pwm_t;//周期
unsigned int idata Impluse,Time_Count,ImpluseR;
uchar idata Stop_Flag,Run_Flag,Curve_Flag;

uint idata Set_Speed;  //  设定转速
unsigned char idata Sz_Flag,Sr_Flag;  // 记录A相触发后  ,B相高低电平的标志
float idata L_Speed,R_Speed,ReaSpeed;

uint idata PWM_Out,R_Duty,L_Duty,Turn_now;
sbit LSB_L = P1^0;    // LSB_L 
sbit LSB_R = P1^1;    // LSB_R

void TimerInit(void)		//@11.0592MHz
{
	
	TMOD=0x01;		//定时器模式

	TL0 = 0x18;		//初值      1ms  
	TH0 = 0xFC;		//初值
	
	IT0 = 1;	 //设置下降沿触发 还是低电平触发 0低电平
	IT1 = 1;	 //设置下降沿触发 还是低电平触发 0低电平
  EA  = 1;
	EX0 = 1;
	EX1 = 1;
	
	ET0 = 1;
	TR0 = 1;		

}

void main()
{
		  LED = 0;	
	
	    Stop_Flag  = 0;
	    Lcd_Initial();
			TimerInit();
			Set_Speed = 0;
	 Lcd_Clear();
		while(1)
		{
			KeyValue = Get_Keyvalue();   //  矩阵键盘扫描
			if(KeyValue == 14)   // 输入速度
      {
			  Set_Speed = SpeedInput();	
				KeyValue = 16;
	    }
			Key_Process();
			if(Run_Flag)
			{
				Set_Speed = 80;
				Run_Flag = 0;
			}
		
			if(State_Flag && ~Stop_Flag)	
			{
			  PWM_Out = PID_Calculate(Set_Speed,abs(ReaSpeed));
				R_Duty = PWM_Out + Turn_now;
				L_Duty = PWM_Out - Turn_now;
			}
			else 
				PWM_Out = 0;  // 停止  
			Lcd_Show();
	 }	   
}

	
//定时器0中断
void timer0() interrupt 1
{
	static int i;
	TL0 = 0x18;		//初值
	TH0 = 0xFC;		//初值
	
	
	pwm_t++;
  Time_Count++;;
	if(pwm_t == 500)   //500ms
	{
		pwm_t = 0;
		if(Stop_Flag)
		{
			i++;
			L_Duty = 0;
			R_Duty = 0;
			if(i<31)
			{
		     LED = ~LED;
				 if(i == 30)  
				 {
					 Stop_Flag = 0;
					 i = 0;
					 Set_Speed = 30;
				 }
			}
		}
	}		
	if( pwm_t<L_Duty)
		  MotorL_Control();	
		else 
			MotorL_Stop(); 
	
	if( pwm_t<R_Duty)
		  MotorR_Control();	
   else
   		MotorR_Stop(); 
	/*---------M法 测速------------*/ 
	if(Time_Count == 100 )    //  100ms
	 { 
		 
		Control();
		Time_Count = 0;
		Impluse = 0;
		ImpluseR = 0;
	 }
}


void int0() interrupt 0
{
	Impluse++;
	 if(LSB_L == 1)
			 Sz_Flag = 1;    //  正反转标志位 A相下降沿,B相高电平
	 
	 else Sz_Flag = 0;
	  LSB_L = 1;
} 


void int1() interrupt 2   // 外部中断1   用于测 右轮的速度
{
	ImpluseR++;
	 if(LSB_R == 1)
			 Sr_Flag = 1;       //  正反转标志位 A相下降沿,B相高电平
	 
	 else Sr_Flag = 0;
	  LSB_R = 1;
} 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值