超声波测距仪源程序.docx

上传人:b****7 文档编号:16223976 上传时间:2023-07-11 格式:DOCX 页数:17 大小:18.43KB
下载 相关 举报
超声波测距仪源程序.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

超声波测距仪源程序

以下是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();

}

}

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

当前位置:首页 > 经管营销

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

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