具有实时语音播报功能的超声波测距仪.docx
《具有实时语音播报功能的超声波测距仪.docx》由会员分享,可在线阅读,更多相关《具有实时语音播报功能的超声波测距仪.docx(17页珍藏版)》请在冰点文库上搜索。
具有实时语音播报功能的超声波测距仪
具有实时语音播报的超声波测距仪的源程序
#include
#include
sbitcs=P3^5;
sbitsid=P3^6;
sbitsclk=P3^7;
sbitfang=P3^3;//squartwave
sbitensp=P2^5;
sbitdr=P2^4;//dangerousdistanceled
sbithy=P2^3;//holddistanceled
sbitsg=P2^2;//safedistanceled
sbitdpl=P2^1;//droppowerled
sbitre=P2^0;//receiveled
sbitvc=P3^0;//voltagecompare
sbitdq=P3^1;//18B20databit
sbithold=P2^6;//hold
sbitplay=P2^7;//play
//****************************************************************
bitff;
unsignedcharflag;
unsignedcharpf=3;//显示警告标志
unsignedcharsoubuf[6];
unsignedchardisbufs[6];//distancememory
unsignedchardisbuft[8];//temperaturememory
unsignedchartimeh,timel;//timememory
unsignedchartemp[2];//temp[1]温度的高位与temp[0]低位
unsignedcharcodeword[9]={"当前距离:
"};
unsignedcharcodewordt[5]={"温度:
"};
unsignedcharcodewordd[8]={"危险距离"};
unsignedcharcodewordh[8]={"保持距离"};
unsignedcharcodewords[8]={"安全距离"};
unsignedcharcodewordpower[12]={"电源电压正常"};
unsignedcharcodeworddrop[12]={"请您更换电池"};
unsignedcharcodecheck[13]={"系统正在自检!
"};
unsignedcharcodesound[10]={74,10,16,22,30,37,43,51,58,67};//声音地址点:
92;米:
83
//***************************************************************
voidlcdbusy(void);
voidsendbyte(unsignedchards);
voidwrlcd(unsignedcharsta,ks);
voidex0(void);
voidcomputers(unsignedintv);
voiddisplay(void);
voidsend(void);
voidintlcd(void);
unsignedintcomputerv(void);
voidde750ms(void);
voidinit18b20(void);
voidwr18b20(unsignedcharks);
unsignedread18b20(void);
voidgettemper(void);
voidcomputert(void);
voidcheckself(void);
voidspeak(void);
//******************************************************
voidinit18b20(void)//初始化18B20
{unsignedchari;
dq=1;
_nop_();
dq=0;
for(i=255;i>0;i--);
dq=1;
for(i=30;i>0;i--);
for(i=120;i>0;i--)
if(dq==0){flag=1;break;}//led=0;
for(i=100;i>0;i--);
dq=1;
}
//*************************************************************
voidwr18b20(unsignedcharks)
{unsignedchari,j;
for(i=8;i>0;i--)
{
dq=0;
for(j=6;j>0;j--);
_nop_();
dq=(bit)(ks&0x01);
for(j=24;j>0;j--);
dq=1;
ks=ks>>1;
}
}
//*************************************************************
unsignedread18b20(void)//先读出的是低位后读出的是高位,读一个字节子程序
{unsignedchari,j,tdata;
tdata=0;
for(j=8;j>0;j--)
{tdata=tdata>>1;
dq=0;
for(i=6;i>0;i--);
_nop_();
dq=1;
for(i=6;i>0;i--);
if(dq==1)tdata=tdata|0x80;
for(i=28;i>0;i--);
dq=1;
}
return(tdata);
}
//*******************************************************************
voidgettemper(void)
{
init18b20();
if(flag==1)
{//跳过ROM匹配
wr18b20(0xcc);
//发出温度转换命令
wr18b20(0x44);
flag=0;
}
de750ms();
init18b20();
if(flag==1){
wr18b20(0xcc);//读温度命令
wr18b20(0xbe);
temp[0]=read18b20();
temp[1]=read18b20();
flag=0;
}
elseflag=0;
}
//*****************************************************************/
voidcomputert(void)//温度处理子程序,temp[1]温度的高位与temp[0]低位
{unsignedcharaa,i;
unsignedintcc;
aa=temp[1]&0xf8;
if(aa==0xf8){disbuft[5]=0x2d;//处理负温度
temp[0]=~temp[0];
temp[1]=~temp[1];
if(temp[0]==0xff)temp[1]=temp[1]+1;
temp[0]=temp[0]+1;
aa=(temp[1]&0x07)<<4;
aa=aa|((temp[0]&0xf0)>>4);
disbuft[4]=aa/10;
disbuft[3]=(aa%10);
aa=temp[0]&0x0f;
cc=(int)(aa*625);
disbuft[3]=cc/10000+disbuft[3];
if(disbuft[3]==10){disbuft[3]=disbuft[3]&0xff;disbuft[4]=disbuft[4]+1;}
cc=cc%10000;
disbuft[2]=cc/1000;
cc=cc%1000;
disbuft[1]=cc/100;
cc=cc%100;
disbuft[0]=cc/10;
}
else{aa=((temp[1]&0x07)<<4);//处理正温度
aa=aa|((temp[0]&0xf0)>>4);
disbuft[0]=aa/10;
disbuft[1]=aa%10;
aa=temp[0]&0x0f;
cc=(int)(aa*625);
disbuft[1]=cc/10000+disbuft[1];
if(disbuft[1]==10){disbuft[1]=0;disbuft[0]=disbuft[0]+1;}
cc=cc%10000;
disbuft[3]=cc/1000;
cc=cc%1000;
disbuft[4]=cc/100;
cc=cc%100;
disbuft[5]=cc/10;
disbuft[6]=cc%10;
for(i=0;i<7;i++)
disbuft[i]=disbuft[i]|0x30;
disbuft[2]=0x2e;
}
}
//*****************************************************************
unsignedintcomputerv(void)
{unsignedchara;
unsignedintv;
temp[1]=temp[1]&0x07;
a=temp[1]<<4;
a=a|(temp[0]>>4);
a=a*6;
v=3320+a;
return(v);
}
//*************************************************************
voidde750ms(void)//750ms
{unsignedchari,j,k;
for(i=6;i>0;i--)
for(j=255;j>0;j--)
for(k=255;k>0;k--);
}
//*************************************************************
voidlcdbusy(void)
{unsignedchari,c;
while
(1)
{sendbyte(0xfc);
sclk=1;
c=sid;
sclk=0;
for(i=0;i<15;i++)
{sclk=1;
sclk=0;}
if(c==0)break;
}
}
//**********************************************************
voidsendbyte(unsignedchards)//向LCD中发送一个字节
{unsignedchari;
for(i=0;i<8;i++)
{sclk=1;
sid=ds&0x80;
//if((ds&0x80)==0x80)sid=1;
//elsesid=0;
sclk=0;
ds=ds<<1;}
}
//*************************************************************
voidwrlcd(unsignedcharsta,ks)//向LCD中写入一个起始字节与一个数据
{unsignedcharhdata,ldata;
hdata=ks&0xf0;
ks=ks&0x0f;
ks=ks<<4;
ldata=ks;
cs=1;
lcdbusy();
sendbyte(sta);
sendbyte(hdata);
sendbyte(ldata);
cs=0;
}
//****************************************************************
voidex0(void)interrupt0using0
{EX0=0;
TR0=0;
timeh=TH0;
timel=TL0;
TH0=0;
TL0=0;
ff=1;
re=0;
}
//****************************************************************
voidcomputers(unsignedintv)
{unsignedlongs;
unsignedintss;
unsignedchari;
v=v/2;
s=timeh;
s=s<<8;
s=s+timel;
s=s*v;
ss=s/100000;
disbufs[0]=s/100000000;
s=s%100000000;
disbufs[1]=s/10000000;
s=s%10000000;
disbufs[3]=s/1000000;
s=s%1000000;
disbufs[4]=s/100000;
soubuf[0]=sound[disbufs[0]];
soubuf[1]=sound[disbufs[1]];
soubuf[2]=92;
soubuf[3]=sound[disbufs[3]];
soubuf[4]=sound[disbufs[4]];
soubuf[5]=83;
for(i=0;i<5;i++)
disbufs[i]=disbufs[i]|0x30;
disbufs[2]=0x2e;
disbufs[5]=0x6d;
if(ss<=200)pf=0;
elseif(ss>200&&ss<=300)pf=1;
elseif(ss>300)pf=2;
elsepf=3;
}
//***********************************************************
voiddisplay(void)
{unsignedchari;
wrlcd(0xf8,0x80);
for(i=0;i<9;i++)
wrlcd(0xfa,word[i]);
for(i=0;i<6;i++)
wrlcd(0xfa,disbufs[i]);
wrlcd(0xf8,0x92);
for(i=0;i<8;i++)
{if(pf==0){wrlcd(0xfa,wordd[i]);dr=0;sg=1;hy=1;}
if(pf==1){wrlcd(0xfa,wordh[i]);hy=0;dr=1;sg=1;}
if(pf==2){wrlcd(0xfa,words[i]);sg=0;dr=1;hy=1;}
}
wrlcd(0xf8,0x89);
for(i=0;i<12;i++)
{if(vc==1){wrlcd(0xfa,wordpower[i]);dpl=1;}
if(vc==0){wrlcd(0xfa,worddrop[i]);dpl=0;}
}
wrlcd(0xf8,0x98);
for(i=0;i<5;i++)
wrlcd(0xfa,wordt[i]);
for(i=0;i<8;i++)
wrlcd(0xfa,disbuft[i]);
wrlcd(0xf8,0x9e);
wrlcd(0xfa,0xa1);
wrlcd(0xfa,0xe6);
}
//******************************************************************
voidspeak(void)
{unsignedchari,j,k,h;
for(i=1;i<6;i++)
{P1=soubuf[i];
play=0;
for(j=5;j>0;j--)
for(k=255;k>0;k--)
for(h=250;h>0;h--);
play=1;
for(j=190;j>0;j--)
for(k=255;k>0;k--);
}
}
//******************************************************************
voidsend(void)
{unsignedchari,j,k;
EX0=0;
TH0=0;
TL0=0;
re=1;
for(i=20;i>0;i--)
{fang=1;
for(j=5;j>0;j--);
fang=0;
for(j=4;j>0;j--);
}
TR0=1;
for(j=2;j>0;j--)//延时消除余震3ms3,255
for(i=255;i>0;i--);
IE0=0;
EX0=1;
for(k=2;k>0;k--)//等待中断回波
for(i=255;i>0;i--)
for(j=255;j>0;j--);
}
//******************************************************************
voidintlcd(void)//初始化LCD
{//delay40();
de750ms();
wrlcd(0xf8,0x30);//功能设定
wrlcd(0xf8,0x30);//功能设定
wrlcd(0xf8,0x30);//功能设定
wrlcd(0xf8,0x0c);//显示状态
wrlcd(0xf8,0x06);//显示右移
}
//*****************************************************************
voidcheckself(void)
{unsignedchari;
unsignedcharj,k;
P1=97;
P2=0x00;
wrlcd(0xf8,0x81);
for(i=0;i<13;i++)
wrlcd(0xfa,check[i]);
for(i=0;i<20;i++)
for(j=0;j<255;j++)
for(k=0;k<255;k++);
play=1;
P2=0x7f;
}
//***************************************************************
voidmain(void)
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
EX0=0;
IT0=1;
IE0=0;
ff=0;
P2=0xff;
intlcd();
checkself();
while
(1)
{
ss:
send();
if(ff==0)gotoss;
ff=0;
gettemper();
computert();
re=1;
computers(computerv());
display();
if(ensp==0)
speak();
hl:
if(hold==0)gotohl;
}
}
//*****************************************************************