|
超聲波測距 + 行人檢測系統(tǒng)電路原理圖如下:
0.png (61.74 KB, 下載次數(shù): 22)
下載附件
2018-5-6 00:23 上傳
0.png (47.7 KB, 下載次數(shù): 22)
下載附件
2018-5-6 00:23 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
元件清單:
0.png (17.99 KB, 下載次數(shù): 12)
下載附件
2018-5-6 00:23 上傳
0.png (61.11 KB, 下載次數(shù): 20)
下載附件
2018-5-6 00:22 上傳
單片機(jī)源程序如下:
- #include "reg52.h"
- #include "18b20.h"
- #include "delay.h"
- #include "math.h"
- #include "stdio.h"
- #include "lcd.h"
- bit ReadTemFlag=0; //定義讀時(shí)間標(biāo)志
- bit ViewTemFlag=0; //定義讀時(shí)間標(biāo)志
- bit PeopleFlag=0;//定義行人標(biāo)志
- uint time=0;
- uchar DisdisData[];
- sbit War1=P3^2;
- sbit Beep=P3^7;
- sbit War=P1;
- sbit IRIG=P2^0;//超聲波接口
- sbit ECHO=P2^1;//超聲波接口
- void TIMInit()
- {
- TMOD|=0x11; //定時(shí)計(jì)數(shù)0、1,工作方式為1,即16位定時(shí)
- TH0=0x00;
- TL0=0x00;
- ET0=1; //定時(shí)計(jì)數(shù)器中斷0允許位
- ET1=1; //定時(shí)計(jì)數(shù)器中斷1允許位
- TR1=1; //開放定時(shí)計(jì)數(shù)器中斷1
- EA=1; //總開關(guān)開啟
- }
- void main()
- {
- int temp;
- float temperature;
- char displaytemp[16]; //定義顯示區(qū)域臨時(shí)存儲數(shù)組
- float s,a;
- DS18b20Init(); //溫度初始化
- LCD1602Init(); //LCD初始化
- LCD1602Char(); //寫入自定義字符
- while(1)
- {
- if(ReadTemFlag==1)
- {
- ReadTemFlag=0;
- temp=DS18b20sj();
- if(temp<0)
- {
- temp=temp-1;
- temp=~temp;
- temperature=(float)temp*0.0625;
- sprintf(displaytemp,"-TEMP % 7.3f",temperature);// 把溫度值放入displaytemp
- }
- else
- {
- temperature=(float)temp*0.0625;
- sprintf(displaytemp,"TEMP % 7.3f",temperature);//把溫度值放入displaytemp
- }
- }
-
- if(ViewTemFlag==1)
- {
- ViewTemFlag=0;
- War1=0;//行人檢測燈滅
- Beep=0;//蜂鳴器關(guān)閉
- War=0xff;//關(guān)閉所有指示燈
- LCD1602WriteChar(13,1,0x01); //點(diǎn)亮溫度右上角的一個小點(diǎn)
- LCD1602WriteChar(14,1,'C'); //顯示溫度單位
- LCD1602WriteChar(15,1,' '); //空格
- LCD1602SWritetring(0,1,displaytemp); //第二行顯示溫度
- }
- IRIG=1;
- Delayus(3); //延時(shí)10us
- while(!ECHO);//當(dāng)ECHO為0時(shí)等待
- TR0=1;
- while(ECHO);//等待ECHO為低電平
- TR0=0;
- time=TH0*256+TL0;//*256是左移八位的意思,計(jì)數(shù)為16位,這是算出的總時(shí)間,但要乘以12/11.0592
- TH0=0; //清零
- TL0=0; //清零
- temperature=(int)temperature;//取整數(shù)有利于數(shù)據(jù)穩(wěn)定
- a=(331.5+0.607*temperature);//聲速與溫度的函數(shù)關(guān)系
- /* s=time*a/2 ;time的單位是s,a的單位是m/s,如果time的單位是us,a的單位仍舊是m/s,s的單位是cm
- 那么s*10^-2=time*10^-6*a/2
- 化成s=time*10^-4*a/2=time*a/20000 和 S=(time*a/200)/100是一樣的 */
- s=(time*a*(12/11.0592))/20000; //單位為厘米 ,這里原先s的單位是米,time的單位是us
- sprintf(DisdisData,"Dis= % 7.3f cm",s);
- LCD1602SWritetring(0,0,DisdisData); //在液晶屏顯示出來
- if(PeopleFlag==1)
- {
- PeopleFlag=0;
- if(s>200)
- {
- Beep=1;
- War=0xff;
- }
- else if(s>150)
- {
- War=0xfe;
- LCD1602SWritetring(0,1,"Waring1:<200CM R");//距離小于200cm大于150cm,準(zhǔn)備隨時(shí)停車
- Beep=0;
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Beep=1;
- }
- else if(s>100)
- {
- War=0xf0;
- LCD1602SWritetring(0,1,"Waring2:<150CM L");//距離小于150cm大于100cm,減速慢行
- Beep=0;
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Beep=1;
- }
- else if(s>40)
- {
- War=0x90;
- LCD1602SWritetring(0,1,"Waring3:<100CM A");//距離小于100cm大于40cm,警戒區(qū)
- Beep=0;
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Beep=1;
- }
- else if(s>20)
- {
- War=0x00;
- LCD1602SWritetring(0,1,"Waring4:<40CM S");//距離小于40cm,停止
- Beep=0;
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Beep=1;
- }
- else if(s<20)
- {
- War=0xff;
- LCD1602SWritetring(0,1,"Waring3:<20CM L");//距離小于20cm,危險(xiǎn)緊停
- Beep=0;
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Delayms(255);
- Beep=1;
- }
- }
- }
- }
- //定時(shí)器0中斷服務(wù)程序
- void Timer0_isr(void) interrupt 1
- {
- ECHO=0;
- }
- //定時(shí)器1中斷服務(wù)程序
- void Timer1_isr(void) interrupt 3
- {
- static unsigned int num;
- static unsigned int num1;
- TH1=(65536-2000)/256; //重新賦值 2ms
- TL1=(65536-2000)%256;
-
- num++;
- if(num==300)
- {
- num=0;
- num1++;
- ReadTemFlag=1; //讀標(biāo)志位置1
- if(num1==30)
- {
- num1=0;
- ViewTemFlag=1; //顯示標(biāo)志位置1
- PeopleFlag=0;
- }
- }
- }
- void exter0(void) interrupt 2
- {
- //由于熱釋電是當(dāng)有人時(shí)為高電平,因此當(dāng)有人進(jìn)入時(shí)是一個上升沿,而中斷跳沿觸發(fā)默認(rèn)為下降沿,因此在程序中取反后幾位上升沿
- //有行人時(shí)將PeopleFlag置位,并開啟行人指示燈,蜂鳴器長鳴,開啟所有指示燈進(jìn)行提示
- if(!INT1)
- {
- LCD1602SWritetring(0,1,"Waring:People D");//Danger即刻停止,危險(xiǎn)
- War1=0; //行人指示燈亮
- Beep=0; //蜂鳴器長鳴
- War=0x00;//開啟所有指示燈
- PeopleFlag=1;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
多功能超聲波測距.zip
(457.61 KB, 下載次數(shù): 49)
2018-5-5 19:36 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|