久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3083|回復: 1
打印 上一主題 下一主題
收起左側

單片機控制DFPlayer Mini語音播報程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:487512 發表于 2019-5-23 14:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
自己寫了一段超聲波測距語音播報的程序,用的是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);
}         
}



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:71233 發表于 2020-3-21 15:29 | 只看該作者
這帖子太久了,都沒有人答復。最近玩DFPlayer Mini 16P,覺得這串口MP3模塊還可以的,難的就是要算校驗數據(兩個字節)。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费观看成人鲁鲁鲁鲁鲁视频 | 国产一区二区在线视频 | 欧美国产精品一区二区三区 | 人人做人人澡人人爽欧美 | 国产综合一区二区 | 精品国产1区2区3区 一区二区手机在线 | 狠狠艹 | 国产精品视频网站 | 精品国产一区二区三区性色av | 精品亚洲永久免费精品 | 欧美日韩一 | 欧美成年网站 | 欧美一区二区另类 | 欧美色综合 | 欧美精品久久久久 | 天天干天天爽 | 久久久久久99 | 99热这里 | 成人深夜福利在线观看 | 国产高清视频一区二区 | 天天综合网天天综合色 | 国产在线精品一区二区三区 | 久久久久亚洲视频 | 国产成人精品免费视频 | 国产精品久久久久久久免费观看 | 在线看片国产精品 | 狠狠av | 国产精品久久国产精品久久 | 一区二区三区日 | 伊人婷婷 | 国产精品一区二区欧美黑人喷潮水 | 欧美一区2区三区3区公司 | 久久性色 | 观看毛片| av国产精品| 成人在线视频免费播放 | 亚洲在线一区 | 黄色一级特级片 | 九九九精品视频 | 狠狠操狠狠操 | 国产激情免费视频 |