51单片机实现超声波测距数码管显示精确到小数点后两位代码
时间: 2023-11-08 19:05:37 浏览: 246
超声波测距(数码管显示)_51单片机_超声波_
3星 · 编辑精心推荐
下面是一个简单的51单片机实现超声波测距并数码管显示的代码,精确到小数点后两位:
```
#include <reg51.h>
#define TRIG P1_0
#define ECHO P1_1
#define DIGIT P2
#define SEG P0
unsigned int distance = 0;
void delay_us(unsigned int us)
{
while(us--)
{
_nop_();
}
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
delay_us(1000);
}
}
void init()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0; // 定时器0初始值
TL0 = 0;
}
void start_measure()
{
TRIG = 1; // 发射超声波
delay_us(10);
TRIG = 0;
while(!ECHO); // 等待超声波回波
TR0 = 1; // 启动定时器0
while(ECHO); // 等待超声波回波结束
TR0 = 0; // 停止定时器0
distance = (TH0 << 8) | TL0; // 计算距离
distance /= 58;
}
void display_distance(unsigned int distance)
{
unsigned char digit[4] = {0, 0, 0, 0};
digit[0] = distance / 1000;
digit[1] = distance / 100 % 10;
digit[2] = distance / 10 % 10;
digit[3] = distance % 10;
DIGIT = 0x00; // 所有数码管关闭
SEG = 0xff; // 所有数码管段关闭
SEG = 0x7f; // 小数点段打开
DIGIT = 0x01; // 第一个数码管打开
SEG = ~(0x3f & digit[0]); // 显示第一个数码管的数字
delay_ms(1);
DIGIT = 0x02; // 第二个数码管打开
SEG = ~(0x3f & digit[1]); // 显示第二个数码管的数字
delay_ms(1);
DIGIT = 0x04; // 第三个数码管打开
SEG = ~(0x3f & digit[2]); // 显示第三个数码管的数字
delay_ms(1);
DIGIT = 0x08; // 第四个数码管打开
SEG = ~(0x3f & digit[3]); // 显示第四个数码管的数字
delay_ms(1);
}
void main()
{
init();
while(1)
{
start_measure();
display_distance(distance * 100); // 将距离值乘以100后取整显示
}
}
```
注:以上代码仅为参考,需要根据具体硬件和需求进行调整和修改。
阅读全文