超声波模块SRF05
发布日期:2021-06-30 12:00:10 浏览次数:2 分类:技术文章

本文共 4106 字,大约阅读时间需要 13 分钟。

纯干货:

超声波代码:

////     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 
#include
__CONFIG(0x3b32); #define trig RB0#define echo RB1void clrscn(void); // prototypesvoid cursor(char pos);void print(char *p);void setup(void);unsigned int get_srf04(void);char s[21]; // buffer used to hold text to printvoid 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 }

转载地址:https://jackzhang.blog.csdn.net/article/details/38115375 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:arm32位固定指令中怎么容纳32位变量
下一篇:倒立摆

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月12日 05时40分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章