51单片机学习篇-- --超声波测距(HC--SR04)笔记
開篇先說一句廢話····
本旺名字叫薩摩耶,,Please 叫我旺財,,,哈哈,招財進寶嘛!
開篇
本單片機購買的時候帶的超聲波模塊是HC-SR04,根據好多材料都說用這個的原因是便宜,,,不過沒關系,剛開始學不在乎,重在學習原理,為了以后的開發增加經驗。
超聲波模塊
**超聲波長啥樣?**同樣,直接上圖
它有4個接口,VCC,Trig,Echo,GND。VCC和GND用來供電,Trig用來發送一個高電平,Echo用來等待接收Trig發送的高電平。
超聲波咋用?
因為它有四個引腳,首先就是要與單片機連接,我這邊是VCC和GND正常連接外,Trig連接P2 ^1,Echo連接P2 ^0;連接好就是要開始調試程序。
閱讀數據手冊,發現引腳說明外還有時序圖。直接上圖
除了時序圖外,還要注意的就是,因為計算距離S=時間 * 高電平時間 /2,需要記錄高電平時間,首先就是定時器0,但是因為要不斷測距,不能只發一次,而是要按頻率不斷的發送信號,來采集時間,所以還要用到一個定時器1來啟動超聲波模塊。
步驟:
1.初始化兩個定時器
//定時器初始化 void TimeInit(){TMOD=0x11;TH0=0;TL0=0;TH1=0xf8; //2msTL1=0x30;EA=1;ET1=1;ET0=1;TR1=1;TR0=0; }2.定時器0的中斷處理,定時器0的作用用來計高電平的時間,所以注意定時器0的溢出,如果溢出要重新歸零。
void Time0() interrupt 1{flag=1; }3.定時器1的中斷處理,定時器1的功能就是按一定頻率啟動超聲波和顯示數碼管,
void Time1() interrupt 3{TH1=0xf8;TL1=0x30;Showsmg();tt++;if(tt>=100){tt=0;Trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;} }4.時間統計出來就要計算距離了,距離有之前的公式,要注意就是如果距離太遠或者時間太長導致定時器0溢出,要讓數碼管提示錯誤
//計算函數 void count(){time=TH0*256+TL0; TH0=0;TL0=0;dist=(long)(time*0.17);if((dist>=4000) || (flag==1)){flag=0;DisPlay[0]=0x40;DisPlay[1]=0x40;DisPlay[2]=0x40;DisPlay[3]=0x40;}else{DisPlay[0]=smgduan[dist/1000];DisPlay[1]=smgduan[dist%1000/100] |0x80; //顯示小數點DisPlay[2]=smgduan[dist%100/10];DisPlay[3]=smgduan[dist%10];} }5.發現還缺Echo引腳接受數據(主函數)
void main(){TimeInit();while(1){while(!Echo);TR0=1;while(Echo);TR0=0;count();} }超聲波測距–數碼管顯示(完整代碼)
#include "reg52.h" #include "intrins.h"#define u8 unsigned char #define u16 unsigned intunsigned long dist; u16 time; u16 tt,flag; u8 DisPlay[6]; u8 smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit Trig=P2^1; sbit Echo=P2^0;void Delay(u16 z) //11.0592MHz 1ms {u8 i,j;for(i=z;i>0;i--)for(j=110;j>0;j--); } //數碼管顯示 void Showsmg(){u8 i;for(i=0;i<4;i++){switch(3-i) //位選{case 0: LSA=0;LSB=0;LSC=0;break;case 1: LSA=1;LSB=0;LSC=0;break;case 2: LSA=0;LSB=1;LSC=0;break;case 3: LSA=1;LSB=1;LSC=0;break;case 4: LSA=0;LSB=0;LSC=1;break;case 5: LSA=1;LSB=0;LSC=1;break;case 6: LSA=0;LSB=1;LSC=1;break;case 7: LSA=1;LSB=1;LSC=1;break;}P0=DisPlay[i];Delay(1);P0=0x00;} } //計算函數 void count(){time=TH0*256+TL0; TH0=0;TL0=0;dist=(long)(time*0.17);if((dist>=4000) || (flag==1)){flag=0;DisPlay[0]=0x40;DisPlay[1]=0x40;DisPlay[2]=0x40;DisPlay[3]=0x40;}else{DisPlay[0]=smgduan[dist/1000];DisPlay[1]=smgduan[dist%1000/100] |0x80;DisPlay[2]=smgduan[dist%100/10];DisPlay[3]=smgduan[dist%10];} } //定時器初始化 void TimeInit(){TMOD=0x11;TH0=0;TL0=0;TH1=0xf8; //2msTL1=0x30;EA=1;ET1=1;ET0=1;TR1=1;TR0=0; } void Time0() interrupt 1{flag=1; } void Time1() interrupt 3{TH1=0xf8;TL1=0x30;Showsmg();tt++;if(tt>=100){tt=0;Trig=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();Trig=0;} } void main(){TimeInit();while(1){while(!Echo);TR0=1;while(Echo);TR0=0;count();} }總結
以上是生活随笔為你收集整理的51单片机学习篇-- --超声波测距(HC--SR04)笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下载.net core 并安装
- 下一篇: 韩语输入法快捷键