超声波测距仪源程序.docx
- 文档编号:16223976
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:17
- 大小:18.43KB
超声波测距仪源程序.docx
《超声波测距仪源程序.docx》由会员分享,可在线阅读,更多相关《超声波测距仪源程序.docx(17页珍藏版)》请在冰点文库上搜索。
超声波测距仪源程序
以下是ZY1420语音模块的录音源程序清单:
/*******************************************************************
ZY1420语音模块的录音程序
录音方法:
开始工作后,按下K1键,根据设定的录音地址和时间开始录音。
放下K1键,本次录音结束。
再按下K1键,开始下次录音。
录音顺序按预先设定的,用P1来送地址
********************************************************************
地址:
0x000x060x0c0x120x18ox24ox2a0x300x360x3c0x42ox48
内容:
123456789十点米
时间:
0.5s
********************************************************************
地址:
0x4e0x660x7e0x96
内容:
危险距离保持距离安全距离本次测量的距离为
时间:
2s2s2s2s
*******************************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitREC=P2^4;//录音控制
sbitPLAYE=P3^0;//控制触发录音
sbitPLAYE=P3^1;//控制电平放音
sbitY=P2^3;//K1键
externunsignedlongintdistance;
ucharaddr;
uintt;
/**********************延时函数.延时为N*100ms**********************/
voiddelay(uintn)reentrant
{
uintt1,i,j;
for(t1=1;t1<=n;t1++)
{
for(i=1;i<=235;i++)
for(j=1;j<=60;j++);
}
}
/********************播放函数1*****************************/
voidpaly()
{
delay
(1);
PLAYL=1;
P1=addr;//播放起始地址为addr的内容。
PLAYL=0;//PLAYL低电平放音。
delay(t);//延时t*100ms。
PLAYL=1;
}
/**************************查地址和时间函数***********************/
voidfind(uintn)
{
switch(n)
{
case1:
{addr=0x00;t=5;}break;//"1"
case2:
{addr=0x06;t=5;}break;//"2"
case3:
{addr=0x0c;t=5;}break;//"3"
case4:
{addr=0x12;t=5;}break;//"4"
case5:
{addr=0x18;t=5;}break;//"5"
case6:
{addr=0x1e;t=5;}break;//"6"
case7:
{addr=0x24;t=5;}break;//"7"
case8:
{addr=0x2a;t=5;}break;//"8"
case9:
{addr=0x30;t=5;}break;//"9"
case0:
{addr=0x36;t=5;}break;//"0"
case11:
{addr=0x3c;t=5;}break;//"十"
case12:
{addr=0x42;t=5;}break;//"点"
case13:
{addr=0x48;t=5;}break;//"米"
case14:
{addr=0x4e;t=20;}break;//"危险距离"
case15:
{addr=0x66;t=20;}break;//"保持距离"
case16:
{addr=0x7e;t=20;}break;//"安全距离"
case17:
{addr=0x96;t=20;}break;//"测量结果为"
default:
{addr=0x00;t=00;};
}
}
/****************************主函数***************************/
voidspeaker(void)reentrant
{
uchara[5]={0,0,0,0,0};//设定待播放的数值。
find(17);//放"测量结果为"
play();
a[0]=distance/1000;//将数据写入。
a[1]=(distance%1000)/100;
a[2]=(distance%100)10;
a[3]=distance%10;
while
(1)//放第一个数字。
{
if(a[0]==0)break;//第一个数字是否为0?
是则跳出循环。
find(a[0]);//不是则放音。
play();
find(11);//放"十"。
play();
break;
}
while
(1)//放第二个数字。
{
if(a[1]!
=0)//若第二个数字不为0,则播放。
{
find(a[1]);
play();
break;
}
elseif(a[0]==0)//如果第二个数字为0,判断第一个数是否为0。
{
find(a[1]);
play();
break;//若第一个数也为0,则放"0"
}
elsebreak;//若第一个数不为0,则直接放"点"
}
find(12);//放"点"
play();
while
(1)//放第三个数字。
{
find(a[2]);//否则播放。
play();
break;
}
while
(1)//放第四个数字。
{
find(a[3]);//否则播放。
play();
break;
}
find(13);//放"米"
play();
}
以下是具有实时语音播放的超声波测距仪主程序清单。
/*-------------------------------------------
超声波测距主程序
-------------------------------------------*/
#include
#include
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
sbitLED_AQ=P2^0;
sbitLED_BC=P2^1;
sbitLED_WX=P2^2;
sbitLINE0=P2^7;
sbitLINE1=P2^6;
sbitLINE2=P2^5;
sbitREV=P3^2;
sbitPLAYE=P3^0;//控制触发放音。
sbitPLAYE=P3^1;//控制电平放音。
unsignedlongintdistance;//距离存储变量。
intdatatemp;//室温存储变量。
uintdatatemp_need;
ucharcodeready[]="Alreadytowork";
/***************************************
Functionstates
***************************************/
externvoidCJ_T(void);//超声波发生子程序。
//LCDfunctionstates
externvoidinitial_lcd(void);//initiallcd
externvoidclr_distance(uchari)reetrant;//clrdisplayonline
externvoiddisplay_t(ucharl,ucharkind)reentrant;//writesetchar
externvoiddisplay_st(uchar*buf)reetrant;//display"already"
externvoiddisplay2(void)reentrant;//显示室温。
externvoidwrite(ucharA,uchardin)reetrant;
//DS18B20funtionstates
externvoidtem_start(void);//starttemperaturecover
externvoidreadtemp(void);//readtemp
//AT24C04functionstates
externvoidr_at24(void);
externvoidw_at24(void);
externunsignedlongintdistance;
ucharaddr;
uinttt2;
/*********************************************************
超声波接收中中断子程序(INTO)
*********************************************************/
voidcj_r(void)interrupt0
{
TR0=0;
ET0=0;
EX0=0;
EA0=0;
}
/*********************************************************
延时1ms子程序
*********************************************************/
voiddelay1ms(void)
{
uchari,j;
for(i=0;i<2;i++)
for(j=0;j<20;j++);
}
/*********************************************************
延时N*100ms子程序
*********************************************************/
voiddelay(uintn)reentrant
{
uintt1,i,j;
for(t1=1;t1<=n;t1++)
{
for(i=1;i<=235;i++)
for(j=1;j<=60;j++);
}
}
/*********************************************************
播放函数
*********************************************************/
voidplay()
{
delay
(1);
PLAYL=1;
P1=addr;//播放起始地址为addr的内容。
PLAYL=0;//PLAYL低电平放音。
delay(tt2);//延时t*100ms
PLAYL=1;
}
/*********************************************************
查地址和时间函数
*********************************************************/
voidfind(ucharn)
{
switch(n)
{
case1:
{addr=0x00;tt2=2;}break;//"1"
case2:
{addr=0x06;tt2=2;}break;//"2"
case3:
{addr=0x0c;tt2=2;}break;//"3"
case4:
{addr=0x12;tt2=2;}break;//"4"
case5:
{addr=0x18;tt2=2;}break;//"5"
case6:
{addr=0x1e;tt2=2;}break;//"6"
case7:
{addr=0x24;tt2=2;}break;//"7"
case8:
{addr=0x2a;tt2=2;}break;//"8"
case9:
{addr=0x30;tt2=2;}break;//"9"
case0:
{addr=0x36;tt2=2;}break;//"0"
case11:
{addr=0x3c;tt2=2;}break;//"十"
case12:
{addr=0x42;tt2=2;}break;//"点"
case13:
{addr=0x48;tt2=2;}break;//"米"
case14:
{addr=0x4e;tt2=4;}break;//"危险距离"
case15:
{addr=0x66;tt2=4;}break;//"保持距离"
case16:
{addr=0x7e;tt2=5;}break;//"安全距离"
case17:
{addr=0x96;tt2=10;}break;//"测量结果为"
default:
{addr=0x00;tt2=00;};
}
}
/**********************************************************************
**********************************************************************/
voidsys_init(void)
{
P0=0Xff;
//p1=0xff;
p2=0xff;
TMOD=0X01;//定时器方式,16位。
IT0=0;//低电平触发中断。
//if(LINE1==0)
//r_at24();//readat24c04上一次测量值。
}
/*********************************************************************
*********************************************************************/
voiddiatance(void)
{
floatvel;
unsignedlongintdatatimevalue;
timevalue=TH0;
timevalue=(timevalue<<8)|TL0;
vel=331.4+0.061*temp;
//distance=timevalue*vel*1.08507;
distance=timevalue*vel*1.064;
distance/=20000;
}
/********************************************************************
显示距离
********************************************************************/
voiddisplay1(ucharchoose)
{
unsignedlonginttemp1=0;
uinttem_need;
uchardatabuffer[5];
uchardatai;
if(choose)
temp1=distance;
else
temp1=tem_need;//displayvalueonce
buffer[0]=temp1/1000;
buffer[1]=(temp1%1000)/100;
buffer[2]=(temp1%100)/10;
buffer[3]=temp1%10;
for(i=0;i<4;1++)
{
if(buffer[0]==0)
buffer[0]=0x20;
else
buffer[i]+=0x30;
}
write(0,0x94);
write(1,buffer[0]);
write(1,buffer[1]);
write(1,0x2e);
write(1,buffer[2]);
write(1,buffer[3]);
write(1,0x4d);
}
/******************************************************************
******************************************************************/
voidspeaker(void)
{
uchardatabuffer[5];
find(16);//放"测量结果为"。
play();
buffer[0]=distance/1000;
buffer[1]=(distance%1000)/100;
buffer[2]=(distance%100)/10;
buffer[3]=distance%10;
while
(1)//放第一个数字。
{
if(buffer[0]==0)break;//第一个数字是否为0?
是则跳出循环。
find(buffer[0]);//不是则放音。
Play();
find(11);//放“十”
play();
break;
}
while
(1)
{//放第二个数字。
if(buffer[1]!
=0)
{//若第二个数字不为0,则播放。
find(buffer[1]);
play();
break;
}
elseif(buffer[0]==0)//如果第二个数字为0,判断第一个数是否为0。
{
find(buffer[1]);
play();
break;//若第一个数也为0,则放“0”。
}
elsebreak;//若第一个数不为0,则直接放“点”。
}
find(12);//放“点”
play();
while
(1)
{//放第三个数字。
find(buffer[2]);//否则播放。
Play();
break;
}
while
(1)
{//放第四个数字。
find(buffer[3]);//否则播放。
Play();
break;
}
find(13);//放“米”。
play;
}
/*******************************************************
main主程序
*******************************************************/
voidmain(void)
{
unsignedlongidatai;
ucharj,m;
for(j=0;j<255;j++)
for(m=0;m<255;m++);
sys_init();
inital_lcd();
display_st(ready);//DisplayAlreadytowork
while
(1)
{
waiting:
while()LINE0)
for(i=0;i<=10;i++)
delay1ms();
if(LINE0)gotowaiting;
LED_WX=1;
LED_BC=1;
LED_AQ=1;
tem_start();
i=14000;//delay
while(--i);
readtemp();//读室温。
clr_display
(1);
display_t(1,1);//显示室温标号。
display2();//displayroomtemperature
CJ_T();
while(REV){};
distan();
if(300 {LED_AQ=0; display_t(2,3); display (1); } elseif(200<=distance) {LED_BC=0; display_t(2,2); display1 (1); } elseif(5 {LED_WX=0; display_t(2,1); display1 (1); }; speaker(); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距仪 源程序
![提示](https://static.bingdoc.com/images/bang_tan.gif)