自己写了一段超声波测距语音播报的程序,用的是DFPlayer Mini播报模块,但是语音播报一直出错,有大佬帮忙看看吗?谢谢
//#include<reg52.h> #include <intrins.h> #include "STK6037.h" #define uchar unsigned char #define uint unsigned int uint num=0; uint timer=0; unsigned char table[9]={0,0,0,0,0,0,0,0,0};//显示的数值 bit flag; //温度变量 uint temp; uint time=0; unsigned long S=0; bit flagg=0; // 1602引脚定义 sbit RW=P1^1; sbit RS=P1^0; sbit E=P1^2;
//报警引脚定义 sbit feng=P1^5; sbit led=P2^0;
//按键控制 sbit key1=P3^4; sbit key2=P3^5;
sbit ds=P3^2; /温度引脚 //超声波位定义 sbit Trig = P2^1; sbit Echo = P2^2; int numm=0,nnum=0;
void delayms(unsigned int ms) { unsigned char i=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } } }
void delay2(uchar p) { uchar l,k; for(l=p;l>0;l--) for(k=110;k>0;k--); }
void delay(uchar z) { while(z--); }
//温度初始化函数 void ds_reste() { ds=1; delay(5); ds=0; delay(80); ds=1; delay(14); if(ds==0) //判断ds总线 flag=1; else flag=0; delay(20); }
//读一位字节 bit ds_read_byte() { bit dat; ds=0; _nop_(); _nop_(); ds=1; _nop_(); dat=ds; delay(10); return dat; }
//读一位字节 uchar ds_read() { uchar i,j,k; for(i=0;i<8;i++) { j=ds_read_byte(); k=(j<<7)|(k>>1); } return k; }
//写入数据 void ds_write(uchar dat) { uchar i; for(i=0;i<8;i++) { ds=0; _nop_(); ds=dat&0x01; delay(6); ds=1; dat=dat>>1; } delay(6); }
//读取温度 uint read_temp() { uchar a,b; ds_reste(); ds_write(0xcc); ds_write(0xbe); a=ds_read(); b=ds_read(); temp=b; temp=temp<<8; temp=temp|a; temp=temp*0.0625*10+0.5; return temp; }
//写入命令1602 void write_com(uchar com) { RS=0; RW=0; E=0; P0=com; delay2(5); E=1; delay2(5); E=0; }
//写入数据1602 void write_data(uchar date) { RS=1; RW=0; E=0; P0=date; delay2(5); E=1; delay2(5); E=0; }
//1602初始化显示 void init() { RS=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); }
//温度在1602上显示出来 void display(uint tempp) { write_com(0x80+0x0b); table[0]=tempp/100; write_data(table[0]+0x30); delay2(10);
write_com(0x80+0x0c); table[1]=tempp%100/10; write_data(table[1]+0x30); delay2(10);
write_com(0x80+0x0d); write_data('.'); delay2(10);
write_com(0x80+0x0e); table[2]=tempp%100%10; write_data(table[2]+0x30); delay2(10);
write_com(0x80+0x0f); write_data('C'); delay2(10);
write_com(0x80+0x09); write_data('T'); delay2(10);
write_com(0x80+0x0a); write_data(':'); delay2(10);
}
/超声波测距 void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; ES=0; S=(time*1.7)/100+1; //算出来测距值单位是cm
if((S>500)||S<10) //超出测量范围显示*** { //flagg=0; write_com(0x80+0x40); write_data('c'); // delay2(10);
write_com(0x80+0x41); write_data('j'); //delay2(10);
write_com(0x80+0x42); write_data(':'); // delay2(10);
write_com(0x80+0x43); write_data('*'); // delay2(10);
write_com(0x80+0x44); write_data('*'); delay2(10); write_com(0x80+0x45); write_data('*'); // delay2(10);
write_com(0x80+0x46); write_data('M'); // delay2(10); //显示M write_com(0x80+0x47); write_data('M'); // delay2(10); //显示M } else {
write_com(0x80+0x40); write_data('c'); // delay2(10);
write_com(0x80+0x41); write_data('j'); // delay2(10);
write_com(0x80+0x42); write_data(':'); // delay2(10);
write_com(0x80+0x43); table[3]=S/100; write_data(table[3]+0x30); // s/100 // delay2(10);
write_com(0x80+0x44); table[4]=S%100/10; write_data(table[4]+0x30); // s%100/10 // delay2(10);
write_com(0x80+0x45); table[5]=S%100%10; write_data(table[5]+0x30); // s // delay2(10);
write_com(0x80+0x46); write_data('C'); //delay2(10);
write_com(0x80+0x47); write_data('M'); // delay2(10);
//} } } //语音播报 void yuyinbobao() { delay2(10); Uart_SendCMD(0x03 , 0 , 0x01); delay2(500); if(table[3]==0) {
duqu(table[4]); delay2(100); Uart_SendCMD(0x03 , 0 , 0x0c); delay2(100); duqu(table[5]); delay2(100); Uart_SendCMD(0x03 , 0 , 0x01); delay2(100); } else if(table[3]!=0) { // delay2(50); duqu(table[3]); delay2(100); Uart_SendCMD(0x03 , 0 , 0x0d); delay2(100); duqu(table[4]); delay2(100); Uart_SendCMD(0x03 , 0 , 0x0c); delay2(100); duqu(table[5]); delay2(100); } Uart_SendCMD(0x03 , 0 , 0x0e); delay2(100); } //显示按键输入值 void display1() { write_com(0x80+0x00); write_data('S'); // delay2(10);
write_com(0x80+0x01); write_data('z'); //delay2(10);
write_com(0x80+0x02); write_data(':'); // delay2(10);
write_com(0x80+0x03); table[6]=num/100; write_data(table[6]+0x30); // num/100 //delay2(10);
write_com(0x80+0x04); table[7]=num%100/10; write_data(table[7]+0x30); // num%100/10 // delay2(10);
write_com(0x80+0x05); table[8]=num%100%10; write_data(table[8]+0x30); // num //delay2(10);
write_com(0x80+0x06); write_data('C'); //delay2(10);
write_com(0x80+0x07); write_data('M'); // delay2(10); } //按键控制 void KEY() { if(key1==0) { delay2(10); if(key1==0) { num+=10; if(num==500)num=0; } while(!key1); delay2(10); // while(!key1); }
if(key2==0) { delay2(10); if(key2==0) { num-=10; if(num==0)num=0; } while(!key2); delay2(10); // while(!key2); } } /蜂鸣器报警 void BEEP() { if(num<S) {
feng=0; led=0; delay2(80); feng=1; delay2(3); }
else { feng=1; led=1; } }
void StartModule() //启动模块 {
_nop_(); _nop_(); _nop_(); Trig=1; //启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
Trig=0;
}
void tempchang(void) { ds_reste(); delay2(1); ds_write(0xcc); ds_write(0x44); } void T1_time() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块 { TH1=0xf8; TL1=0x30; // Display(); // xian2(); timer++; if(timer>=400) { timer=0; Trig=1; //800MS 启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig=0; } KEY(); }
void T0_time() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { TR0=0;
EA=0; TH0=0; TL0=0; time=TH0*256+TL0;
} void main() { feng=1; led=1; TMOD=0x11; //设T0为方式1,GATE=1 TH0=0; TL0=0; TH1=0xf8; //2MS定时 TL1=0x30; ET0=1; //允许T0中断 ET1=1; //允许T1中断Ï TR1=1; //开启定时器 EA=1; //开启总中断 init(); //1602的初始化 //Serial_init() ; while(1) { // Serial_init() ; display1(); //显示按键值 // KEY(); //按键
BEEP(); //蜂鸣器 //StartModule(); while(!Echo); //当RX为零时等待 TR0=1; //开启计数 while(Echo); //当RX为1时计数并等待 TR0=0; //关闭计数 Conut(); //距离显示 // TR1=1; // ES=1; // yuyinbobao(); delayms(10); tempchang(); //温度开始转换 display(read_temp());//温度显示 delayms(50); } }
|