yzwzfyz 发表于 2023-9-20 08:51
都有问题,不信,上图、上程序。
不好意思粘粘别人的我用的是--/我不太写得出来
HCSR04.c
#include <REGX52.H>
#include "Timer0.h"
//定义引脚接口
sbit Trig = P1^0;
sbit Echo = P1^1;
/**
* @brief HC-SR04初始化
* @param 无
* @retval 无
*/
void HCSR04_Init()
{
Timer0_Init();
Trig = 0;
Echo = 0;
}
/**
* @brief HC-SR04接收一个12us的触发信号
* @param 无
* @retval 无
*/
void HCSR04_Trig()
{
unsigned char i;
Trig = 1;
i = 5;while (--i); //延时12us
Trig = 0;
}
/**
* @brief HC-SR04接收触发信号并计算回波信号高电平时间
* @param 无
* @retval 无
*/
void HCSR04_Set()
{
HCSR04_Trig();
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
}
/**
* @brief HC-SR04计算模块与障碍间的距离
* @param Duration(持续时间) 发送到接收的间隔时间
* @param Distance 模块与障碍间的距离
* @retval Distance
*/
float HCSR04_Calc()
{
unsigned int Duration = 0;
float Distance = 0;
Duration = TH0*256+TL0;
Distance = Duration*0.017;//时间*音速/2,音速=340m/s=0.034cm/us
TH0 = 0;
TL0 = 0;
return Distance;
}
Timer0.c
#include <REGX52.H>
/**
* @brief 定时器0初始化@11.0592MHz
* @param 无
* @retval 无
*/
void Timer0_Init() //@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0 = 0; //设置定时初值
TL0 = 0; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 0; //定时器0不计时
}
main.c
#include <REGX52.H>
#include "Delay.h"
#include "HCSR04.h"
#include "LCD1602.h"
unsigned int Distance;
void main()
{
LCD_Init(); //LCD1602初始化
HCSR04_Init(); //HC-SR04初始化
LCD_ShowString(1,1,"Distance:");
LCD_ShowString(2,4,"cm");
while(1)
{
HCSR04_Set(); //HC-SR04接收触发信号并计算回波信号高电平时间
Distance = HCSR04_Calc(); //计算距离
LCD_ShowNum(2,1,Distance,3);//调用显示
Delay(20);
}
} |