51单片机+L293D控制直流电机起保停+数码管PWM调速显示
-
PWM速度10级可调
-
采用L293D驱动
-
数码管显示PWM当前占空比
-
可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少单片机的IO口占用,例如74LS138译码器来驱动,前面几篇文章有写到采用数码管驱动芯片来做示例的可以参照。
-
仿真演示
-
程序代码
#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++);
}