超聲波測距.GIF (27.95 KB, 下載次數: 89)
下載附件
2018-4-9 11:39 上傳
Altium Designer畫的超聲波測距原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.jpg (64.56 KB, 下載次數: 82)
下載附件
2018-4-9 16:11 上傳
0.jpg (72.89 KB, 下載次數: 86)
下載附件
2018-4-9 16:12 上傳
單片機源程序如下:
- #include <reg52.h> //STC89C52頭文件
- #define uchar unsigned char
- #define uint unsigned int
- unsigned int time=0;
- unsigned int timer=0;
- unsigned long S=0; //距離變量
- bit flag =0; //超聲波模塊量程溢出標志(>5米時置1)
- sbit echo=P1^0; //超聲波模塊的發射端
- sbit trig=P1^1; //超聲波模塊的接收端
- sbit ds=P2^2; //DS18B20的信號線
- sbit P24=P2^4;
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P27=P2^7;
- sbit P07=P0^7;
- int temp;
- //八位共陽極
- unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- /*********************************************************/
- //毫秒級延時
- void delayms(unsigned char z)
- {
- unsigned char a,b;
- for(a=z; a>0; a--)
- for(b=110; b>0; b--);
- }
- /*********************************************************/
- /*********************************************************/
- //微秒級延時
- void delayus(unsigned char z)
- {
- while(z)
- z--;
- }
- /********************************************************/
- void delay_ms(unsigned int ms) //1ms延時
- {
- uchar a;
- while(ms--)
- for(a=123;a>0;a--);
- }
- /*********************************************************/
- //DS18B20初始化
- void ds18b20init()
- {
- ds=0;
- delayus(80); //延時480-960us
- ds=1;
- delayus(4); //等待應答
- }
- /*********************************************************/
- //DS18B20讀命令子程序(讀一字節)
- uchar dushuju()
- {
- uchar i,dat,m;
- for(i=8;i>0;i--)
- {
- ds=0;
- delayus(1);
- ds=1;
- delayus(2);
- m=ds;
- dat=(m<<7)|(dat>>1); //讀出的數據最低位在最前面,剛好一個字節在dat里
- delayus(8);
- }
- return dat;
- }
- /*********************************************************/
- //DS18B20寫命令子程序(寫一字節)
- void xiemingling(uint shuju)
- {
- uint i;
- bit m;
- for(i=8;i>0;i--)
- {
- m=shuju&0x01;
- shuju=shuju>>1;
- if(m) //寫1
- {
- ds=0;
- delayus(2);
- ds=1;
- delayus(8);
- }
- else //寫0
- {
- ds=0;
- delayus(8);
- ds=1;
- delayus(2);
- }
- }
- }
- /*********************************************************/
- //DS18B20開始獲取溫度并轉換
- void zhuanhuan()
- {
- ds18b20init();
- delayms(1);
- xiemingling(0xcc); //寫跳過讀ROM指令
- xiemingling(0x44); //寫溫度轉換命令
- }
- /*********************************************************/
- //DS18B20讀寄存器中存儲的溫度數據
- int duwendu()
- {
- uint a,b;
- ds18b20init();
- delayms(1);
- xiemingling(0xcc); //跳過ROM,忽略64位ROM地址
- xiemingling(0xbe); //讀內部RAM中的9字節的溫度數據
- a=dushuju(); //讀低8位
- b=dushuju(); //讀高8位
- b=b<<8; //高8位左移8位
- temp=b|a; // 高8位和低8位組合為1個字
- temp=temp*0.0625; //溫度在寄存器中位12位,分辨率為0.0625度
- return temp;
- }
- /*********************************************************/
- //顯示子程序
- void xianshi(unsigned long num)
- {
- unsigned char bai,shi,ge;
- bai=num/100; //分離三位距離數據
- shi=num%100/10;
- ge=num%10;
- P24=0;
- P0=shuzu[ge];
- delay_ms(1);
- P24=1;
- P25=0;
- P0=shuzu[shi];
- P07=1;
- delay_ms(1);
- P25=1;
- P26=0;
- P0=shuzu[bai];
- delay_ms(1);
- P26=1;
- // P24=0;
- // P0=shuzu[bai];
- // P07=1;
- // delay_ms(1);
- // P24=1;
- }
- /*********************************************************/
- //計算距離子程序
- void Conut()
- {
- float a;
- time=TH0*256+TL0; //這是最后計算到的時間,但應該再乘以12/11.092
- //時間應該是time*12/11.0592
- TH0=0; //定時器0的初始值位0
- TL0=0;
- a=(331.5+0.607*temp); //聲速與溫度的函數關系:聲速=331.5+0.607*溫度
- S=(time*a/200)/100; //算出來是cm
- if (S>=500) //最大距離為5m,即500cm
- S=888;
- if (flag==1) //判斷是否溢出
- {
- S=888;
- flag=0;
- TH0=0;
- TL0=0;
- }
- }
- /********************************************************/
- //初始化定時器0和定時器1
- void T0_init()
- {
- TMOD=0x11;
- TH0=0;
- TL0=0;
- TH1=0xf8; //定時器1賦初值,應該是2ms
- TL1=0x30;
- ET0=1;
- ET1=1;
- TR1=1;
- EA=1;
- }
- void main( )
- {
- unsigned int i;
- T0_init();
- while(1)
- {
- duwendu(); //獲取溫度后計算相應聲速,從而計算距離
- while(!echo); //當echo為0時等待
- TR0=1; //開啟定時器0
- while(echo); //當echo為1計數并等待
- TR0=0; //關閉定時器0
- Conut(); //計算距離
- for(i=150;i>0;i--)
- {
- xianshi(S); //數碼管顯示
- }
- }
- }
- /********************************************************/
- void zd0() interrupt 1
- {
- flag=1; //中斷溢出標志
- }
- /********************************************************/
- void zd3() interrupt 3
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
超聲波測距原理圖和PCB源文件.zip
(1.61 MB, 下載次數: 172)
2018-4-9 11:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
超聲波測距程序.zip
(25.32 KB, 下載次數: 130)
2018-4-9 11:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|