基于AT89C52的超声波测距仪
生活随笔
收集整理的這篇文章主要介紹了
基于AT89C52的超声波测距仪
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
超聲波測距儀是利用
HC—SR04超聲波
測距公式:時間 ? 340 m/s ?2 得出后顯示在
8位數碼管上,可顯示距離由數碼管個數決定
所用芯片:AT89C52
主函數main.c
#include "dig.h" //添加數碼管顯示程序 #include "HC-SR04.h" #include "timer.h"//全局變量定義 //段碼表,使用于共陰數碼管 unsigned int code duan_ma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~90x77,0x7c,0x39,0x5e,0x79,0x71}; //A~F unsigned int dis_buf[3] = {4, 0, 0};unsigned long S = 0; //距離緩沖變量 unsigned long time = 0; //時間緩沖變量//函數聲明 void count(void); //計算距離 void dis_distance(void); //顯示距離/* 主函數 */ void main(void) {InitTimer0(); //定時器0初始化while(1){count(); //測距if(S>=100 || S<=10) //如果超出10cm-100cm范圍,則顯示“---”{dis_buf[2] = 0x40; //顯示"---"dis_buf[1] = 0x40;dis_buf[0] = 0x40;dig_scan(dis_buf); }elsedis_distance(); //顯示距離} } /* 計算測距 */ void count(void) {start_ranging(); //啟動一次超聲波while(!Echo); //等待超聲波模塊輸出IO拉高TR0 = 1; //開啟定時器計時while(Echo); //等待超聲波模塊輸出IO拉低TR0 = 0; //關閉定時器計時/* 計算距離 */time = TH0 * 256 + TL0; //得到時間TH0 = 0; //定時計數器清零TL0 = 0;S = (time * 1.7) / 100; //算出來是CM } /* 顯示距離 */ void dis_distance(void) {dis_buf[2] = duan_ma[S / 100 % 10]; //取出百位數,并在數碼管的第三位顯示,從右往左數dis_buf[1] = duan_ma[S / 10 % 10]; //取出十位數,并在數碼管的第二位顯示,從右往左數dis_buf[0] = duan_ma[S % 10]; //取出個位數,并在數碼管的第一位顯示,從右往左數dig_scan(dis_buf); //送到數碼管上顯示 }數碼管代碼:
#include "dig.h"/* 數碼管延時函數,單位“ms” */ static void dig_delayms(unsigned int ms) {unsigned char a,b,c;while(--ms){for(c=1;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);} } /* * 數碼管掃描* *dat:以數組的方式傳值,使用的時候直接填入數組名即可*/ void dig_scan(unsigned int *dat) {unsigned char i; //循環變量/* 數碼管掃描處理 */for(i = 0; i < 4; i++){switch(i){case 0: {digWei1 = 0; //選通第一位數碼管digDuan = dat[0]; //顯示第一位數碼管的內容break;}case 1:{digWei2 = 0; //選通第一位數碼管digDuan = dat[1]; //顯示第二位數碼管的內容break;}case 2:{digWei3 = 0; //選通第三位數碼管digDuan = dat[2] + 0x80; //顯示第三位數碼管的內容,順便也顯示小數點break;}case 3:{digWei4 = 0; //選通第四位數碼管digDuan = dat[3]; //顯示第四位數碼管的內容break; }default: break;}dig_delayms(5); //數碼管掃描延時5ms,根據實際情況可適當調節此延時digWei1 = 1; //消隱digWei2 = 1; digWei3 = 1;digWei4 = 1;} }超聲波的脈沖啟動程序:
#include "HC-SR04.h"/* 啟動超聲波程序*/ void start_ranging(void) {Ttig = 1; //啟動一次模塊_nop_(); //延時一段時間,至少10us以上 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();Ttig = 0; }定時器:
#include "timer.h"/* 定時器0初始化,定時1ms */ void InitTimer0(void) {TMOD = 0x01; //配置定時器0為工作方式TH0 = 0;TL0 = 0;TR0 = 0; //打開定時器0 }總結
以上是生活随笔為你收集整理的基于AT89C52的超声波测距仪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 22.04安装搜狗输入法
- 下一篇: 论文级别的划分