单片机/MCU论坛
直播中

jf_84800041

未满1年用户 6经验值
擅长:嵌入式技术 控制/MCU
私信 关注
[问答]

关于74HC595八位一体数码管显示超声波测距结果

刚学没多久51,想使用两个74HC595组成的8位一体数码管显示超声波测距的结果,但是代码有些问题不知道怎么解决,代码应该是在Getdistance函数卡住了,不过相同的测距函数我放在LCD1602上就可以正常显示,把Getdistance注释掉单独测试数码管显示函数也是正常的,真的很迷惑,希望有大佬能帮忙看一下,不胜感激

#include <AT89X51.H>
#include <stdlib.h>
#include <intrins.h>

int m,h,f,d,p;
float Distance;

sbit DIO = P1^0;				//串行数据输入
sbit RCLK  = P1^1;				//时钟脉冲信号——上升沿有效
sbit SCLK = P1^2;				//打入信号————上升沿有效

unsigned char LED[8];	//用于LED的8位显示缓存

sbit Trig = P2^6;
sbit Echo = P2^5;

void Delayms(int ms)	//@11.0592MHz
{
	unsigned char i, j;
	int k;
	for(k=0;k<ms;k++){
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void Timer0_Init()
{
    TMOD &= 0xF0;    // 清除定时器0模式位
    TMOD |= 0x01;    // 设置定时器0为模式1(16位定时器)
    TH0 = 0;         // 初始化高位
    TL0 = 0;         // 初始化低位
    ET0 = 1;         // 使能定时器0中断(可选,如果需要中断处理)
    TR0 = 0;         // 关闭定时器0
}

void Delay10us(void)	//@12.000MHz
{
	unsigned char i;

	_nop_();
	i = 2;
	while (--i);
}
float GetDistance()
{
//	float velocity;
    unsigned long timer_count;
	float distance;

    // 触发超声波测量
    Trig = 1;
    Delay10us();       // Trig高电平持续至少10us
    Trig = 0;

    // 等待Echo高电平
    while(!Echo);
    TR0 = 1;         // 启动定时器0计时

    // 等待Echo低电平
    while(Echo);
    TR0 = 0;         // 停止定时器0计时

    // 计算脉冲持续时间
    timer_count = TH0;
    timer_count <<= 8;
    timer_count |= TL0;
//	velocity=331.3+ 0.606*T+0.0124*H;

//    // 将时间转换为距离(单位:厘米)
//    distance = timer_count * velocity/20000; // 计算单位为厘米
	distance = timer_count * 1.7/100;
    TH0 = 0;         // 重置定时器
    TL0 = 0;
	return distance;
}
void LED_display(float value)
{
	int temp_int=(int)value;
	int a;
	float temp_f=value-temp_int;
	LED[6]=temp_int/100;
	LED[5]=temp_int%100/10;
	LED[4]=temp_int%10;
	a=temp_f*100;
	LED[3]=a/10;
	LED[2]=a%10;
	
}

void LED_OUT(unsigned char X)
{
	unsigned char i;
	for(i=8;i>=1;i--)
	{
		if (X&0x80) DIO=1; else DIO=0;
		X<<=1;
		SCLK = 0;
		SCLK = 1;
	}
}

unsigned char code LED_0F[] = 
{// 0	 1	  2	   3	4	 5	  6	   7	8	 9	  	   
	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
};
void LED4_Display (void)
{
	unsigned char code *led_table;          // 查表指针
	unsigned char i;
	//显示第1位
	led_table = LED_0F + LED[0];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x01);		

	RCLK = 0;
	RCLK = 1;
	//显示第2位
	led_table = LED_0F + LED[1];
	i = *led_table;

	LED_OUT(i);		
	LED_OUT(0x02);		

	RCLK = 0;
	RCLK = 1;
	//显示第3位
	led_table = LED_0F + LED[2];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x04);	

	RCLK = 0;
	RCLK = 1;
	//显示第4位
	led_table = LED_0F + LED[3];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x08);		

	RCLK = 0;
	RCLK = 1;
	//显示第5位
	led_table = LED_0F + LED[4];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x10);	

	RCLK = 0;
	RCLK = 1;
	//显示第6位
	led_table = LED_0F + LED[5];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x20);	

	RCLK = 0;
	RCLK = 1;
	//显示第7位
	led_table = LED_0F + LED[6];
	i = *led_table;

	LED_OUT(i);			
	LED_OUT(0x40);	

	RCLK = 0;
	RCLK = 1;
	//显示第8位
	led_table = LED_0F + LED[7];
	i = *led_table;

	LED_OUT(i);		
	LED_OUT(0x80);	

	RCLK = 0;
	RCLK = 1;
}


void main (void) 
{
	Timer0_Init();


	while(1)
	{
		Distance=GetDistance();
		LED_display(Distance);
		LED4_Display();
		Delayms(1);
	} 
} 


已退回1积分

回帖(2)

阿信509

2023-12-18 16:25:27
分段调试,一点一点定位问题所在
2 举报
  • jf_84800041: 问题确定了,是Echo一直没有变成低电平,但是仿真能正常接受和显示距离,搬到实物上会发现必须把SR04热插拔一下LCD和数码管才能开始显示,也就是说这个时候echo引脚电平才开始变化,这个bug就很迷
  • jf_84800041: 排查出来问题是echo一直处于高电平,没有回响信号,所以程序卡住了,但是仿真是没有问题的,距离变化数据也跟着变,搬到实物上就会出现sr04必须热拔插一下才有数据显示,而且复位后数据就没了,仿真上是必须复位一下才有数据产生,就不太懂为什么

jf_84800041

2023-12-18 17:19:41
排查出来问题是echo一直处于高电平,没有回响信号,所以程序卡住了,但是仿真是没有问题的,距离变化数据也跟着变,搬到实物上就会出现sr04必须热拔插一下才有数据显示,而且复位后数据就没了,仿真上是必须复位一下才有数据产生,就不太懂为什么
举报

更多回帖

发帖
×
20
完善资料,
赚取积分