具有实时语音播报功能的超声波测距仪.docx

上传人:b****2 文档编号:2139071 上传时间:2023-05-02 格式:DOCX 页数:17 大小:47.06KB
下载 相关 举报
具有实时语音播报功能的超声波测距仪.docx_第1页
第1页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第2页
第2页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第3页
第3页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第4页
第4页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第5页
第5页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第6页
第6页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第7页
第7页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第8页
第8页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第9页
第9页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第10页
第10页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第11页
第11页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第12页
第12页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第13页
第13页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第14页
第14页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第15页
第15页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第16页
第16页 / 共17页
具有实时语音播报功能的超声波测距仪.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

具有实时语音播报功能的超声波测距仪.docx

《具有实时语音播报功能的超声波测距仪.docx》由会员分享,可在线阅读,更多相关《具有实时语音播报功能的超声波测距仪.docx(17页珍藏版)》请在冰点文库上搜索。

具有实时语音播报功能的超声波测距仪.docx

具有实时语音播报功能的超声波测距仪

具有实时语音播报的超声波测距仪的源程序

#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;

}

}

//*****************************************************************

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2