您的当前位置:首页正文

超声波测距仪源程序

2023-04-25 来源:东饰资讯网
以下是ZY1420语音模块的录音源程序清单:

/******************************************************************* ZY1420语音模块的录音程序

录音方法:开始工作后,按下K1键,根据设定的录音地址和时间开始录音。 放下K1键,本次录音结束。 再按下K1键,开始下次录音。录音顺序按预先设定的,用P1来送地址 ******************************************************************** 地址:0x00 0x06 0x0c 0x12 0x18 ox24 ox2a 0x30 0x36 0x3c 0x42 ox48

内容: 1 2 3 4 5 6 7 8 9 十 点 米

时间: 0.5s

******************************************************************** 地址: 0x4e 0x66 0x7e 0x96 内容: 危险距离 保持距离 安全距离 本次测量的距离为 时间: 2s 2s 2s 2s

*******************************************************************/ #include #include

#define uchar unsigned char #define uint unsigned int

sbit REC=P2^4; //录音控制

sbit PLAYE=P3^0; //控制触发录音 sbit PLAYE=P3^1; //控制电平放音 sbit Y=P2^3; //K1键

extern unsigned long int distance; uchar addr; uint t;

/**********************延时函数.延时为N*100ms**********************/ void delay(uint n) reentrant {

uint t1,i,j;

for(t1=1;t1<=n;t1++) { for(i=1;i<=235;i++) for(j=1;j<=60;j++); } }

