基于51单片机的直流电机调速系统(L298的使用)

设计要求

一个按键控制启动/停止

一个按键控制正反转

两个按键控制结束减速

四位数码管前一位显示正反转、1表示正转、0表示反转,后三位显示速度值

采用AT89C51单片机,以及直流电机驱动器L298

L298的IN1、IN2控制OUT1、OUT2输出高低电平

IN3、IN4控制OUT3、OUT4输出高低电平

使电机两端有一个电压差

可以外接两路直流电机。

ENA、ENB使能两路电机控制端口高电平有效。

用到的模块有数码管显示、按键获取、定时器0.

数码管显示部分

#include 
#include "Delay.h"

sbit we2=P2^1;
sbit we3=P2^2;
sbit we4=P2^3;

void Nixie(Number)
{
	switch(Number)		//位码输出
	{
		case 0:
		we2=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we2=1;

		we3=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we3=1;
		
		we4=0;
		P0=0x3f;Delay(1);we4=1;	break;	//段码输出	
		
		case 1:
		we2=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we2=1;

		we3=0;
		P0=0x5b;	//段码输出
		Delay(1);				//显示一段时间
		we3=1;

		we4=0;
		P0=0x6d;Delay(1);we4=1;
		break;
			
		case 2:
		we2=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we2=1;

		we3=0;
		P0=0x6d;	//段码输出
		Delay(1);				//显示一段时间
		we3=1;

		we4=0;
		P0=0x3f;Delay(1);we4=1;break;	//段码输出	

		case 3:
		we2=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we2=1;

		we3=0;
		P0=0x07;	//段码输出
		Delay(1);				//显示一段时间
		we3=1;

		we4=0;
		P0=0x6d;Delay(1);we4=1;break;	//段码输出
		
		case 4:
		we2=0;
		P0=0x06;	//段码输出
		Delay(1);				//显示一段时间
		we2=1;

		we3=0;
		P0=0x3f;	//段码输出
		Delay(1);				//显示一段时间
		we3=1;

		we4=0;
		P0=0x3f;Delay(1);we4=1;break;	//段码输出		
	}
}

按键获取部分

#include 
#include "Delay.h"

unsigned char Key()//按键消抖和松手检测
{
	unsigned char KeyNumber=0;
	
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);KeyNumber=1;}//获取按键值
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);KeyNumber=3;}
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);KeyNumber=4;}
	
	return KeyNumber;
}

定时器配置部分

#include 

void Timer0_Init(void)
{
	TMOD &= 0xF0;		//配置定时器模式
	TMOD |= 0x01;		//设置定时器0模式
	TL0 = 0x06;		//设置定时初值250us产生一次中断
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0=1;
	EA=1;
	PT0=0;
}

主函数以及中断服务函数

#include 
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"

sbit IN1=P2^4;
sbit IN2=P2^5;
sbit EN=P3^7;
sbit we1=P2^0;

unsigned char Counter,Compare=0;
unsigned char KeyNum;
unsigned int x=0,Speed=0;

void main()
{
	
	Timer0_Init();
	while(1)
	{	
		if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);x++;if(x==2){x=0;}}
		KeyNum=Key();
		
		if(KeyNum==3)
		{	
			Speed++;
			if(Speed==1){Compare=25;}	//设置比较值,改变PWM占空比
			if(Speed==2){Compare=50;}
			if(Speed==3){Compare=75;}
			if(Speed==4){Compare=100;}
		}
		if(KeyNum==4)
		{	
			Speed--;
			if(Speed==3){Compare=75;}//设置比较值,改变PWM占空比
			if(Speed==2){Compare=50;}
			if(Speed==1){Compare=25;}
			if(Speed==0){Compare=0;}
		}
		we1=0;//打开位选
		if(x==1)
		{
			P0=0x3f;	//段码输出
			Delay(1);	//显示一段时间
			we1=1;
		}
		else
		{
			P0=0x06;	//段码输出
			Delay(1);	//显示一段时间
			we1=1;
		}
	Nixie(Speed);		
	}
}

void Timer0_Routine() interrupt 1
{
	TL0 = 0x06;		//重装载值设置250us
	TH0 = 0xFF;		
	Counter++;
	if(Counter==100);	//计数值变化范围限制在0~99
	{
		Counter=0;
	}
	if(Counter

在这里我要感谢某站的UP主是他的视频让我学会单片机

基于51单片机的直流电机调速系统(L298的使用)_第1张图片

 

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