自己寫了一段超聲波測距語音播報的程序,用的是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); } }
|