<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        51單片機+ISD4002語音芯片讀寫源代碼

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年07月29日   【字體:

         #include <reg52.h>

        #define uchar unsigned char
        #define uint unsigned int
         
        sbit SS=P2^3; //使能控制端
        sbit SCLK=P2^2;
        sbit MOSI=P2^0;
        sbit MISO=P2^1;
         
        sbit LED=P1^0;
        sbit PR=P1^1;//錄放控制端,通過開關來調節,高電平為錄音狀態
        sbit ISD_INT=P1^2;//溢出中斷
         
        sbit AN=P2^4;
        sbit STOP=P2^5;
         
        void delay(uint time)
        {
         while(time!=0)
         {
          time--;
         }
        }
         
        void delayms(uint time)
        {
         TMOD=0x01;
         for(time;time>0;time--)
         {
          TH0=0xfc;
          TL0=0x18;
          TR0=1;
          while(TF0!=1)
          {;}
          TF0=0;
          TR0=0;
         }
        }
         
        void spi_send(uchar isdx)
        {
         uchar isx_counter;
         SS=0;
         SCLK=0;
         for(isx_counter=0;isx_counter<8;isx_counter++)
         {
          if((isdx&0x01)==1)
           MOSI=1;
             else
           MOSI=0;
          isdx=isdx>>1;
          SCLK=1;
          delay(2);
          SCLK=0;
          delay(2);
         }
        }
         
        void isd_stop(void)
        {
         delay(10);
         spi_send(0x30);//停止錄放
         SS=1;//語音芯片沒有被使能
         delayms(50);
        }
         
        void isd_pu(void)
        {
         delay(10);
         SS=0;//語音芯片被使能
         spi_send(0x20);//語音芯片進入待命狀態
         SS=1;
         delayms(50);
        }
         
        void isd_pd(void)
        {
         delay(10);
         spi_send(0x10);//芯片停止本次操作進入省電狀態
         SS=1;
         delayms(50);
        }
         
        void isd_play(void)
        {
         LED=0;
         spi_send(0xf0);//在下一個地址開始放音
         SS=1;
        }
         
        void isd_rec(void)
        {
         LED=0;
         spi_send(0xb0);//在下一個地址開始錄音
         SS=1;
        }
         
        void isd_setplay(uchar adl,uchar adh)
        {
         spi_send(adl);
         adh=adh|0xe0;
         spi_send(adh);
         SS=1;
        }
         
        void isd_setrec(uchar adl,uchar adh)
        {
         spi_send(adl);
         adh=adh|0xa0;
         spi_send(adh);
         SS=1;
        }
         
        void isd_overflow(void)
        {
         while(AN==0)
         {
          LED=1;
          delayms(300);
          LED=0;
          delayms(300);
         }
        }
         
        uchar chk_isdovf(void)
        {
         SS=0;
         delay(2);
         SCLK=0;
         delay(2);
         SCLK=1;
         SCLK=0;
         delay(2);
         if(MISO==1)
         {
          SCLK=0;
          SS=1;
          isd_stop();
          return 1;
         }
         else
         {
          SCLK=0;
          SS=1;
          isd_stop();
          return 0;
         }
        }
         
        void main()
        {
         uchar ovflog;
         while(1)
         {
          P0=P1=P2=P3=0xff;
          while(AN==1)
          {
           if(AN==0)
           {
            delayms(20);
           }
          }
         
          isd_pu();
          isd_pd();
          isd_pu();
         
         
          if(PR==1)
          {
           delayms(500);
           isd_setrec(0x00,0x00);
           do
           {
            isd_rec();
            delay(20);
            while(AN==0)
            {
             if(ISD_INT==0)//判斷中斷輸出(漏極開路輸出)。當存貯器溢出或放音結束標志出現時,該端為低電平并保持
             isd_overflow();//當芯片溢出時LED閃爍
            }
            if(ISD_INT==0)
             break;
            LED=1;
            isd_stop();
            while(AN==1)
            {
             if(STOP==0)
             break;
             if(AN==0)
             delayms(500);
            }
           }while(AN==0);
          }
         
          else
          {
           while(AN==0)
           {;}
           isd_setplay(0x00,0x00);
           do
           {
            isd_play();
            delay(20);
            while(ISD_INT==1)
            {;}
            LED=1;
            isd_stop();
            if(ovflog=chk_isdovf())
             break;
            while(AN==1)
            {
             if(STOP==0)
              delayms(20);
             if(STOP==0)
              break;
             if(AN==0)
              delayms(20);
            }
            LED=0;
           }while(AN==0);
          }
          isd_stop();
          isd_pd();
         }
        }
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