刚学没多久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);
}
}
更多回帖