直流电机的两端连接在ULN2003D的VCC与OUTx端(x任选1~4引脚),请实现直流电机的运行和停止控制,启动键为独立按键区的K1,停止键为K2。51单片机数码管显示学号
时间: 2023-07-15 18:15:20 浏览: 145
首先,需要连接ULN2003D与直流电机。ULN2003D的COM端连接到电源的负极,VCC端连接到电源的正极,OUTx端分别连接到直流电机的两个端口。
接下来,我们可以使用51单片机的IO口来控制ULN2003D的INx端口。在程序中,我们可以设置一个变量来控制直流电机的运行或停止状态。按下启动键K1时,将该变量设为1,直流电机开始运行;按下停止键K2时,将该变量设为0,直流电机停止运行。
同时,我们可以使用定时器中断来进行数码管的显示。在定时器中断服务函数中,将学号转换成数码管码并输出到数码管上即可。
以下是完整的程序代码:
```c
#include <reg52.h>
sbit K1 = P1^0; // 启动键
sbit K2 = P1^1; // 停止键
sbit A = P2^0; // 数码管A段
sbit B = P2^1; // 数码管B段
sbit C = P2^2; // 数码管C段
sbit D = P2^3; // 数码管D段
sbit E = P2^4; // 数码管E段
sbit F = P2^5; // 数码管F段
sbit G = P2^6; // 数码管G段
sbit DP = P2^7; // 数码管小数点
unsigned char code numCode[] = { // 数码管码表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
unsigned int num = 20190001; // 学号
unsigned char motorState = 0; // 直流电机状态,0表示停止,1表示运行
void delay(unsigned int t) {
unsigned int i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(unsigned char n) { // 数码管显示函数
P0 = numCode[n];
}
void timer0() interrupt 1 { // 定时器中断服务函数
static unsigned char i = 0; // 数码管位数
TH0 = 0xfc; // 定时器初值
TL0 = 0x67;
i++;
switch (i) {
case 1:
DP = 1;
display(num / 1000000);
break;
case 2:
A = 1;
display(num % 1000000 / 100000);
break;
case 3:
B = 1;
display(num % 100000 / 10000);
break;
case 4:
C = 1;
display(num % 10000 / 1000);
break;
case 5:
D = 1;
display(num % 1000 / 100);
break;
case 6:
E = 1;
display(num % 100 / 10);
break;
case 7:
F = 1;
display(num % 10);
break;
case 8:
G = 1;
DP = 0;
i = 0;
break;
}
A = 0;
B = 0;
C = 0;
D = 0;
E = 0;
F = 0;
G = 0;
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0xfc; // 定时器初值
TL0 = 0x67;
ET0 = 1; // 允许定时器0中断
EA = 1; // 允许总中断
TR0 = 1; // 启动定时器0
while (1) {
if (K1 == 0) { // 启动键按下,直流电机开始运行
motorState = 1;
P3 = 0x01; // IN1端口输出高电平,使直流电机转动
}
if (K2 == 0) { // 停止键按下,直流电机停止运行
motorState = 0;
P3 = 0x00; // IN1和IN2端口输出低电平,使直流电机停止转动
}
if (motorState == 1) { // 直流电机正在运行
delay(1000); // 延时1秒
P3 = ~P3; // IN1和IN2端口电平翻转,使直流电机反向转动
}
}
}
```
阅读全文