久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1537|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

超聲波PIC16F877 + HC-SR04 + LCD03

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:387542 發(fā)表于 2018-8-18 13:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
////////////////////////////////////////////////////////////////////////////////
//
//     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  
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线观看av网站 | av看片网站| 伊人精品在线视频 | 四虎国产 | 91精品国产91久久久久久不卞 | 在线一区视频 | 国产欧美在线一区二区 | 国产精品久久久久久久一区二区 | 性大毛片视频 | 蜜臀网| 亚洲福利视频一区二区 | 天天看天天操 | 国产综合久久 | 久久久久久久久久久久91 | 日韩精品国产精品 | 国产中文一区二区三区 | 久久亚洲一区二区三区四区 | 一二区成人影院电影网 | 久久高清免费视频 | 成人国产精品久久 | 久久国产精品-久久精品 | 可以免费观看的av片 | 精品中文字幕一区二区 | 欧美精品一区二区三区蜜臀 | 欧美在线观看一区 | 97人人澡人人爽91综合色 | 亚洲免费视频播放 | 欧美精品一二三 | 91爱啪啪 | 最近免费日本视频在线 | 亚洲精品电影网在线观看 | 久久午夜精品福利一区二区 | 久久精品亚洲精品国产欧美 | 隔壁老王国产在线精品 | 成人做爰69片免费观看 | 亚洲一区 中文字幕 | 99精品99| 欧美一区二区三区在线 | 97伊人| 热久久国产| 成人精品鲁一区一区二区 |