51单片机直流电机测速显示数码管代码
时间: 2023-10-10 12:14:18 浏览: 88
下面是基于Keil C51编译器的51单片机直流电机测速显示数码管代码示例:
```c
#include <reg52.h>
// 定义端口
sbit INA = P1^0; // 正向旋转信号
sbit INB = P1^1; // 反向旋转信号
sbit SPEED_IN = P1^2; // 速度检测信号
sbit S1 = P2^0; // 数码管第一位
sbit S2 = P2^1; // 数码管第二位
sbit S3 = P2^2; // 数码管第三位
sbit S4 = P2^3; // 数码管第四位
// 定义延时函数
void Delay(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
// 显示函数
void Display(unsigned char num, unsigned char pos)
{
switch(pos)
{
case 1: S1=0,S2=1,S3=1,S4=1;break;
case 2: S1=1,S2=0,S3=1,S4=1;break;
case 3: S1=1,S2=1,S3=0,S4=1;break;
case 4: S1=1,S2=1,S3=1,S4=0;break;
}
P0 = num;
Delay(5);
P0 = 0x00;
}
// 主函数
void main()
{
unsigned char speed = 0; // 速度计数值
unsigned int time = 0; // 计时器值
unsigned long count = 0; // 计数器值
unsigned char display_data[4] = {0, 0, 0, 0}; // 显示数据
unsigned char display_pos = 1; // 显示位置
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x3C; // 定时器初值为0x3C
TL0 = 0xB0;
TR0 = 1; // 启动定时器0
while (1)
{
if (SPEED_IN == 0) // 速度检测信号为低电平
{
count++; // 计数器加1
}
if (time >= 200) // 计时器值达到200ms
{
TR0 = 0; // 停止定时器0
speed = count / 4; // 计算速度,每个脉冲代表4ms
count = 0; // 计数器清零
time = 0; // 计时器清零
TR0 = 1; // 启动定时器0
}
if (display_pos == 1) // 第一位显示速度的百位
{
display_data[0] = speed / 100;
}
else if (display_pos == 2) // 第二位显示速度的十位
{
display_data[1] = speed % 100 / 10;
}
else if (display_pos == 3) // 第三位显示速度的个位
{
display_data[2] = speed % 10;
}
else if (display_pos == 4) // 第四位显示电机旋转方向
{
if (INA == 1 && INB == 0) // 正向旋转
{
display_data[3] = 0x06; // 数码管显示“F”
}
else if (INA == 0 && INB == 1) // 反向旋转
{
display_data[3] = 0x09; // 数码管显示“r”
}
}
Display(display_data[display_pos-1], display_pos); // 数码管显示
display_pos++; // 显示位置加1
if (display_pos > 4)
{
display_pos = 1; // 显示位置恢复为1
}
time++; // 计时器加1
}
}
```
需要注意的是,以上代码仅为示例,具体实现还需要根据硬件电路和电机的实际情况进行修改和完善。