僅供大家參考
超聲波程序.zip
(61.16 KB, 下載次數: 15)
2017-12-23 16:33 上傳
點擊文件名下載附件
lcd1602顯示 下載積分: 黑幣 -5
#include<reg51.h>
#include<intrins.h>
#include"lcd.h"
sbit Trig = P2^1;
sbit Echo = P2^0;
unsigned char PuZh[]="Distance: ";
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
static unsigned char DisNum = 0; //顯示用指針
unsigned int time=0;
unsigned long S=0;
bit flag =0; //標志位flag
unsigned char disbuff[4] ={ 0,0,0,0,};
void Conut(void)
{
time=TH0*256+TL0; //*256是16位計數器的高8位和低八位之分,恢復成16位數的時候要*256
// 將字節(jié)轉化成十進制數,比如定時器中裝的是0xabcd,轉化成十進制就是d+c*16+b*16*16+a*16*16*16=43981。
// 發(fā)現ab*256=(b+a*16)*256=43776,cd=d+c*16=205,43776+205=43981
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出來是CM 其中*0.0172是根據超聲的聲速、單片機的頻率,得出來的一個系數。
if((S>=300)) //超出測量范圍顯示“-”||flag==1
{
flag=0;
// P1 = 0XFD;
DisplayOneChar(0, 1, ASCII[11]);
DisplayOneChar(1, 1, ASCII[10]); //顯示個點
DisplayOneChar(2, 1, ASCII[11]);
DisplayOneChar(3, 1, ASCII[11]);
DisplayOneChar(4, 1, ASCII[12]); //顯示M
}
else
{
// P1 = 0X00;
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
DisplayOneChar(0, 1, ASCII[disbuff[0]]);
DisplayOneChar(1, 1, ASCII[10]); //顯示點
DisplayOneChar(2, 1, ASCII[disbuff[1]]);
DisplayOneChar(3, 1, ASCII[disbuff[2]]);
DisplayOneChar(4, 1, ASCII[12]); //顯示M
}
}
void zd0() interrupt 1 //T0中斷用來計數器溢出,超過測距范圍
{
flag=1; //中斷溢出標志
}
void StartModule() //啟動模塊
{
Trig=1; //啟動一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0;
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
void main(void)
{
TMOD=0x01; //設定時器0為工作方式1,GATE=1;
TH0=0;
TL0=0;
ET0=1; //開定時器0中斷
EA=1; //開啟總中斷
InitLcd1602();
LcdShowStr(0,0,PuZh);
while(1)
{
StartModule();
while(!Echo); //當RX為零時等待
TR0=1; //開啟計數
while(Echo); //當RX為1計數并等待
TR0=0; //關閉計數
Conut(); //計算
delayms(80);
}
}
|