⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main3.lst

📁 ISD4004芯片的语音录放程序
💻 LST
字号:
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE MAIN3
OBJECT MODULE PLACED IN main3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main3.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          sbit SS=P1^1; //片选
   3          sbit SCLK=P1^0; //ISD4004时钟
   4          sbit MOSI=P1^2; //数据输入
   5          sbit MISO=P1^3; //数据输出
   6          sbit LED=P1^7; //指示灯
   7          sbit ISD_INT=P3^2; //中断
   8          sbit AN=P3^7; //执行
   9          sbit STOP=P3^6; //复位
  10          sbit PR=P1^4;//PR=1 录音 PR=0放音
  11          void delay(unsigned int time) //延时n微秒
  12          {while(time!=0)
  13   1      {time--;
  14   2      }
  15   1      }
  16          
  17          void delayms(unsigned int time) //延时n毫秒
  18          
  19          {TMOD=0x01;
  20   1       for(time;time>0;time--)
  21   1      {TH0=0xfc;
  22   2       TL0=0x18;
  23   2       TR0=1;
  24   2       while(TF0!=1)
  25   2       {;}
  26   2       TF0=0;
  27   2       TR0=0;
  28   2      }
  29   1      }
  30          //************************************
  31          //IS4004 spi串行发送子程序,8位数据
  32          //************************************
  33          void spi_send(unsigned char isdx)
  34          {
  35   1        unsigned char isx_counter;
  36   1        SS=0;
  37   1        SCLK=0;
  38   1      for(isx_counter=0;isx_counter<8;isx_counter++)//先送低位,再送高位
  39   1       {if((isdx&0x01)==1)
  40   2        MOSI=1;
  41   2        else
  42   2        MOSI=0;
  43   2        isdx=isdx>>1;
  44   2        SCLK=1;
  45   2        delay(2);
  46   2        SCLK=0; //送数MOSI
  47   2        delay(2);
  48   2       } 
  49   1      }
  50          
  51          //*****************************************
  52          //发送stop指令
  53          //*****************************************
  54          void isd_stop(void)
  55          {delay(10);
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 2   

  56   1       spi_send(0x30);
  57   1       SS=1;
  58   1       delayms(50);
  59   1      }
  60          
  61          //**************************************
  62          //发送上电指令,并延时50ms
  63          //**************************************
  64          void isd_pu(void)
  65          {delay(10);
  66   1       SS=0;
  67   1       spi_send(0x20);
  68   1       SS=1;
  69   1       delayms(50);
  70   1      }
  71          
  72          //**************************************
  73          //发送掉电指令,并延时50ms
  74          //**************************************
  75          void isd_pd(void)
  76          {delay(10);
  77   1       spi_send(0x10);
  78   1       SS=1;
  79   1       delayms(50);
  80   1      }
  81          //***************************************
  82          //发送play指令
  83          //***************************************
  84          void isd_play(void)
  85          {LED=0;
  86   1       spi_send(0xf0);
  87   1       SS=1;
  88   1      }
  89          
  90          //***************************************
  91          //发送rec指令
  92          //***************************************
  93          void isd_rec(void)
  94          {LED=0;
  95   1       spi_send(0xb0);
  96   1       SS=1;
  97   1      }
  98          
  99          //*******************************************
 100          //发送setplay指令
 101          //*******************************************
 102          void isd_setplay(unsigned char adl,unsigned char adh)
 103          {delayms(1);
 104   1       spi_send(adl);//发送放音起始地址低位
 105   1       delay(2);  
 106   1       spi_send(adh); //发送放音起始地址高位
 107   1       delay(2);
 108   1       spi_send(0xe0);
 109   1       SS=1;
 110   1      }
 111          //*******************************************
 112          //发送setrec指令
 113          //*******************************************
 114          void isd_setrec(unsigned char adl,unsigned char adh)
 115          {
 116   1       
 117   1       delayms(1);
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 3   

 118   1       spi_send(adl);//发送录音起始地址低位
 119   1       delay(2);  
 120   1       spi_send(adh); //发送录音起始地址高位
 121   1       delay(2);
 122   1       spi_send(0xa0);
 123   1       SS=1;
 124   1      }
 125          //**********************************************
 126          //芯片益出,LED闪烁提醒停止录音
 127          //**********************************************
 128          void isd_overflow(void)
 129          {while(AN==0)
 130   1       {LED=1;
 131   2        delayms(300);
 132   2        LED=0;
 133   2        delayms(300);
 134   2       }
 135   1      }
 136          //**********************************************
 137          //检查芯片是否益出(读OVF,并返回OVF值)
 138          //**********************************************
 139          
 140          unsigned char chk_isdovf(void)
 141          {SS=0;
 142   1       delay(2);
 143   1       SCLK=0;
 144   1       delay(2);
 145   1       SCLK=1;
 146   1       SCLK=0;
 147   1       delay(2);
 148   1       if(MISO==1)
 149   1       {SCLK=0;
 150   2        SS=1;//关闭spi通信端
 151   2        isd_stop();//发送stop指令
 152   2        return 1; //OVF为1,返回1
 153   2        }
 154   1       else 
 155   1       {SCLK=0;  //关闭spi通信端
 156   2        SS=1;
 157   2        isd_stop(); //发送stop指令
 158   2        return 0;//OVF为0,返回0
 159   2       } 
 160   1       
 161   1       }
 162          
 163          void ledflash()
 164          {LED=1;
 165   1       delayms(600);
 166   1       LED=0;
 167   1       delayms(600);
 168   1       LED=1;
 169   1       delayms(600);
 170   1       LED=0;
 171   1       delayms(600);
 172   1       LED=1;
 173   1       delayms(600);
 174   1       LED=0;
 175   1       delayms(600);
 176   1       LED=1;
 177   1       delayms(600);
 178   1       LED=0;
 179   1       delayms(600);
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 4   

 180   1      
 181   1      }
 182          RECORD()
 183          {LED=0;
 184   1       delay(10);
 185   1       SS=0;
 186   1       spi_send(0x20);
 187   1       SS=1;
 188   1       delayms(100);
 189   1       SS=0;
 190   1       spi_send(0x20);
 191   1       SS=1;
 192   1       delayms(100);
 193   1       
 194   1       spi_send(0);//发送录音起始地址低位
 195   1       spi_send(0); //发送录音起始地址高位
 196   1       spi_send(0xa0);
 197   1       spi_send(0xb0);
 198   1       delayms(6600);
 199   1       delayms(6600);
 200   1       spi_send(0x30);
 201   1       ledflash();
 202   1      }
 203          
 204          PLAY0000H()
 205          {
 206   1       LED=1;
 207   1       delay(10);
 208   1       SS=0;
 209   1       spi_send(0x20);
 210   1       SS=1;
 211   1       delayms(50);
 212   1       SS=0;
 213   1       spi_send(0x20);
 214   1       SS=1;
 215   1       delayms(100);
 216   1       
 217   1       
 218   1       spi_send(0);//发送录音起始地址低位
 219   1       spi_send(0); //发送录音起始地址高位
 220   1       spi_send(0xe0);
 221   1       spi_send(0xf0);
 222   1       delayms(6600);
 223   1       delayms(6600);
 224   1       spi_send(0x30);
 225   1       spi_send(0x10);
 226   1       LED=0;
 227   1      
 228   1      }
 229          main()
 230          {   ledflash();
 231   1         
 232   1          if(!AN)              //按下KEY4实现录音操作
 233   1              RECORD();
 234   1          if(AN)               //放开KEY4实现放音操作
 235   1              {PLAY0000H();           //从0000H地址放音
 236   2           LED=1;
 237   2           delayms(100);
 238   2               LED=0;
 239   2           delayms(100);     
 240   2               } 
 241   1         while(1)
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 5   

 242   1              {;
 243   2              
 244   2               }
 245   1      }
 246          /*
 247          //**********************************************
 248          //主程序
 249          //功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
 250          //再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
 251          //按stop键芯片复位
 252          //2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
 253          //***************************************************
 254          void main(void)
 255          {unsigned char ovflog;
 256           while(1)
 257           {P0=P1=P2=P3=0xff;//初始化
 258            while(AN==1)//等待AN键按下
 259            {if(AN==0)  //按键防抖动
 260             {delayms(20);}
 261            }
 262           isd_pu();//AN键按下,isd上电并延迟50ms
 263           isd_pd();
 264           isd_pu();
 265           if(PR==1) //如果PR==1则转入录音部分
 266           {delayms(200);//延时录音
 267            isd_setrec(0x00,0x00);//发送0x0000h地址的setplay指令
 268            do
 269            {isd_rec();//发送rec指令
 270             while(AN==0)//等待录音完毕
 271             {if(ISD_INT==0) //如果芯片益出,进行LED闪烁指示
 272              isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
 273            }
 274            if(ISD_INT==0)
 275            break;
 276            LED=1;//录音完毕,LED熄灭
 277            isd_stop();//发送停止命令
 278            while(AN==1) //如果AN再次按下,开始录制下一段语音
 279            {if(STOP==0) //如果按下STOP按键,则芯片复位
 280             break;
 281             if(AN==0)
 282             delayms(500);
 283            }
 284            }while(AN==0);
 285           }
 286           else //如果PR=0则转入放音部分
 287           { 
 288            while(AN==0){;}
 289            isd_setplay(0x00,0x00);//发送setplay指令,从0x0000地址开始录音
 290            do
 291            {isd_play();//发送放音指令
 292             delay(20);
 293             while(ISD_INT==1) //等待放音完毕的EOM中断信号
 294             {;}
 295             LED=1;
 296             isd_stop();//放音完毕,发送stop指令
 297             if(ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
 298             break;
 299             while(AN==1) //等待AN键再次按下
 300             {if(STOP==0)
 301              break;
 302              if(AN==0)
 303              delayms(20);
C51 COMPILER V7.20   MAIN3                                                                 09/09/2008 11:28:45 PAGE 6   

 304             }
 305            }while(AN==0);//An键再次按下,播放下一段语音
 306            }
 307            isd_stop();
 308            isd_pd();
 309            }
 310          }
 311          */
 312            
 313          
 314             
 315          
 316            
 317          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    507    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -