超声波模块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 
}

代码:

相关文章
|
Java 项目管理 开发工具
《Git 简易速速上手小册》第7章:处理大型项目(2024 最新版)
《Git 简易速速上手小册》第7章:处理大型项目(2024 最新版)
306 2
|
SQL 存储 监控
让跨 project 联查更轻松,SLS StoreView 查询和分析实践
在业务场景中,日志数据可能存储在日志服务 Project 的不同 Logstore/MetricStore 中或不同地域的 Project 中。日志服务的数据集(StoreView)功能支持跨地域、跨 Store 联合查询和分析,让用户基于数据集就能高效便捷地查询分析全地域的数据,真正做到数据分析不受地域边界的限制。
412 104
|
9月前
|
存储 安全 算法
FastAdmin框架超级管理员密码重置与常规admin安全机制解析-卓伊凡|大东家
FastAdmin框架超级管理员密码重置与常规admin安全机制解析-卓伊凡|大东家
1022 7
|
9月前
|
存储 安全 NoSQL
询律法律咨询平台:功能实现与技术架构详解
询律法律咨询平台是一个连接用户与律师的综合性服务平台,涵盖在线咨询、支付系统、知识专辑管理、直播课堂等功能。平台通过整合律师资源与技术手段,打破传统法律咨询的时空限制,提供便捷、专业的法律服务。项目采用WebSocket实时通信、分布式锁、ElasticSearch搜索、第三方支付等技术,构建了一套稳定高效的法律服务体系,保障高并发场景下的系统稳定性和数据安全。
240 0
|
机器学习/深度学习 人工智能 文字识别
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
Umi-OCR 是一款免费开源的离线 OCR 文字识别工具,支持截图、批量图片、PDF 扫描件的文字识别,内置多语言识别库,提供命令行和 HTTP 接口调用功能。
1283 0
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
|
SQL 缓存 关系型数据库
(十二)MySQL之内存篇:深入探寻数据库内存与Buffer Pool的奥妙!
MySQL是基于磁盘工作的,这句几乎刻在了每个后端程序员DNA里,但它真的对吗?其实答案并不能盖棺定论,你可以说MySQL是基于磁盘实现的,这点我十分认同,但要说MySQL是基于磁盘工作,这点我则抱否定的态度,至于为什么呢?这跟咱们本章的主角:Buffer Pool有关,Buffer Pool是什么?还记得咱们在《MySQL架构篇》中聊到的缓存和缓冲区么,其中所提到的写入缓冲区就位于Buffer Pool中。
1532 1
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
物联网 UED 智能硬件
无线模块空中唤醒技术原理详解
空中唤醒(Wake on Radio, WOR)技术**降低了设备功耗,通过休眠和接收模式切换实现。设备接收到特殊前导码时唤醒,未接收到数据则返回休眠。配置精确的唤醒和休眠时间确保响应及时且节能。不仅用于数据接收,还能结合智能操作,如空中轨迹唤醒,提升用户体验。广泛应用于物联网和智能家居,随着技术发展,其潜力和应用将更加广泛。
575 0
|
Rust
安装vscode的rust插件
安装vscode的rust插件
378 0
安装vscode的rust插件
|
关系型数据库 MySQL Java
Flink CDC编译问题之增加依赖包失败如何解决
Flink CDC编译指的是将Flink CDC源代码转换成可执行程序的过程,可能会涉及到依赖管理和环境配置等问题;本合集将介绍Flink CDC编译的步骤、常见错误及其解决办法,以确保顺利完成编译过程。