直流电机的两端连接在ULN2003D的VCC与OUTx端(x任选1~4引脚),请实现直流电机的运行和停止控制,启动键为独立按键区的K1,停止键为K2。51单片机数码管显示学号
时间: 2023-07-16 14:14:02 浏览: 86
以下是基于51单片机的代码实现:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
sbit K1 = P3^0; // 启动键
sbit K2 = P3^1; // 停止键
sbit IN1 = P1^0; // 电机接口1
sbit IN2 = P1^1; // 电机接口2
sbit IN3 = P1^2; // 电机接口3
sbit IN4 = P1^3; // 电机接口4
uint code num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示0~9
void delay(uint ms) { // 延时函数
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void main() {
uint i, j = 0;
uint flag = 0; // 电机运行标志位,0表示停止,1表示运行
while(1) {
if(K1 == 0 && K2 == 1) { // 检测启动键
if(flag == 0) { // 如果当前电机处于停止状态
for(i = 0; i < 8; i++) { // 顺时针旋转
IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;
delay(10);
IN1 = 1; IN2 = 1; IN3 = 0; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 1;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1;
delay(10);
IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1;
delay(10);
}
flag = 1; // 标志电机已启动
}
P0 = num[j++]; // 数码管显示学号
if(j >= 4) j = 0; // 学号共4位,循环显示
} else if(K1 == 1 && K2 == 0) { // 检测停止键
if(flag == 1) { // 如果当前电机处于运行状态
for(i = 0; i < 8; i++) { // 逆时针旋转
IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 1;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 1;
delay(10);
IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 1; IN3 = 1; IN4 = 0;
delay(10);
IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0;
delay(10);
IN1 = 1; IN2 = 1; IN3 = 0; IN4 = 0;
delay(10);
IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0;
delay(10);
}
flag = 0; // 标志电机已停止
}
P0 = 0xff; // 数码管清空显示
}
}
}
```
其中,ULN2003D是一个具有7个NPN晶体管阵列的高压、高电流Darlington晶体管阵列驱动芯片,常用于直流电机的控制。在本例中,通过控制IN1~IN4四个引脚的高低电平,实现电机的顺时针和逆时针旋转。
在主函数中,通过不断检测启动键和停止键的状态,判断电机当前状态并进行相应操作。同时,使用一个标志位flag来记录电机的运行状态。
数码管的显示使用了一个num数组来存储0~9的编码,通过循环显示学号的每一位来实现数码管显示。
阅读全文