超声波模块SRF05

简介: 超声波模块SRF05

纯干货:

超声波

//
//     PIC16F877 + HY-SRF05 + LCD03 example
//     Written October 2008 , using HITECH PIC16 compiler
// 
// Note - assumes a 20MHz crystal, which is 5MHz timer clock
// A 1:4 prescaler is used to give a 1.25MHz timer count (0.8uS per tick)
//
//     This code is Freeware - Use it for any purpose you like.
//
///
#include <pic.h>
#include <stdio.h>
__CONFIG(0x3b32); 
#define trig RB0
#define echo RB1
void clrscn(void); // prototypes
void cursor(char pos);
void print(char *p);
void setup(void);
unsigned int get_srf04(void);
char s[21]; // buffer used to hold text to print
void main(void)
{
    unsigned int range;
    setup(); // sets up the PIC16F877 I2C port
    clrscn(); // clears the LCD03 disply
    cursor(2); // sets cursor to 1st row of LCD03
    sprintf(s,"SRF04 Ranger Test");// text, printed into our buffer
    print(s); // send it to the LCD03
    while(1) 
    { // loop forever
        range = get_srf04();// get range from srf04 (round trip flight time in 0.8uS units)
        cursor(24); // sets cursor to 2nd row of LCD03
        sprintf(s,"Range = %dcm  ", range/72);// convert to cm
        print(s); // send it to the LCD03 
        cursor(44); // sets cursor to 3rd row of LCD03
        sprintf(s,"Range = %dinch  ", range/185);// convert to inches
        print(s); // send it to the LCD03 
        TMR1H = 0; // 52mS delay - this is so that the SRF04 ranging is not too rapid
        TMR1L = 0; // and the previous pulse has faded away before we start the next one
        T1CON = 0x21; // 1:4 prescale and running
        TMR1IF = 0;
        while(!TMR1IF);// wait for delay time
        TMR1ON = 0; // stop timer 
    }
}
unsigned int get_srf04(void)
{
    TMR1H = 0xff; // prepare timer for 10uS pulse
    TMR1L = -14;
    T1CON = 0x21; // 1:4 prescale and running
    TMR1IF = 0; 
    trig = 1; // start trigger pulse
    while(!TMR1IF);// wait 10uS
    trig = 0; // end trigger pulse
    TMR1ON = 0; // stop timer
    TMR1H = 0; // prepare timer to measure echo pulse
    TMR1L = 0;
    T1CON = 0x20; // 1:4 prescale but not running yet
    TMR1IF = 0;
    while(!echo && !TMR1IF);// wait for echo pulse to start (go high)
    TMR1ON = 1; // start timer to measure pulse
    while(echo && !TMR1IF);// wait for echo pulse to stop (go low)
    TMR1ON = 0; // stop timer
    return (TMR1H<<8)+TMR1L;// TMR1H:TMR1L contains flight time of the pulse in 0.8uS units
}
void clrscn(void)
{
    SEN = 1; // send start bit
    while(SEN); // and wait for it to clear
    SSPIF = 0;
    SSPBUF = 0xc6;// LCD02 I2C address
    while(!SSPIF);// wait for interrupt
    SSPIF = 0; // then clear it.
    SSPBUF = 0; // address of register to write to 
    while(!SSPIF);// 
    SSPIF = 0; //
    SSPBUF = 12; // clear screen 
    while(!SSPIF);// 
    SSPIF = 0; //
    SSPBUF = 4; // cursor off 
    while(!SSPIF);// 
    SSPIF = 0; //
    PEN = 1; // send stop bit
    while(PEN); //
}
void cursor(char pos)
{
    SEN = 1; // send start bit
    while(SEN); // and wait for it to clear
    SSPIF = 0;
    SSPBUF = 0xc6;// LCD02 I2C address
    while(!SSPIF);// wait for interrupt
    SSPIF = 0; // then clear it.
    SSPBUF = 0; // address of register to write to 
    while(!SSPIF);// 
    SSPIF = 0; //
    SSPBUF = 2; // set cursor 
    while(!SSPIF);// 
    SSPIF = 0; //
    SSPBUF = pos; //  
    while(!SSPIF);// 
    SSPIF = 0; //
    PEN = 1; // send stop bit
    while(PEN); //
}
void print(char *p)
{
    SEN = 1; // send start bit
    while(SEN); // and wait for it to clear
    SSPIF = 0;
    SSPBUF = 0xc6;// LCD02 I2C address
    while(!SSPIF);// wait for interrupt
    SSPIF = 0; // then clear it.
    SSPBUF = 0; // address of register to write to 
    while(!SSPIF);// 
    SSPIF = 0; //
    while(*p) 
    {
        SSPBUF = *p++;// write the data 
        while(!SSPIF);// 
        SSPIF = 0; // 
    }
    PEN = 1; // send stop bit
    while(PEN); //
}
void setup(void)
{
    unsigned long x;
    TRISB = 0xfe; // RB0 (trig) is output
    PORTB = 0xfe; // and starts low
    TRISC = 0xff;
    PORTC = 0xff;
    SSPSTAT = 0x80;
    SSPCON = 0x38;
    SSPCON2 = 0x00;
    SSPADD = 50; // SCL = 91khz with 20Mhz Osc
    for(x=0; x<300000L; x++);// wait for LCD03 to initialise 
}

