51单片机+直流电机PWM 10级调速控制

51单片机+直流电机PWM 10级调速控制


  • 🎬Proteus仿真演示:
    在这里插入图片描述

📓功能说明

通过按键,可以调节电机转速以及电机转向,数码管显示当前速度的等级。

📝示例程序代码

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
135
136
137
#include <STC89C5xRC.H>
//#include <reg52.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};//共阴数码管断码:0-9
//共阴数码管显示
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++);
}


📚程序源码和仿真示例

1
2
3
链接:https://pan.baidu.com/s/1PU3voFwHbU9qkJfBZ7vxmw 
提取码:w9te