yzwzfyz 發(fā)表于 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的觸發(fā)信號
* @param 無
* @retval 無
*/
void HCSR04_Trig()
{
unsigned char i;
Trig = 1;
i = 5;while (--i); //延時12us
Trig = 0;
}
/**
* @brief HC-SR04接收觸發(fā)信號并計算回波信號高電平時間
* @param 無
* @retval 無
*/
void HCSR04_Set()
{
HCSR04_Trig();
while(!Echo);
TR0 = 1;
while(Echo);
TR0 = 0;
}
/**
* @brief HC-SR04計算模塊與障礙間的距離
* @param Duration(持續(xù)時間) 發(fā)送到接收的間隔時間
* @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接收觸發(fā)信號并計算回波信號高電平時間
Distance = HCSR04_Calc(); //計算距離
LCD_ShowNum(2,1,Distance,3);//調用顯示
Delay(20);
}
} |