基于Proteus的51单片机超声波测距
????????之前發(fā)過一期使用51單片機(jī)開發(fā)板完成的超聲波測(cè)距。今天再發(fā)一個(gè)基于Proteus仿真的超聲波測(cè)距。Proteus8.0之前的版本中都沒有超聲波測(cè)距這個(gè)模塊,所以在Proteus7的軟件中大部分超聲波測(cè)距仿真都是采用的網(wǎng)友自制的超聲波測(cè)距模塊,自制的模塊在仿真時(shí)交互性不是很友好,所以今天分享的仿真是基于Proteus8.8版本。文章的最后會(huì)告知如何仿真和軟件的下載方式。
超聲波測(cè)距模塊SRF04
????????超聲波測(cè)距模塊在Proteus中的名稱叫做SRF04,它的工作原理與之前文章中介紹的超聲波模塊工作原理一致,都是通過一個(gè)IO控制超聲波模塊的發(fā)射,通過另外一個(gè)IO對(duì)超聲波接收端的信號(hào)進(jìn)行檢測(cè),計(jì)算出超聲波信號(hào)的運(yùn)動(dòng)時(shí)間,進(jìn)而計(jì)算出模塊與障礙物之間的距離。
測(cè)距原理
????????原理方面就不在多說了,貼一下仿真圖。
Proteus仿真圖
????????今天分享的超聲波測(cè)距仿真如圖所示,顯示部分使用的是LCD1602,由于聲波在不同溫度下的傳播速度不同,所以仿真中使用DS18B20對(duì)環(huán)境溫度進(jìn)行采集,以便實(shí)現(xiàn)超聲波的溫度補(bǔ)償。
?
部分程序截圖
????????檢測(cè)部分程序如上圖所示,程序的大致流程為顯示初始化->外設(shè)初始化->檢測(cè)DS18B20溫度->發(fā)送超聲波并啟動(dòng)定時(shí)器->等待聲波信號(hào)返回->計(jì)算距離->判斷距離是否在范圍內(nèi)->更新顯示->進(jìn)入下一個(gè)循環(huán)。
程序流程
? ? ? ? 仿真運(yùn)行圖
仿真運(yùn)行時(shí)效果如圖所示。在該仿真的基礎(chǔ)上增加按鍵、蜂鳴器等外設(shè)就可以實(shí)現(xiàn)倒車?yán)走_(dá)的功能。有興趣的小伙伴可以自行下載研究。
????????Proteus8.8軟件可以在公眾號(hào)主頁發(fā)送”Proteus”,系統(tǒng)即可自動(dòng)回復(fù)對(duì)應(yīng)的下載鏈接。
????????本文分享的仿真及程序可以在公眾號(hào)發(fā)送”超聲波測(cè)距仿真”獲取相應(yīng)的下載鏈接。
下面貼一下主程序。
#include "reg51.h"#include <stdio.h>#include "LCD.H"#include "18B20.H"#include "delay.h"sbit csb=P2^5; //超聲波發(fā)送引腳sbit csbint=P3^2; //超聲波接收引腳unsigned char aa[]={' ',' ','D','i','s','t','a','n','c','e',':'}; ???//Distanceunsigned char bb[11]={' ',' ',' ',' ','.',' ',' ',' ',' ',' ',};unsigned char cc[]={'A','.','A','A','m'};unsigned char zf; ? ? //zf 溫度正負(fù)標(biāo)志位unsigned int s,j,bgz,k;int temp;float temperature,csbc,wdz; ? //溫度及溫度補(bǔ)償變量void main(void){TH0=0;TL0=0; //定時(shí)器0計(jì)數(shù)器清0TMOD=0X11; //T1,T0為16位定時(shí)器EA=0; //關(guān)閉總中斷init(); //初始化Init_DS18B20(); //DS18B20初始化bb[6]=0xdf; //顯示攝氏度符號(hào)bb[7]=0x43;LCD_Write_String(0,0,aa); //對(duì)數(shù)據(jù)進(jìn)行顯示while(1){temp=ReadTemperature(); //讀取DS18B20溫度數(shù)據(jù)DelayMs(100); //延時(shí)100毫秒if(temp<0) //如果溫度小于0{temp=-(temp-1); //溫度取反處理,并顯示負(fù)號(hào)zf=1;bb[0]='-';}else //溫度為正值{zf=0;bb[0]=' ';}csb=0; ????????? //給超聲波模塊發(fā)送一個(gè)啟動(dòng)脈沖_nop_();_nop_();_nop_(); //啟動(dòng)脈沖需要一定寬度_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();csb=1; //置位ET0=1; //啟動(dòng)計(jì)數(shù)器T0,用以計(jì)時(shí)TR0=1;EA=1; //開啟總中斷j=80; //延時(shí)一段時(shí)間 ?while(j--){}csbint=1;j=0;while(csbint) //判斷接收回路是否收到超聲波的回波{j++;if(j>=2500) //如果達(dá)到一定時(shí)間沒有收到回波,則將csbint置零,退出接收回波處理程序csbint=0;}TR0=0; //關(guān)閉定時(shí)器0s=TH0*256+TL0; //讀取時(shí)間數(shù)據(jù)TH0=0; //定時(shí)器清0TL0=0;wdz=0.00000607*temp; ?? //計(jì)算溫度補(bǔ)償值if(zf==0){csbc=0.03315+wdz; //對(duì)超聲波速度進(jìn)行溫度補(bǔ)償,溫度為正值時(shí)+,溫度為負(fù)值時(shí)-}else csbc=0.03315-wdz;csbc=csbc/2; //s=s*csbc-4; //速度*時(shí)間=位移if(s<5) //測(cè)量值小于下限{cc[0]='-';cc[2]='-'; //測(cè)量距離小于下限,顯示---,cc[3]='-';}else if(s>500) //測(cè)量值大于上限{cc[0]='C';cc[2]='C'; //測(cè)量距離大于上限值,顯示CCCcc[3]='C';}else{cc[0]=s/100+'0';cc[2]=s/10%10+'0'; //距離在范圍內(nèi),顯示距離數(shù)值cc[3]=s%10+'0';}//顯示測(cè)量的溫度bb[1]=temp/1000+0x30;bb[2]=temp/100%10+0x30; //顯示十位bb[3]=temp%100/10+0x30; //顯示個(gè)位bb[5]=temp%10+0x30; //小數(shù)if(zf==0){if(temp<1000){bb[1]=' ';if(temp<100){bb[2]=' ';}}}else{if(temp<1000){bb[1]='-';bb[0]=' ';if(temp<100){bb[0]=' ';bb[1]=' ';bb[2]='-';}}}LCD_Write_String(4,1,bb);LCD_Write_String(11,0,cc);}}總結(jié)
以上是生活随笔為你收集整理的基于Proteus的51单片机超声波测距的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网卡驱动收发包过程图解
- 下一篇: SkipList 以及高度的确定