×
嵌入式 > 技术百科 > 详情

ISD4004语音程序

发布时间:2020-06-20 发布时间:
|
  1. ///////////ISD4004语音播放部分/////////////////////////////
  2.  
  3. ////当按下P3.5键时,从指定地址开始录音
  4.  
  5. /// 当按下P3.6键时,从指定地址开始放音
  6.  
  7. /// 当按下P3.7键时,停止当前的操作
  8.  
  9. /// 程序中的录放停部分已做成子函数,可以直接调用, 只需要输入录音的地址就行
  10.  
  11. // 录音地址的设定与芯片型号有关系,以ISD4004-16为例,ISD40044-16录音时间为16
  12.  
  13. // 分钟,即16*60=960S, 根据4004的资料,960秒可分为2400段,也就是1S的段数为
  14.  
  15. // 25段,即从,0000-0019H的内容为1S,
  16.  
  17. ///作者:长沙致望科技电子公司 WWW.CSMCU.COM
  18.  
  19. ///版本:V1.0(2008.12.1)
  20.  
  21. //实验使用注意,按录音键,要切换到放音时,可按停止再放音,也可以先按一下放音键,再按一次放音键,那可
  22.  
  23. //原因:本程序在放音前,没有做停止和下电处理,感兴趣的朋友可以直接到停止部分加到放音子函数中。
  24.  
  25. #include 
  26. #include 
  27. #define uchar unsigned char
  28. #define uint unsigned int
  29.  
  30. ////////定义放音命令,定义常量//////
  31.  
  32. #define ISDPOWERUP 0X20 //ISD4004上电
  33.  
  34. #define ISDSTOP 0X10 //ISD4004下电
  35.  
  36. #define OPERSTOP 0X30 //ISD4004停止当前操作
  37.  
  38. #define PLAYSET 0XE0 //ISD4004从指定地址开始放音
  39.  
  40. #define PLAYCUR 0XF0 //ISD4004从当前地址开始放音
  41.  
  42. #define RECSET 0XA0 //ISD4004从指定地址开始录音
  43.  
  44. #define RECCUR 0XB0 //ISD4004从当前地址开始录音
  45.  
  46.  
  47. sbit SS=P1^4; //LOW IS ACTIVELY
  48.  
  49. sbit MOSI=P1^5;
  50. //sbit MISO=P1^7;
  51.  
  52. sbit SCLK=P1^7; 
  53. sbit K1=P3^5;
  54. sbit K2=P3^6;
  55. sbit K3=P3^7;
  56. sbit INT = P3^2;
  57. sbit LED1=P1^0;
  58. sbit LED2=P1^3;
  59.  
  60. void delayms(uchar ms);
  61. uint addr;////全局变量//// 放音地址 
  62.  
  63. ////////////////放音部分子程序,放音地址由ADDR决定////
  64.  
  65. void play()
  66.     uint y;
  67.     SS=0;
  68.     MOSI=0;//发送开始
  69.  
  70.     SCLK=0;
  71.     for(y=0;y<8;y++)        //上电
  72.  
  73.     {
  74.      SCLK=0;
  75.      if((0x20>>y)&0x01)MOSI=1;
  76.      else MOSI=0;
  77.      _nop_();
  78.      _nop_();
  79.      _nop_();
  80.      SCLK=1;
  81.      _nop_();
  82.      _nop_();
  83.      _nop_();
  84.     }//发送结束
  85.  
  86.  
  87.     SS=1;//上电结束
  88.  
  89.     delayms(50);
  90.     SS=0;
  91.     MOSI=0;//发送地址
  92.  
  93.     SCLK=0;
  94.     for(y=0;y<16;y++)
  95.     {
  96.      SCLK=0;
  97.      if((addr>>y)&0x01)MOSI=1;
  98.      else MOSI=0;
  99.      _nop_();
  100.      _nop_();
  101.      _nop_();
  102.      SCLK=1;
  103.      _nop_();
  104.      _nop_();
  105.      _nop_();
  106.     }//发送地址结束
  107.  
  108.     MOSI=0;//放音
  109.  
  110.     SCLK=0;
  111.     for(y=0;y<8;y++)
  112.     {
  113.      SCLK=0;
  114.      if((0xe0>>y)&0x01)MOSI=1;
  115.      else MOSI=0;
  116.      _nop_();
  117.      _nop_();
  118.      _nop_();
  119.      SCLK=1;
  120.      _nop_();
  121.      _nop_();
  122.      _nop_();
  123.     }
  124.     SS=1;
  125.     SS=0;
  126.     MOSI=0;//放音
  127.  
  128.     SCLK=0;
  129.     for(y=0;y<8;y++)
  130.     {
  131.      SCLK=0;
  132.      if((0xf0>>y)&0x01)MOSI=1;
  133.      else MOSI=0;
  134.      _nop_();
  135.      _nop_();
  136.      _nop_();
  137.      SCLK=1;
  138.      _nop_();
  139.      _nop_();
  140.      _nop_();
  141.     }
  142.     SS=1; 
  143.  
  144. //////////////////////////lu音部分子程序,地址由ADDR决定/////////////////////////
  145.  
  146. void rec() 
  147.     { uint y; 
  148.     SS=0;
  149.     MOSI=0;//发送开始
  150.  
  151.     SCLK=0;
  152.     for(y=0;y<8;y++)
  153.     {
  154.      SCLK=0;
  155.      if((0x20>>y)&0x01)MOSI=1;
  156.      else MOSI=0;
  157.      _nop_();
  158.      _nop_();
  159.      _nop_();
  160.      SCLK=1;
  161.      _nop_();
  162.      _nop_();
  163.      _nop_();
  164.     }//发送结束
  165.  
  166.     SS=1;//上电结束
  167.  
  168.     delayms(50);
  169.     SS=0;
  170.     MOSI=0;//发送开始
  171.  
  172.     SCLK=0;
  173.     for(y=0;y<8;y++)
  174.     {
  175.      SCLK=0;
  176.      if((0x20>>y)&0x01)MOSI=1;
  177.      else MOSI=0;
  178.      _nop_();
  179.      _nop_();
  180.      _nop_();
  181.      SCLK=1;
  182.      _nop_();
  183.      _nop_();
  184.      _nop_();
  185.     }//发送结束
  186.  
  187.     SS=1;//上电结束
  188.  
  189.     delayms(50);
  190.     delayms(50);
  191.     SS=0;
  192.     MOSI=0;//发送地址
  193.  
  194.     SCLK=0;
  195.     for(y=0;y<16;y++)
  196.     {
  197.      SCLK=0;
  198.      if((addr>>y)&0x01)MOSI=1;
  199.      else MOSI=0;
  200.      _nop_();
  201.      _nop_();
  202.      _nop_();
  203.      SCLK=1;
  204.      _nop_();
  205.      _nop_();
  206.      _nop_();
  207.     }//发送地址结束
  208.  
  209.     MOSI=0;
  210.     SCLK=0;
  211.     for(y=0;y<8;y++)
  212.     {
  213.      SCLK=0;
  214.      if((0>>y)&0x01)MOSI=1;
  215.      else MOSI=0;
  216.      _nop_();
  217.      _nop_();
  218.      _nop_();
  219.      SCLK=1;
  220.      _nop_();
  221.      _nop_();
  222.      _nop_();
  223.     }
  224.     SS=1;
  225.     SS=0;
  226.     MOSI=0;
  227.     SCLK=0;
  228.     for(y=0;y<8;y++)
  229.     {
  230.      SCLK=0;
  231.      if((0xb0>>y)&0x01)MOSI=1;
  232.      else MOSI=0;
  233.      _nop_();
  234.      _nop_();
  235.      _nop_();
  236.      SCLK=1;
  237.      _nop_();
  238.      _nop_();
  239.      _nop_();
  240.     }
  241.     SS=1; 
  242. }
  243.  
  244. ////////////////////////////////////
  245.  
  246. ////////////////////////////////
  247.  
  248. void stop()
  249.     uchar y;
  250.     SS=1;
  251.     SS=0;
  252.     MOSI=0;//放音
  253.  
  254.     SCLK=0;
  255.     for(y=0;y<8;y++)
  256.     {
  257.      SCLK=0;
  258.      if((0x30>>y)&0x01)MOSI=1;
  259.      else MOSI=0;
  260.      _nop_();
  261.      _nop_();
  262.      _nop_();
  263.      SCLK=1;
  264.      _nop_();
  265.      _nop_();
  266.      _nop_();
  267.     }
  268.     SS=1;
  269. }
  270. ////////////////////////////////////
  271.  
  272. ////////////////////////////////////void press_key()
  273.  
  274. void delayms(uchar ms) 
  275. // 延时子程序
  276.  
  277.     uchar j;
  278.     while(ms--)
  279.     {
  280.      for(j = 0; j 
  281.     }
  282. }
  283. ////////////////////////////////
  284.  
  285.  
  286.    ////////////////////////////////////
  287.  
  288. void main()
  289.    P1=0xff;
  290.    P2=0XFF;
  291.    P3=0XFF;
  292.    while(1)
  293.     {
  294.         LED1 =INT;
  295.         LED2=0;
  296.         if(K1==0)
  297.         {        
  298.             delayms(10);
  299.              while(K1==0); ///松手判断
  300.  
  301.             
  302.             LED2=1;
  303.              addr=0X05;/////从0X05单元开始
  304.  
  305.              rec();
  306.             P1=0XFF;
  307.              while(K1==1); 
  308.  
  309.             delayms(10);
  310.              while(K1==0); ///松手判断
  311.  
  312.  
  313.         }
  314.          if(K2==0)
  315.         {
  316.  
  317.          delayms(10);
  318.          while(K2==0);                
  319.         
  320.          addr=0X05;
  321.          play();
  322.          P1=0XFF;
  323.         }
  324.  
  325.         if(K3==0)
  326.         {
  327.             delayms(10);
  328.              while(K3==0);
  329.              LED1=1; 
  330.              LED2=1;
  331.             stop();
  332.             P1=0XFF;
  333.          }
  334.      }
  335.  
  336. }


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil5(MDK5)在调试(debug)过程中遇到的问题