超声波其实挺简单的,发个脉冲就可以读了
给你个我自己写的吧 不是很完美
#include "HC_SR04_T1.h"
//变量区
static int Lvt = 0; //低电平时间变量
static int Hvt = 0; //高电平时间变量
static char V_Flag = 0; //电平标志变量
static char S_Flag = 0; //状态标志量:0 未运行,1 正在运行,2 运行超时
/* 超声波初始化函数
超声波端口初始化,设置单片机与Trig口相连的引脚为
输出;设置T1定时/计数器工作于输入捕捉方式,输入噪声
抑制,触发沿为上升沿(用于捕捉超声波的上升沿),开定
时/计数器,8分频。
*/
void HC_SR04_Init(void){
Trig_DDR_1;
Echo_DDR_0;
Trig_PORT_0;
Echo_PORT_1;
TCCR1B = (1 << ICNC1)|(1 << ICES1)|(1 << CS11);
TIMSK = (1 << TICIE1)|(1 << TOIE1); //输入捕捉中断,溢出中断
TCNT1 = 0;
}
/* 超声波发射发射函数
单片机控制超声波,用于超声波模块发射超声波。
*/
void HC_SR04_Send(void){
SREG = 0x80; //全局中断使能
TIFR = ~(1 << ICF1)|(1 << TOV1);
TCNT1 = 0;
Trig_PORT_1;
_delay_us(15);
Trig_PORT_0;
S_Flag = 1; //模块正在运行
}
int HC_SR04_Juli(void){
int Juli = 0;
Juli = Hvt - Lvt;
Juli = (int)Juli/5; //距离的单位为毫米
SREG = 0x00; //关闭全局中断
S_Flag = 0; //模块停止运行
return Juli;
}
int HC_SR04_State(void){
char State;
State = S_Flag;
return State;
}
ISR(TIMER1_CAPT_vect){
if(V_Flag == 0){
Lvt = ICR1;
TCCR1B &= ~(1 << ICES1);
V_Flag = 1; //置位标志位,以使得下次输入捕捉中断中执行对下降沿处理的程序
}
else{//V_Flag == 1;
Hvt = ICR1;
TCCR1B |= (1 << ICES1);
V_Flag = 0; //置位标清零,以使得下次输入捕捉中断中执行对上升沿处理的程序
}
}
ISR(TIMER1_OVF_vect){
S_Flag = 2; //模块运行超时
}
接口如下
#define HC_SR04_DDR DDRD
#define HC_SR04_PORT PORTD
#define HC_SR04_PIN PIND
#define Trig 0
#define Echo 6
|