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

📄 1420.lst

📁 51单片机控制ISD1420实现选段播放功能的实现
💻 LST
字号:
C51 COMPILER V8.15   1420                                                                  02/21/2009 15:17:33 PAGE 1   


C51 COMPILER V8.15, COMPILATION OF MODULE 1420
OBJECT MODULE PLACED IN 1420.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1420.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /**********************************************************
   2          功能:  使用STC2052单片机控制 ISD1420语音芯片的播放
   3                 1、顺序连续分段放音
   4                 2、选段播放(播放任意段)
   5                 3、所有的播放控制都是通过接收串口的命令来执行
   6                 
   7          编写:  benladn911  AVR猎手
   8          
   9          日期:  2006-6-28创建
  10                 2008-2-21添加注释和完善
  11          **********************************************************/
  12          
  13          #include<STC12C2052.H>
  14          #include<intrins.h>
  15          #include<stdio.h>
  16          #include<string.h>
  17          
  18          //硬件端口的定义
  19          #define  POW P3_7   //此引脚为单片机控制一个三极管给 ISD1420供电
  20          
  21          #define  PL  P3_5   //接 ISD1420 的 PLAYL
  22          #define  PE  P3_4   //接 ISD1420 的 PLAYE
  23          #define  REC P3_3   //接 ISD1420 的 REC
  24          
  25          #define  REC_LED  P3_2   //ISD1420 的 REC LED
  26          
  27          //操作模式的定义
  28          #define  mode1  0xC8 //循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
  29          
  30          #define  mode2  0xD0 //按顺序连续分段录放音,每段语音长度不限
  31          #define  mode3  0xC0 //地址指针复位,开始录放第一段
  32          #define  mode4  0xD1 //按 PE 键可快速选段放音
  33          
  34                          //0xC1 //也为地址指针复位
  35                          
  36          unsigned char RX_index=0;               //
  37          bit FLAG_rev = 0; //
  38          unsigned char PC_COMMAND;
  39          unsigned char RX_BUFFER[10];//串行接收缓存
  40          
  41          void io_init(void);
  42          void init_serialcomm(void);
  43          void serial_out(unsigned char d);
  44          void delay5ms(void);
  45          void delay(unsigned int x);
  46          void nop(unsigned char i);
  47          
  48          void paly(unsigned char i);//选择播放当前段操作
  49          
  50          
  51          void main(void)
  52          {
  53   1              io_init();
  54   1              init_serialcomm();
  55   1              delay(1000);
C51 COMPILER V8.15   1420                                                                  02/21/2009 15:17:33 PAGE 2   

  56   1      
  57   1      
  58   1       serial_out(0xaa);  //发送到PC机,看看PC端是否收到正确数据
  59   1       serial_out(0x55);
  60   1       serial_out(0x33);
  61   1      
  62   1      
  63   1              POW = 0;//开启电源
  64   1              
  65   1              //P1 = mode4;
  66   1              //P1 = 0X00;
  67   1              while(1)
  68   1              {
  69   2      
  70   2              }
  71   1              
  72   1      }
  73          
  74          //----- 端口初始化 
  75          void io_init(void)
  76          {       
  77   1              P1M0 = 0x00; //设置STC的 IO 为标准51 IO模式
  78   1              P1M1 = 0x00;
  79   1              P3M0 = 0x00;
  80   1              P3M1 = 0x00;    
  81   1              P1 = 0XFF;
  82   1              P3 = 0XFF;
  83   1      }
  84          
  85          //串行口初始化
  86          void init_serialcomm(void)
  87          {
  88   1          SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
  89   1      
  90   1          TMOD = 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
  91   1      
  92   1          TH1 = 0xf3;//12MHz, 2400 bps
  93   1          TL1 = 0xf3;
  94   1              //IE   |= 0x90;       //Enable Serial Interrupt 
  95   1          
  96   1          TR1   = 1;          // timer 1 run
  97   1         
  98   1              ES=1;
  99   1              EA=1;
 100   1      }
 101          
 102          //串行数据发送,查询模式
 103          void serial_out(unsigned char d)
 104          {
 105   1              ES=0;
 106   1              SBUF=d;while(TI==0){;}TI=0;     
 107   1              ES=1;   
 108   1      }
 109          
 110          //串行中断接收
 111          void receive() interrupt 4
 112          {
 113   1              if(RI)
 114   1              {
 115   2                      RI = 0;
 116   2                      ES = 0;
 117   2                      PC_COMMAND = SBUF;
C51 COMPILER V8.15   1420                                                                  02/21/2009 15:17:33 PAGE 3   

 118   2                      
 119   2      
 120   2                      //RX_BUFFER[RX_index] = PC_COMMAND;             //保存数据到数组里面
 121   2                      //RX_index++;
 122   2                switch(PC_COMMAND)
 123   2                {
 124   3      
 125   3                                
 126   3                      case 0xa0:
 127   3                      
 128   3                                serial_out(0xa0);
 129   3                                P1 = mode2;      //按顺序连续分段录放音,每段语音长度不限  0xD0  连续寻址,A4
 130   3                                                        
 131   3                                PE = 0;
 132   3                                nop(10);
 133   3                                PE = 1;
 134   3                                
 135   3                                P1 = 0XFF;
 136   3      
 137   3                                break;
 138   3                                
 139   3                      case 0xb0:
 140   3                                serial_out(0xb0);
 141   3                                P1 = mode3;      //地址指针复位  0xC0
 142   3                                
 143   3                                nop(10);
 144   3                                P1 = 0XFF;
 145   3                                            
 146   3                                break;
 147   3                                
 148   3                      case 0xc0:                 //选段播放控制
 149   3                                serial_out(0xc0);
 150   3                                
 151   3                        
 152   3                                P1 = 0xD1;      //第二步:快速选段放音
 153   3      
 154   3      
 155   3                                P1_0 = 0;                       
 156   3                                nop(10);
 157   3                                P1_0 = 1;                       
 158   3                                nop(10);
 159   3                                
 160   3                                
 161   3                                PE = 0;
 162   3                                nop(10);
 163   3                                PE = 1;
 164   3      
 165   3                                
 166   3                                break;
 167   3                                
 168   3                      case 0xd0:
 169   3                                serial_out(0xd0);
 170   3                                paly(3);
 171   3                                paly(1);
 172   3                                paly(5);
 173   3                                paly(5);
 174   3                                paly(6);
 175   3                                paly(4);
 176   3                                paly(3);
 177   3                                paly(6);
 178   3                                paly(1);                        
 179   3      
C51 COMPILER V8.15   1420                                                                  02/21/2009 15:17:33 PAGE 4   

 180   3                
 181   3                                
 182   3                                break;
 183   3      
 184   3                      case 0x30:              
 185   3                                serial_out(0x30);
 186   3                                //此操作循环放音操作,按一下 PE 键可循环放音,按 PL 键停止;或按 PL 键放音,松开即停止
 187   3                                //此操作没什么用
 188   3                                P1 = mode1;
 189   3                                            
 190   3                                PE = 0;
 191   3                                nop(10);
 192   3                                PE = 1;
 193   3                                //
 194   3                                break;
 195   3                                                        
 196   3                      default: break;
 197   3                }
 198   2                      
 199   2                      ES = 1; 
 200   2              }
 201   1      }
 202          
 203          /*************************************************************
 204                    选段播放,i 的值就是要播放的当前段
 205                    i的取值:1 ~ ...
 206          **************************************************************/
 207          void paly(unsigned char i) 
 208          {
 209   1              i--;
 210   1      
 211   1              P1 = mode3;      //第一步:地址指针复位  0xC0             A7--A0: 1100 0000  (A2、A5在应用中可直接接地)               
             -  
 212   1              nop(10);
 213   1              //P1 = 0XFF;            
 214   1                      
 215   1              delay(30);//必要的延时
 216   1              
 217   1              if(i>0)
 218   1              {       
 219   2                      P1 = 0xD1;      //第二步:快速选段放音 0xD1     A7--A0: 1101 0001  (A2、A5在应用中可直接接地)
 220   2                      do
 221   2                      {               
 222   3                              P1_0 = 0;       //给 A0 低电平脉冲          
 223   3                              nop(10);
 224   3                              P1_0 = 1;                         
 225   3                              nop(10);
 226   3                                                
 227   3                              PE = 0;
 228   3                              nop(10);
 229   3                              PE = 1;
 230   3                              
 231   3                              delay(50);//这个延时是非常必要的!              
 232   3                              i--;
 233   3                      }
 234   2                      while(i!=0);                      
 235   2                      
 236   2                      delay(30);//必要的延时
 237   2              }
 238   1      
 239   1              
 240   1              P1 = mode2;     //第三步:播放当前段  0xD0        A7--A0: 1101 0000  (A2、A5在应用中可直接接地)
C51 COMPILER V8.15   1420                                                                  02/21/2009 15:17:33 PAGE 5   

 241   1              
 242   1              PE = 0;
 243   1              nop(10);
 244   1              PE = 1;                           
 245   1              //P1 = 0XFF;    
 246   1              
 247   1              while(REC_LED==1){;}//等待播放
 248   1              while(REC_LED==0){;}//等待播放结束
 249   1      
 250   1      }
 251          
 252          
 253          //----------------------------软件延时函数----------------------------
 254          //50ms延时
 255          void delay5ms(void)
 256          {
 257   1       unsigned char TempCyc = 250;
 258   1       while(TempCyc--);
 259   1      }
 260          
 261          void delay(unsigned int x)
 262          {
 263   1              do
 264   1              {
 265   2                      delay5ms();delay5ms();delay5ms();x--;
 266   2              }
 267   1              while(x!=0);
 268   1      }
 269          
 270          void nop(unsigned char i)
 271          {
 272   1              do
 273   1              {
 274   2                      _nop_();
 275   2                      i--;
 276   2              }
 277   1              while(i!=0);    
 278   1      }
 279          
 280          


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


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

⌨️ 快捷键说明

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