////////////////////////////////////////////////////////////////////////////////

//

//     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

}

超声波模块SRF05的更多相关文章

  1. 关于HC04超声波模块测距的思考(51版)

    之前写过一篇HC04的使用文章,当时是使用stm32来实现的,原文链接. 后来又多次使用51来驱动这个模块,有时候有测距需要,使用了几次,总是感觉我上次那个程序不是很好, 所以这次对它进行了改进.虽然 ...

  2. 树莓派控制HC-SR04超声波模块测距(新手向+C语言向)

    因为作业要求使用c语言代码,这里先附上一段摘自网上的代码 感谢KalaerSun的c语言代码,摘自https://blog.csdn.net/qq_25247589/article/details/6 ...

  3. [TPYBoard - Micropython之会python就能做硬件 8] 学习使用超声波模块制作避障小车

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604   一.实验器材 1.TPYboard V102板  一块 2.电机驱动模块L2 ...

  4. stm32驱动超声波模块

    下面是关于stm32驱动超声波模块的一段代码,有需要的朋友可以复制参考,希望对大家能够有所帮助和启发. #define HCSR04_PORT GPIOB #define HCSR04_CLK RCC ...

  5. 超声波模块HC-SR04简介以及编程

    HC-SR04 一.主要参数1:使用电压:DC-5V2:静态电流:小于2mA3:电平输出:高5V4:电平输出:底0V5:感应角度:不大于15度6:探测距离:2cm-450cm7:高精度 可达0.2cm ...

  6. 【Arduino】超声波模块(HC-SR04)

    还好,这个模块有现成的库能够用: https://github.com/bosgood/arduino-playground/tree/master/lib/HCSR04Ultrasonic 下面仅仅 ...

  7. [自娱自乐] 2、超声波测距模块DIY笔记(二)

    前言 上一节我们已经大致浏览下目前销售的超声波测距模块同时设计了自己的分析电路,这次由于我买的电子元件都到了,所以就动手实验了下!至写该笔记时已经设计出超声波接收模块和超声波发射模块,同时存在超声波发 ...

  8. 基于STM32F103ZET6 HC_SR04超声波测距模块

    这是最后的实验现象,改变不同的角度即可测得距离 板子 PZ6806L 超声波模块 HC_SR04 HC_SR04模块讲解 通过该超声波模块说明书,可明白供电需VCC 5V  还需GND  ECHO(回 ...

  9. loto示波器实践——超声波测距模块

    我们这里用到的超声波测距模块,一般是用于arduino智能小车自动避障的.经常见到的应用是使用单片机或者stm32和这种模块结合进行开发的. 我们使用LOTO示波器可以更直观和快速的看到超声波测量距离 ...

随机推荐

  1. House Robber 分类: leetcode 算法 2015-07-09 20:53 2人阅读 评论(0) 收藏

    DP 对于第i个状态(房子),有两种选择:偷(rob).不偷(not rob) 递推公式为: f(i)=max⎧⎩⎨⎪⎪{f(i−1)+vali,f(i−2)+vali,robi−1==0robi−1 ...

  2. 使用gettimeofday测试函数运行的时间

    #include <time.h> #include <stdio.h> #include<sys/time.h> #define NEW_TIME_VALE st ...

  3. source insight 中文注释为乱码解决

    1. source insight 中文注释为乱码解决 http://blog.csdn.net/bingfeng1210/article/details/7527059 2. Source Insi ...

  4. Oracle 11gR2的完全卸载

    首先停止oracle服务,卸载oracle,其次删除oracle文件夹,最后删除oracle服务和清理注册表. 以下是详细教程 1.关闭oracle所有的服务.可以在windows的服务管理器中关闭: ...

  5. Jsp分页实例---假分页

    今天总结一个JSP假分页的实例,由基本功能由js实现. 相较前一篇真分页中程序的功能,丰富了一些.具备首页尾页,和页面跳转功能. 首先还是来总结一下真假分页的优缺点和特性吧. 假分页:从数据库中取出所 ...

  6. HDOJ 1005

    Input The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a ...

  7. CCIE路由实验(7) -- MPLS VPN

    1.LDP协议的各种情况2.LDP和BGP交互3.LDP高级部分4.MPLS VPN (RIP和静态)5.MPLS VPN (EIGRP)6.MPLS VPN (OSPF)7.MPLS VPN (EB ...

  8. [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)

    我想大家对QQ表情一定不会陌生,一个个小头像极大丰富了聊天的乐趣,使得聊天不再是简单的文字叙述,还能够配上喜.怒.哀.乐等表达人物心情的小图片.本文重点要介绍的内容就是怎样在微信公众平台使用QQ表情, ...

  9. shapefile 编码错误问题解决 Wrong codepage of shapefile Warning 1: One or several characters couldn't be converted correctly from UTF-8 to ISO-8859-1.

    linux下运行,因为大部分shapefile 文件,在使用时都没有指定字符集,所以qgis只能从环境变量中获取设置环境变量中获取SHAPE_ENCODING. 目前唯一的解决办法就是设置环境变量 $ ...

  10. win7系统远程连接其它计算机,并且向远程机传输文件

    首先,打开开始菜单,在程序自带的 “附件“ 中找到 "远程桌面连接"并打开,出现远程桌面对话框: 其次,在对话框左下角点击“选项”,选择“本地资源对话框”,在本地设备和资源下点击“ ...