/******************************************************************* 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 #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 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(300 else if(5 } } //delay //读室温。 //显示室温标号。 //display room temperature 因篇幅问题不能全部显示,请点此查看更多更全内容