代码:

相关文章
|
传感器 数据格式
DTH11 温湿度模块
DTH11 温湿度模块
138 0
|
6月前
|
传感器 编解码
振动电阻式传感器测量模块的传感器接口
振动电阻式传感器测量模块的传感器接口
振动电阻式传感器测量模块的传感器接口
|
6月前
技术心得:声之翼——超声波模块
技术心得:声之翼——超声波模块
22 0
|
7月前
|
传感器 安全 数据可视化
LabVIEW开发气体调节器
LabVIEW开发气体调节器
38 1
|
传感器 Linux
Linux驱动基础(SR501人体感应模块)
Linux驱动基础(SR501人体感应模块)
127 0
|
传感器 数据处理
工程监测仪器振弦传感器信号转换器在隧道中的详细应用
隧道工程是指为铁路、公路、城市轨道交通、水利等工程在地下开挖一定断面形状和尺寸得洞穴或通道,以满足交通运输、水利调节等需要。为了确保隧道工程的安全性和稳定性,需要对其进行监测,以及对监测数据进行分析和处理。而工程监测仪器振弦传感器信号转换器在隧道中的应用则是其中不可或缺的一部分。
工程监测仪器振弦传感器信号转换器在隧道中的详细应用
|
传感器 数据采集 安全
工程监测仪器振弦传感器信号转换器应用于隧洞监测
隧洞建设是重大工程项目,监测隧洞结构和环境的变化对确保隧洞安全和运行管理至关重要。工程监测仪器是实现隧洞监测的关键设备,其中振弦传感器和信号转换器是非常重要的组成部分。
工程监测仪器振弦传感器信号转换器应用于隧洞监测
|
传感器 芯片
可编程 USB 转串口适配器开发板与振弦传感器测量模块
当通过 IIC 接口修改 VM5xx 单个寄存器后,被修改的寄存器立即保存(断电不丢失),但连续寄存器的写入仅当时修改生效,模块重启后会自动恢复。为了能够使寄存器永久保存,可以单独向功能寄存器 03 写入指令码 0x000C 来强制保存所有寄存器。
可编程 USB 转串口适配器开发板与振弦传感器测量模块
|
传感器 数据采集 安全
振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测
振弦传感器信号转换器(VTI104_DIN)是一种用于实现振弦传感器信号转换的设备,可将振弦传感器所采集到的振动信号转换成电信号,并通过模拟量输出或数字量输出的方式进行传输和记录。在岩土工程监测中,振弦传感器信号转换器广泛应用于地震动监测、建筑物结构安全监测、地下水位监测等方面。
振弦传感器信号转换器(VTI104_DIN)应用岩土工程监测
|
存储 传感器 算法
光学雨量计接线定义
IFR02 是通过红外光扫描原理非接触式检测降雨量的传感器(光学雨量计)。使用独特的智能学习适应算法, 可在复杂光环境中使用,具有很强的抗外部干扰能力。采用渐变脉宽调制与动态比例校正技术有利保障数据稳定性与材料老化导光性能下降的不利影响。内建 4 种雨型,可识别冲刷型、密集型、离散型、附着型降雨并分别处理。具备结露测量功能、 数据存储功能,自动记录降雨总量。光耦隔离脉冲信号输出兼容翻斗雨量计、 RS232 或者 RS485 接口方便信息化集成。多年底层技术、降雨模型积累,持续的改进升级,保障用户产品同步提升。
光学雨量计接线定义