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

📄 isd4004.lst

📁 C8051f020从ISD4004分段地址0000H 开始放音
💻 LST
字号:
C51 COMPILER V7.05   ISD4004                                                               02/14/2006 08:58:54 PAGE 1   


C51 COMPILER V7.05, COMPILATION OF MODULE ISD4004
OBJECT MODULE PLACED IN ISD4004.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe ISD4004.C DB OE

stmt level    source

   1          //参考程序A:    ISD4004.C
   2          //从分段地址0000H 开始录音,连续录音120秒后停止录音1秒钟,
   3          //再从ISD4004分段地址0000H 开始放音,再连续放音120秒后停止放音。
   4          #include <c8051f020.h> //ISD4004.C  用SPI接口操作ISD4004录放音的程序
   5          #include <intrins.h>   //按下KEY4为录音操作.放开KEY4为放音操作
   6          #define SYSCLK                  11059200
   7          sbit  CS = P0^7;      //P0.7作ISD4004的片选信号
   8          sbit  KEY4 = P3^7;     //KEY4作录放音选择开关.
   9          sbit P10=P1^0; 
  10          sbit P11=P1^1;
  11          sbit P12=P1^2 ;
  12          sbit P13=P1^3;
  13          sbit P14=P1^4;
  14          sbit P15=P1^5;
  15          sbit P16=P1^6;
  16          sbit P17=P1^7;
  17          sbit P20=P2^0; 
  18          sbit P21=P2^1;
  19          sbit P22=P2^2 ;
  20          sbit P23=P2^3;
  21          sbit P24=P2^4;
  22          sbit P25=P2^5;
  23          sbit P26=P2^6;
  24          sbit P27=P2^7;
  25          sbit BELL=P3^5;
  26          unsigned int Count1msInc;
  27          unsigned char K;
  28          exchg();//一个字节的数据倒置
  29          BELL1();
  30          BELL2();
  31          RECORD();
  32          PLAY();
  33          DELY(unsigned int dely)   //延时子程序
  34          {    unsigned int J;
  35   1           for (J=0;J<dely;J++);
  36   1      }
  37          void Timer0_Init (void)
  38          {
  39   1              CKCON|=0x8;                //设置定时器T0为方式1
  40   1              TMOD|=0x1;                              //T0为16位定时计数器
  41   1              TR0 = 0;                        
  42   1              TH0 = (-SYSCLK/1000) >> 8;  //计算T0定时一毫秒的初值
  43   1              TL0 = -SYSCLK/1000;
  44   1              IE|= 0x2;                   // 允许T0中断
  45   1      }
  46          void Timer0_ISR (void) interrupt 1      //T0中断服务子程序
  47          {
  48   1              TH0 = (-SYSCLK/1000) >> 8;  
  49   1              TL0 = -SYSCLK/1000;
  50   1              Count1msInc++;
  51   1      }
  52          void Delay_ms(unsigned char Val_ms)   //延时一豪秒
  53          {
  54   1              Count1msInc=0;
  55   1              TR0 =1;
C51 COMPILER V7.05   ISD4004                                                               02/14/2006 08:58:54 PAGE 2   

  56   1              while((Count1msInc<Val_ms)==1);
  57   1              TR0 =0;
  58   1      }
  59          void Delay_s(unsigned char Val_s)     //延时一秒
  60          {   
  61   1              unsigned int temp;
  62   1              temp = Val_s*1000;
  63   1              Count1msInc=0;
  64   1              TR0 =1;
  65   1              while((Count1msInc<temp)==1);
  66   1              TR0 = 0;
  67   1      }
  68          ON_4004()   //片选
  69          {
  70   1      CS=0;        
  71   1      DELY(50000);  //延时
  72   1       } 
  73          OFF_4004()   //取消片选
  74          {
  75   1      DELY(50000);    //延时
  76   1      CS=1;
  77   1       } 
  78           void SPIWrOne(unsigned char ch)   //传送一字节指令
  79          {  
  80   1              ON_4004();
  81   1              SPIF = 0;
  82   1              K=ch;
  83   1              exchg();
  84   1              SPI0DAT = K;
  85   1              while (SPIF == 0);                              // 等待8位数据传送完成
  86   1          OFF_4004();
  87   1              } 
  88           void SPIWrtwo(unsigned char ch)
  89          {  SPIF = 0;
  90   1              K=ch;
  91   1              exchg();
  92   1              SPI0DAT = K;
  93   1              while (SPIF == 0);                              //等待8位数据传送完成
  94   1          } 
  95          void SPIWrThree(unsigned char addl, unsigned char addh, unsigned char COM)
  96          {       ON_4004();     //传送三字节指令
  97   1          SPIWrtwo(addl);
  98   1              SPIWrtwo(addh);
  99   1              SPIWrtwo(COM);
 100   1              OFF_4004();
 101   1              }
 102          void SYSCLK_Init (void)
 103          {
 104   1              int i;                         // 延时计数器i
 105   1              OSCXCN = 0x67;                 // 用11.0592MHz 晶振作系统时钟
 106   1              for (i=0; i < 256; i++) ;      // 等待晶振稳定
 107   1              while (!(OSCXCN & 0x80)) ;          
 108   1              OSCICN = 0x88;               //选择外部晶振,当时钟失效时触发复位
 109   1      }
 110          void PORT_Init (void)
 111          {
 112   1              XBR0    = 0x02;                     // Enable SPI0
 113   1              XBR1    = 0x00;
 114   1              XBR2    = 0x40;                     // Enable crossbar and weak pull-ups
 115   1      }
 116          void SPI0_Init (void)
 117          {
C51 COMPILER V7.05   ISD4004                                                               02/14/2006 08:58:54 PAGE 3   

 118   1              SPI0CFG = 0x07;                     // 在第二个时钟上升沿采集数据
 119   1                                              // 时钟的空闲状态为高电平
 120   1              SPI0CFG|=0x0C0;                                         //CKPOL =1,CHPHA=1;
 121   1              SPI0CN = 0x03;                      // 主模式,使能SPI   
 122   1                                            
 123   1              SPI0CKR = SYSCLK/2/100000-1;        // 设置SPI的SCLK为100KMZ 
 124   1          P0MDOUT=0x0d;       
 125   1      }
 126          exchg()  //SPI送数据时,送到ISD4004的每一个字节的数据需要倒置后再传送.
 127           {P1=K;   //[包括命令(COM)和高8位地址(ahh)及低8位地址(adl)都要倒置]
 128   1       P20=P17;  //倒置就是把最高位和最低位交换, 次高位和次低位交换,依次交换8次
 129   1       P21=P16;
 130   1       P22=P15;
 131   1       P23=P14;
 132   1       P24=P13;
 133   1       P25=P12;
 134   1       P26=P11;
 135   1       P27=P10;
 136   1       K=P2;
 137   1       }
 138           BELL1()//   蜂鸣器鸣一声
 139           {  BELL=0;
 140   1      DELY(65000);
 141   1         BELL=1;
 142   1      }
 143          BELL2()//   蜂鸣器鸣二声
 144           {  BELL=0;
 145   1      DELY(65000);
 146   1         BELL=1;
 147   1      DELY(65000); 
 148   1         BELL=0;
 149   1      DELY(65000);
 150   1         BELL=1;
 151   1      }
 152          RECORD()
 153                  {       BELL1();                    //蜂鸣器响一次
 154   1                      SPIF = 0;
 155   1                      SPIWrOne(0x20);                         //上电
 156   1                      DELY(10000);                            //延时25ms
 157   1              EA=1;                       //开中断
 158   1                      SPIWrOne(0x20);                         //上电
 159   1                      DELY(10000);                            //延时25ms
 160   1                      BELL2();                    //蜂鸣器响二次
 161   1                      SPIWrThree(0x00,0x0,0x0a0);     //设置录音起始地址为0000h
 162   1                  SPIWrOne(0xb0);                             //连续录
 163   1                       Delay_s(60);               //延时60s
 164   1               Delay_s(60);               //延时60s
 165   1                      SPIWrOne(0x30);                     //停止录音
 166   1                      BELL1();                    //蜂鸣器响一次
 167   1           
 168   1         }
 169          
 170          PLAY0000H()
 171          {           SPIWrOne(0x20);                        //上电
 172   1                              DELY(60000);               //延时
 173   1                              SPIWrOne(0x20);                    //上电
 174   1                              DELY(60000);
 175   1                              BELL2();                   //蜂鸣器响二次
 176   1              SPIWrThree(0x0,0x00,0x0E0);    //设置放音地址:0000H
 177   1                       SPIWrOne(0x0f0);                          //连续放音
 178   1               Delay_s(60);                  //延时60s
 179   1               Delay_s(60);                  //延时60s
C51 COMPILER V7.05   ISD4004                                                               02/14/2006 08:58:54 PAGE 4   

 180   1                   SPIWrOne(0x30);                       //停止放音
 181   1                  ; SPIWrOne(0x10);                      //掉电
 182   1                       DELY(1000);
 183   1                   BELL2();                      //蜂鸣器响二次
 184   1              }
 185          void main (void) 
 186          {
 187   1              WDTCN = 0xde;            // 初始化看门狗
 188   1              WDTCN = 0xad;
 189   1              SYSCLK_Init ();          // 初始化系统时钟
 190   1              PORT_Init ();            // 初始化I/O口
 191   1              SPI0_Init ();            // 初始化SPI
 192   1          Timer0_Init() ;          // 初始化定时器T0
 193   1           EA = 1;
 194   1              while(1)
 195   1              {
 196   2              if(!KEY4)              //按下KEY4实现录音操作
 197   2              RECORD();
 198   2          if(KEY4)               //放开KEY4实现放音操作
 199   2              PLAY0000H();           //从0000H地址放音
 200   2      }
 201   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    486    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       2
   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 + -