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