/********************播放函数1*****************************/ void paly() {

delay(1); PLAYL=1;

P1=addr; //播放起始地址为addr的内容。 PLAYL=0; //PLAYL低电平放音。 delay(t); //延时t*100ms。 PLAYL=1; }

/**************************查地址和时间函数***********************/ void find(uint n) {

switch(n) { case 1:{addr=0x00;t=5;} break; //\"1\" case 2:{addr=0x06;t=5;} break; //\"2\" case 3:{addr=0x0c;t=5;} break; //\"3\" case 4:{addr=0x12;t=5;} break; //\"4\" case 5:{addr=0x18;t=5;} break; //\"5\" case 6:{addr=0x1e;t=5;} break; //\"6\" case 7:{addr=0x24;t=5;} break; //\"7\" case 8:{addr=0x2a;t=5;} break; //\"8\" case 9:{addr=0x30;t=5;} break; //\"9\" case 0:{addr=0x36;t=5;} break; //\"0\" case 11:{addr=0x3c;t=5;} break; //\"十\" case 12:{addr=0x42;t=5;} break; //\"点\" case 13:{addr=0x48;t=5;} break; //\"米\" case 14:{addr=0x4e;t=20;} break; //\"危险距离\" case 15:{addr=0x66;t=20;} break; //\"保持距离\" case 16:{addr=0x7e;t=20;} break; //\"安全距离\" case 17:{addr=0x96;t=20;} break; //\"测量结果为\" default:{addr=0x00;t=00;}; } }

/****************************主函数***************************/ void speaker(void) reentrant {

uchar a[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; } else if(a[0]==0) //如果第二个数字为0,判断第一个数是否为0。 { find(a[1]); play(); break; //若第一个数也为0,则放\"0\" } else break; //若第一个数不为0,则直接放\"点\" }

find(12); //放\"点\" play();

while(1) //放第三个数字。 {

find(a[2]); //否则播放。 play(); break; }

while(1) //放第四个数字。 { find(a[3]); //否则播放。 play(); break; }

find(13); //放\"米\" play(); }

以下是具有实时语音播放的超声波测距仪主程序清单。 /*-------------------------------------------

超声波测距主程序 -------------------------------------------*/ #include #include #include

typedef unsigned char uchar; typedef unsigned int uint; sbit LED_AQ=P2^0; sbit LED_BC=P2^1; sbit LED_WX=P2^2; sbit LINE0=P2^7; sbit LINE1=P2^6; sbit LINE2=P2^5;

sbit REV=P3^2;

sbit PLAYE=P3^0; //控制触发放音。 sbit PLAYE=P3^1; //控制电平放音。

unsigned long int distance; //距离存储变量。 int data temp; //室温存储变量。 uint data temp_need;

uchar code ready[]=\"Already to work\";

/*************************************** Function states

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

extern void CJ_T(void); //超声波发生子程序。

//LCD function states

extern void initial_lcd(void); //initial lcd extern void clr_distance(uchar i) reetrant; //clr display on line extern void display_t(uchar l,uchar kind) reentrant; //write set char

extern void display_st(uchar *buf) reetrant; //display \"already\" extern void display2(void)reentrant; //显示室温。 extern void write(uchar A,uchar din) reetrant;

//DS18B20 funtion states

extern void tem_start(void); //start temperature cover extern void readtemp(void); //read temp

//AT24C04 function states extern void r_at24(void); extern void w_at24(void);

extern unsigned long int distance;

uchar addr; uint tt2;

/********************************************************* 超声波接收中中断子程序(INTO)

*********************************************************/ void cj_r(void) interrupt 0 {

TR0=0; ET0=0; EX0=0; EA0=0; }

/********************************************************* 延时1ms子程序

*********************************************************/ void delay 1ms(void) {

uchar i,j;

for(i=0;i<2;i++) for(j=0;j<20;j++); }

/********************************************************* 延时N*100ms子程序

*********************************************************/ void delay(uint n) reentrant {

uint t1,i,j;

for(t1=1;t1<=n;t1++) { for(i=1;i<=235;i++) for(j=1;j<=60;j++); } }

/********************************************************* 播放函数

*********************************************************/ void play() {

delay(1); PLAYL=1;

P1=addr; //播放起始地址为addr的内容。 PLAYL=0; //PLAYL低电平放音。 delay(tt2); //延时 t*100ms PLAYL=1;

}

/********************************************************* 查地址和时间函数

*********************************************************/ void find(uchar n) {

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

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

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

void sys_init(void) {

P0=0Xff; //p1=0xff; p2=0xff;

TMOD=0X01; //定时器方式,16位。

IT0=0; //低电平触发中断。

//if(LINE1==0)

//r_at24(); //read at24c04 上一次测量值。 }

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

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

void diatance(void) {

float vel;

unsigned long int data timevalue; timevalue=TH0;

timevalue=(timevalue<<8)|TL0; vel=331.4+0.061*temp;

//distance=timevalue*vel*1.08507; distance=timevalue*vel*1.064; distance/=20000; }

/******************************************************************** 显示距离

********************************************************************/ void display1(uchar choose) {

unsigned long int temp1=0; uint tem_need;

uchar data buffer[5]; uchar data i;

if(choose) temp1=distance; else temp1=tem_need; //display value once

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); }

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

******************************************************************/ void speaker(void) {

uchar data buffer[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; }

else if(buffer[0]==0) //如果第二个数字为0,判断第一个数是否为0。 {

find(buffer[1]); play();

break; // 若第一个数也为0,则放“0”。 }

else break ; //若第一个数不为0,则直接放“点”。 }

find(12); //放“点” play();

while(1)

{ //放第三个数字。 find(buffer[2]); //否则播放。 Play(); break; }

while(1)

{ //放第四个数字。

find(buffer[3]); //否则播放。 Play(); break; }

find(13); //放“米”。 play; }

/******************************************************* main主程序

*******************************************************/ void main(void) {

unsigned long idata i; uchar j,m;

for(j=0;j<255;j++) for(m=0;m<255;m++); sys_init(); inital_lcd();

display_st(ready); //Display Already to work while(1)

{ waiting:

while()LINE0) for(i=0;i<=10;i++) delay 1ms();

if(LINE0) goto waiting;

LED_WX=1; LED_BC=1; LED_AQ=1;

tem_start();

i=14000; while(--i);

readtemp();

clr_display(1);

display_t(1,1); display2();

CJ_T();

while(REV){}; distan();

if(300else if(200<=distance) {LED_BC=0; display_t(2,2); display1(1); }

else if(5speaker();

}

}

//delay //读室温。 //显示室温标号。

//display room temperature

因篇幅问题不能全部显示,请点此查看更多更全内容