51单片机+L293D控制直流电机起保停+数码管PWM调速显示
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机+L293D控制直流电机起保停+数码管PWM调速显示相关的知识,希望对你有一定的参考价值。
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++);
}
以上是关于51单片机+L293D控制直流电机起保停+数码管PWM调速显示的主要内容,如果未能解决你的问题,请参考以下文章
blinker控制步进电机起保停,正反转,加减速(Arduino uno+esp8266+TB6600驱动器)
外部按键中断精准控制步进电机起保停,正反转,加减速Arduino+TB6600驱动器)
VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制