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

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


  • PWM速度10级可调
  • 采用L293D驱动
  • 数码管显示PWM当前占空比
  • 可优化的地方是数码管可以采用其他驱动芯片来驱动,提高驱动能力和减少单片机的IO口占用,例如74LS138译码器来驱动,前面几篇文章有写到采用数码管驱动芯片来做示例的可以参照。
  • 仿真演示
    在这里插入图片描述
  • 程序代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#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++);
}