////////////////////////////////////////////////////////////////////////////////
//
// PIC16F877 + HC-SR04 + 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
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
超声波测距资料(HC-SR04)_TB.rar (58个子文件)
超声波测距资料(HC-SR04)_TB
超声波测距LC1602显示
LCD1602.lst 7KB
脉宽测量.plg 0B
脉宽测量.uvproj 13KB
脉宽测量.LST 42KB
脉宽测量.hex 3KB
脉宽测量.uvopt 6KB
脉宽测量.c 24KB
脉宽测量.uvgui.Lenovo 69KB
脉宽测量.M51 8KB
脉宽测量.build_log.htm 986B
脉宽测量_Opt.Bak 1KB
脉宽测量.lnp 33B
脉宽测量_Uv2.Bak 2KB
超声波测距51C程序
51.C 5KB
超声波测距模块_HC-SR04_ 用户手册-V2.pdf 1017KB
超声波测距LCD12864显示
测距程序.LST 21KB
测距程序.M51 19KB
测距程序_Uv2.Bak 2KB
测距程序.lnp 48B
测距程序.plg 208B
测距程序.C 13KB
测距程序.hex 9KB
测距程序.Uv2 2KB
测距程序.OBJ 19KB
测距程序.Opt 978B
测距程序_Opt.Bak 975B
测距程序 17KB
超声波PIC单片机C程序
HC-SR04PIC.txt 5KB
TCT40-16T.R1规格书.pdf 157KB
超声波测距数码管显示
脉宽测量.plg 206B
数码管接线方式.jpg 84KB
脉宽测量.LST 6KB
脉宽测量.hex 4KB
脉宽测量 8KB
脉宽测量.c 3KB
脉宽测量.Opt 1KB
脉宽测量.M51 9KB
脉宽测量.Uv2 2KB
脉宽测量.OBJ 8KB
脉宽测量_Opt.Bak 1KB
脉宽测量.lnp 33B
脉宽测量_Uv2.Bak 2KB
超声波模块参考.pdf 1.02MB
超声波测距串口显示
测距程序.LST 6KB
测距程序.M51 11KB
测距程序_Uv2.Bak 2KB
串口接线方式.jpg 77KB
测距程序.lnp 48B
测距程序.plg 0B
测距程序.C 2KB
测距程序.hex 8KB
测距程序.Uv2 2KB
测距程序.OBJ 8KB
测距程序.Opt 976B
测距程序_Opt.Bak 976B
测距程序 10KB
超声波模块原理图.pdf 20KB
超声波模块说明图.jpg 536KB
共 58 条
- 1
资源评论
玄下孤枭
- 粉丝: 2
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功