51单片机+L293D控制直流电机起保停+数码管PWM调速显示

51单片机+L293D控制直流电机起保停+数码管PWM调速显示
  • PWM速度10级可调

  • 采用L293D驱动

  • 数码管显示PWM当前占空比

  • 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少单片机的IO口占用,例如74LS138译码器来驱动,前面几篇文章有写到采用数码管驱动芯片来做示例的可以参照。

  • 仿真演示
    51单片机+L293D控制直流电机起保停+数码管PWM调速显示

  • 程序代码

#include <STC89C5xRC.H>
typedef unsigned char u8;
typedef unsigned int u16;
#define EN1 P22
#define D1 P20
#define D2 P21
#define button_Z P10
#define buttun_R P11
#define button_T P12
#define PWM_add P13
//#define PWM_sub P14
u8 flag=0;
u8 flag1=0;
static u8 b =5;
u8 code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void init();
void zhengzhuan();
void fanzhuang();
void ting();
void buttonscan();
void delayms(u8 rms);
void display(u16 num);

void main (){

	init();
	EA=1;
	while(1)
	{
		 buttonscan();	
			
	}
}

void zhengzhuan(){
	//EN1=1;
	ET0=1;
	D1=1;
	D2=0;
}
void fanzhuang(){
	//EN1=1;
	ET0=1;
	D1=0;
	D2=1;
}
void ting(){
//	EN1=0;
	ET0=0;
	D1=1;
	D2=1;
}
void buttonscan(){
	if(button_T==0){
		ting();	
	}
	if(button_Z==0){
		zhengzhuan();
	}
	if(buttun_R==0){
		fanzhuang();
	}	
		if(PWM_add==0&&flag==0){
			flag=1;
		}
		if(PWM_add==1&&flag==1)
		{
			b++;
			if(b>10)b=0;
		flag=0;
		}
	display(b);		

}
void init()
{  	
	TMOD=0X01;
	TH0 = (65536-1000)/256;
	TL0 = (65536-1000)%256;
	TR0 =1;
	ET0=1;
	EA=1;
	ET0=1;
}
void time0 ()interrupt 1
{//中断处理函数
	static u16 a;
	TH0 = (65536-1000)/256;
	TL0 = (65536-1000)%256;
a++;
if(a>9) //1khz 
a=0;
if(a<b) //占空比可改 
EN1=1; 
else EN1=0;
 
}
void display(u16 num)
{
P27=0;
P0=table[(num/1000)];
delayms(2);
P0=0X00;//消隐
P27=1;

P26=0;
P0=table[(num/1000)];
delayms(2);
P0=0X00;
P26=1;

P25=0;
P0=table[(num/10)];
delayms(2);
P0=0X00;
P25=1;

P24=0;
P0=table[(num%10)];
delayms(2);
P0=0X00;

P24=1;
 }

void delayms(u8 rms)
{
	u8 i,j;
	for(i=0;i<rms;i++)
		for(j=0;j<110;j++);
}

上一篇:调光比计算


下一篇:和12岁小同志搞创客开发:设计一款亮度可调节灯