51单片机直流电机测速显示数码管代码带注释
时间: 2023-10-10 08:15:11 浏览: 167
以下是一个基于51单片机的直流电机测速显示数码管的代码,注释已添加:
```C
#include<reg52.h> // 引入51单片机头文件
#define uchar unsigned char // 定义无符号字符类型
#define uint unsigned int // 定义无符号整型类型
sbit IN1=P3^0; // 定义IN1引脚,用于控制电机正转
sbit IN2=P3^1; // 定义IN2引脚,用于控制电机反转
uchar code table[]={ // 定义数码管显示表
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90
};
uint count=0; // 定义计数器变量
void delay(uint z) // 定义延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() // 主函数
{
TMOD=0x01; // 定时器0工作方式为模式1
TH0=0xFF; // 定时器0初始值为0xFF
TL0=0xFF; // 定时器0初始值为0xFF
TR0=1; // 启动定时器0
ET0=1; // 允许定时器0中断
EA=1; // 开启总中断
while(1) // 无限循环
{
IN1=1; // 电机正转
IN2=0;
P0=table[count/1000]; // 在数码管的第一位显示千位数
delay(5); // 延时一段时间
P0=0x00; // 关闭数码管
P2=0xFE; // 在数码管的第一位显示千位数
delay(5); // 延时一段时间
P2=0xFF; // 关闭数码管
IN1=0; // 电机反转
IN2=1;
P0=table[count%1000/100];// 在数码管的第二位显示百位数
delay(5); // 延时一段时间
P0=0x00; // 关闭数码管
P2=0xFD; // 在数码管的第二位显示百位数
delay(5); // 延时一段时间
P2=0xFF; // 关闭数码管
IN1=1; // 电机正转
IN2=0;
P0=table[count%100/10]; // 在数码管的第三位显示十位数
delay(5); // 延时一段时间
P0=0x00; // 关闭数码管
P2=0xFB; // 在数码管的第三位显示十位数
delay(5); // 延时一段时间
P2=0xFF; // 关闭数码管
IN1=0; // 电机反转
IN2=1;
P0=table[count%10]; // 在数码管的第四位显示个位数
delay(5); // 延时一段时间
P0=0x00; // 关闭数码管
P2=0xF7; // 在数码管的第四位显示个位数
delay(5); // 延时一段时间
P2=0xFF; // 关闭数码管
}
}
void timer0() interrupt 1 // 定时器0中断处理函数
{
TH0=0xFF; // 定时器0初始值为0xFF
TL0=0xFF; // 定时器0初始值为0xFF
count++; // 计数器加1
}
```
该代码通过定时器中断计算电机转速,然后在数码管上显示电机转速。在主函数中,通过控制电机的正反转和不同的数码管显示位,实现对电机转速的计数和显示。同时,通过定时器中断,实现对计数器变量的加1操作,从而计算电机转速。
阅读全文