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