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

📄 4004.lst

📁 ISD4004芯片的语音录放程序
💻 LST
字号:
C51 COMPILER V7.50   4004                                                                  09/14/2008 12:50:00 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE 4004
OBJECT MODULE PLACED IN F:\资料\报站\ISD400~1\4004.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE F:\资料\报站\ISD400~1\4004.C DB SB OE OT(0)

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.50   4004                                                                  09/14/2008 12:50:00 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.50   4004                                                                  09/14/2008 12:50:00 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          //***********************************
 164          //入口:录音的起始位置,高低位
 165          //录音程序
 166          //功能:从指定位置录音
 167          //***********************************
 168           void rec(unsigned char adl,unsigned char adh)
 169           {
 170   1         delayms(200);//延时录音
 171   1              isd_setrec(adl,adh);//发送0x0000h地址的setplay指令//adl为低位, adh为高位
 172   1              do
 173   1              {
 174   2              isd_rec();//发送rec指令
 175   2              while(AN == 0)//等待录音完毕
 176   2         {
 177   3              if(ISD_INT == 0) //如果芯片益出,进行LED闪烁指示
 178   3          isd_overflow();//如果取消录音(松下AN键)则停止录音,芯片复位
 179   3              }
C51 COMPILER V7.50   4004                                                                  09/14/2008 12:50:00 PAGE 4   

 180   2        if(ISD_INT == 0)
 181   2        break;
 182   2        LED = 1;//录音完毕,LED熄灭
 183   2        isd_stop();//发送停止命令
 184   2        while(AN == 1) //如果AN再次按下,开始录制下一段语音
 185   2        {
 186   3              if(STOP == 0) //如果按下STOP按键,则芯片复位
 187   3               break;
 188   3         if(AN == 0)
 189   3         delayms(500);
 190   3        }
 191   2        }while(AN == 0);
 192   1       }
 193          
 194          //***********************************
 195          //入口:放音位置的高低位
 196          //放音程序
 197          //功能:从指定位置放音
 198          //***********************************
 199          void play(unsigned char adl,unsigned char adh)
 200          {
 201   1              unsigned char ovflog;
 202   1              while(AN == 0) {;}
 203   1          isd_setplay(adl,adh);//发送setplay指令,从0x0000地址开始放音
 204   1        do
 205   1        {
 206   2              isd_play();//发送放音指令
 207   2              delay(20);
 208   2         while(ISD_INT == 1) //等待放音完毕的EOM中断信号
 209   2         {;}
 210   2         LED = 1;
 211   2         isd_stop();//放音完毕,发送stop指令
 212   2         if(ovflog == chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位
 213   2         break;
 214   2         while(AN == 1) //等待AN键再次按下
 215   2         {
 216   3              if(STOP == 0)
 217   3          break;
 218   3          if(AN == 0)
 219   3          delayms(20);
 220   3         }
 221   2        }while(AN == 0);//An键再次按下,播放下一段语音
 222   1      }
 223          
 224          //初始化程序
 225          //初始化单片机,并等待按键按下
 226          void in_stc()
 227          {
 228   1      
 229   1       
 230   1              P0 = P1 = P2 = P3 = 0xff;//初始化
 231   1              while(AN == 1)//等待AN键按下
 232   1              {
 233   2              if(AN == 0)  //按键防抖动
 234   2              {delayms(20);}
 235   2              }
 236   1              isd_pu();//AN键按下,isd上电并延迟50ms
 237   1              isd_pd();
 238   1              isd_pu();
 239   1        
 240   1      }
 241          
C51 COMPILER V7.50   4004                                                                  09/14/2008 12:50:00 PAGE 5   

 242          //**********************************************
 243          //主程序
 244          //功能:1.录音时,按住AN键,LED点亮开始录音,松开AN键即可停止录音
 245          //再次按下AN键,LED点亮开始录音第二段,依次类推,直至芯片溢出
 246          //按stop键芯片复位
 247          //2.放音时,按下AN键,即可播放一段语音,按stop键芯片复位.
 248          //***************************************************
 249          void main(void)
 250          {
 251   1         while (1)
 252   1           {
 253   2              in_stc();
 254   2            if(PR == 1) //如果PR==1则转入录音部分
 255   2               {
 256   3                 rec(0x00,0x00);
 257   3               }
 258   2      
 259   2           else //如果PR=0则转入放音部分
 260   2            {
 261   3             play(0x00,0x00);
 262   3            }
 263   2         isd_stop();
 264   2         isd_pd();
 265   2        }
 266   1      }
C51 COMPILER V7.50   4004                                                                  09/14/2008 12:50:00 PAGE 6   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


P0 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0080H  1
P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
P2 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A0H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
in_stc . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
isd_pu . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
_isd_setplay . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  adl. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  adh. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
_isd_setrec. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  adl. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  adh. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
AN . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B7H  1
_play. . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  adl. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  adh. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
  ovflog . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0002H  1
_rec . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  adl. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  adh. . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
isd_overflow . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
PR . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0094H  1
SS . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0091H  1
main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
chk_isdovf . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
ISD_INT. . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B2H  1
SCLK . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0090H  1
TMOD . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0089H  1
MISO . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0093H  1
MOSI . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0092H  1
_spi_send. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  isdx . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
  isx_counter. . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0001H  1
STOP . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00B6H  1
TF0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      008DH  1
TH0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008CH  1
TL0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008AH  1
_delayms . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  time . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2
LED. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0097H  1
TR0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      008CH  1
isd_play . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
isd_rec. . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
isd_stop . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
_delay . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  time . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2
isd_pd . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----


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

C51 COMPILER V7.50   4004                                                                  09/14/2008 12:50:00 PAGE 7   


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

⌨️ 快捷键说明

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