找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13868|回复: 9
收起左侧

isd4004语音模块单片机源程序与电路原理图等资料

  [复制链接]
ID:221028 发表于 2017-12-24 17:08 | 显示全部楼层 |阅读模式
isd4004语音模块全部资料,分享一下,共同学习
0.png
ISD4004模块和控制板的接线方法:
ISD4004模块   51单片机系统板
VCC           VCC
GND           GND
SS            P1.0
MOSI          P1.1
MISO          P1.2
SCLK          P1.3
IN            P1.4
RAC           P1.5
LED           P1.6

isd4004模块电路图

isd4004模块电路图


单片机源程序如下(1.录25段,可重复查询地址):
  1. /*   忠兴编辑
  2. 经过长时间的调试,本程序已经通过验证?
  3.   请亲们方向使用。
  4. */
  5. /*====================================================================
  6.   调试要求:
  7.   1.MCU:AT89S52芯片
  8.   2.晶振:12MHz
  9.   使用说明:
  10.   AN(本店的控制板上该按键标号为UP)为放音键
  11.   SET_KEY(本店控制板上标号为SET)为录音键。
  12.   开机时只允许录音键使用,放音键不能使用。
  13.   允许放音后,录音键就失效。
  14.   录音操作:按住SET键就进入录音模式,放开就停止录音
  15.             再按就再进入录音模式,如此循环操作,将所
  16.             有的语言分段一次性录完。本程序最多录25段,
  17.              25段的时间不超过芯片的总时间
  18.   放音操作:录好因后,在不断电或不复位单片机的情况下
  19.              按AN键就放音,每按一次放一段。
  20.   录放音时操作时,1602会将该段语音的开始和结束地址进行显示。
  21. 本程序的功能就在这里,可以清晰的知道每段语音的起始地址,
  22. 并且在不断电或不复位单片机的情况下可进行循环查询地址。
  23. 4004系列语音的地址很不好找,相信有些亲们应该深有体会,
  24. 本人从网上找了很多通过ISP通信读取地址的程序经过验证都失败了,
  25. 可是很多时候又需要知道录音的地址,经过思考,终于想出了自己的方法
  26. 来知道录音地址。下面介绍一下。
  27. 本程序计算地址的原理:(以ISD4004-8为例进行介绍)
  28. 4004-08的录音时间是8分钟,也就是480秒
  29. 4004-08的开始地址是A0,结束地址是A15,这样共有A15-A0=2421个地址
  30. 约等于2400个地址,也就是说时间480秒,地址是2400个,根据这个推论:
  31. 录音1秒,就走了2400/480=5个地址,本程序的编程原理就是由录音的时间
  32. 来推算语音的起始地址和结束地址,经过验证,这样的编程原理是可行的。
  33. 本程序只适合知道自己录音的起始和结束地址,
  34. 对芯片原有的语音地址的查找不适合。
  35. 主意:录音时,按下录音键要等录音指示灯亮了才开始录音
  36. 录音完后松开录音键显示的地址才是本段语音的地址
  37. 放音时,要等本段语音播放完后显示的地址才是本段的地址0
  38. ====================================================================*/
  39. #include <reg52.h>
  40. #include <intrins.h>
  41. #define uchar unsigned char
  42. #define uint  unsigned int
  43. //录音和放音键IO口定义:
  44. sbit   AN=P2^6;//放音键控制接口
  45. sbit    set_key=P2^7;//录音键控制口
  46. // ISD4004控制口定义:
  47. sbit SS  =P1^0;         //4004片选
  48. sbit MOSI=P1^1;         //4004数据输入
  49. sbit MISO=P1^2;         //4004数据输出
  50. sbit SCLK=P1^3;         //ISD4004时钟
  51. sbit INT =P1^4;         //4004中断
  52. sbit STOP=P3^4;                //4004复位
  53. sbit LED1 =P1^6;        //录音指示灯
  54. //===============================LCD1602接口定义=====================
  55. /*注意,P2.2到P2.4需要接上拉电阻
  56.     ---------------------------------------------------
  57. =============================================================*/
  58. #define LCM_Data     P0    //LCD1602数据接口
  59. sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚
  60. sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚
  61. sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚
  62. //***************函数声明************************************************
  63. void    WriteDataLCM(uchar WDLCM);//LCD模块写数据
  64. void    WriteCommandLCM(uchar WCLCM,BuysC); //LCD模块写指令
  65. uchar   ReadStatusLCM(void);//读LCD模块的忙标
  66. void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
  67. void    LCMInit(void);
  68. void    DelayUs(uint us); //微妙延时程序
  69. void    DelayMs(uint Ms);//毫秒延时程序
  70. void    init_t0();//定时器0初始化函数
  71. void    setkey_treat(void);//录音键处理程序
  72. void    upkey_treat(void);//播放键处理程序
  73. void    display();//显示处理程序
  74. void    isd_setrec(uchar adl,uchar adh);//发送setrec指令
  75. void    isd_rec();//发送rec指令
  76. void    isd_stop();//stop指令(停止当前操作)
  77. void    isd_powerup();//发送上电指令
  78. void    isd_stopwrdn();//发送掉电指令
  79. void    isd_send(uchar isdx);//spi串行发送子程序,8位数据
  80. void    isd_setplay(uchar adl,uchar adh);
  81. void    isd_play();
  82. //程序中的一些常量定义
  83. uint    time_total,st_add,end_add=0;
  84. uint    adds[25];//25段语音的起始地址暂存
  85. uint    adde[25];//25段语音的结束地址暂时
  86. uchar   t0_crycle,count,count_flag,flag2,flag3,flag4;
  87. uchar   second_count=170,msecond_count=0;
  88. //second_count为芯片录音的起始地址,起始地址本来是A0,也就是160,
  89. //我们从170开始录音吧。
  90. #define Busy         0x80   //用于检测LCM状态字中的Busy标识

  91. /*===========================================================================
  92. 主程序
  93. =============================================================================*/
  94. void main(void)
  95. {
  96.    LED1=0;//灭录音指示灯
  97.    flag3=0;
  98.    flag4=0;
  99.    time_total=340;//录音地址从170开始,对应的单片机开始计时的时间就是340*0.1秒
  100.    adds[0]=170;
  101.    count=0;
  102.    LCMInit();             //1602初始化
  103.    init_t0();//定时器初始化
  104.    DisplayOneChar( 0,5,'I'); //开机时显示000  ISD4004-X
  105.    DisplayOneChar( 0,6,'S');
  106.    DisplayOneChar( 0,7,'D');
  107.    DisplayOneChar( 0,8,'4');
  108.    DisplayOneChar( 0,9,'0');
  109.    DisplayOneChar( 0,10,'0');
  110.    DisplayOneChar( 0,11,'4');
  111.    DisplayOneChar( 0,12,'-');
  112.    DisplayOneChar( 0,13,'X');
  113.    while(1)
  114.    {
  115.       display();//显示处理
  116.           upkey_treat();//放音键处理
  117.       setkey_treat();//录音键处理
  118.    }
  119. }
  120. //*******************************************
  121. //录音键处理程序
  122. //从指定地址开始录音的程序就是在这段里面
  123. void setkey_treat(void)
  124. {
  125.    set_key=1;//置IO口为1,准备读入数据
  126.    DelayUs(1);
  127.    if(set_key==0)
  128.    {
  129.       if(flag3==0)//录音键和放音键互锁,录音好后,禁止再次录音。如果要再次录音,那就要复位单片机,重新开始录音
  130.       {
  131.         if(count==0)//判断是否为上电或复位以来第一次按录音键
  132.         {
  133.            st_add=170;
  134.         }
  135.         else
  136.         {
  137.           st_add=end_add+3;
  138.         }//每段语言间隔3个地址
  139.         adds[count]=st_add;//每段语音的起始地址暂时
  140.         if(count>=25)//判断语音段数时候超过25段,因为单片机内存的关系?
  141.        //本程序只录音25段,如果要录更多的语音,改为不可查询的即可
  142.         {//如果超过25段,则覆盖之前的语音,从新开始录音
  143.            count=0;
  144.            st_add=170;
  145.            time_total=340;
  146.         }
  147.         isd_powerup(); //AN键按下,ISD上电并延迟50ms
  148.                 isd_stopwrdn();
  149.                 isd_powerup();
  150.         LED1=1;//录音指示灯亮,表示录音模式
  151.             isd_setrec(st_add&0x00ff,st_add>>8); //从指定的地址
  152.         if(INT==1)// 判定芯片有没有溢出
  153.         {               
  154.             isd_rec(); //发送录音指令
  155.         }
  156.         time_total=st_add*2;//计时初始值计算
  157.         TR0=1;//开计时器
  158.         while(set_key==0);//等待本次录音结束
  159.         TR0=0;//录音结束后停止计时
  160.         isd_stop(); //发送4004停止命令
  161.         end_add=time_total/2+2;//计算语音的结束地址
  162.         adde[count]=end_add;//本段语音结束地址暂存
  163.         LED1=0; //录音完毕,LED熄灭
  164.         count++;//录音段数自加
  165.         count_flag=count;//录音段数寄存
  166.         flag2=1;
  167.         flag4=1;//解锁放音键
  168.       }
  169.   }
  170. }
  171. //=================================================
  172. //放音机处理程序
  173. //从指定地址开始放本段语音就是这段程序
  174. void upkey_treat(void)
  175. {
  176.    uchar ovflog;
  177.    AN=1;//准备读入数据
  178.    DelayUs(1);
  179.    if(AN==0)//判断放音键是否动作
  180.    {
  181.      if(flag4==1)//互锁录音键
  182.      {
  183.         if(flag2==1)//判断是否为录音好后的第一次放音
  184.         {
  185.            count=0;//从第0段开始播放
  186.         }
  187.         isd_powerup(); //AN键按下,ISD上电并延迟50ms
  188.                 isd_stopwrdn();
  189.                 isd_powerup();
  190.         st_add=adds[count];//送当前语音的起始地址
  191.                 isd_setplay(st_add&0x00ff,st_add>>8); //发送setplay指令,从指定地址开始放音
  192.                 isd_play(); //发送放音指令
  193.                 DelayUs(20);
  194.                 while(INT==1); //等待放音完毕的EOM中断信号
  195.                 isd_stop(); //放音完毕,发送stop指令
  196.                 while(AN==0); //
  197.                 isd_stop();
  198.         count++;//语音段数自加
  199.         flag2=0;
  200.         flag3=1;
  201.         if(count>=count_flag)//如果播放到最后一段后还按加键,则从第一段重新播放
  202.         {
  203.              count=0;
  204.         }
  205.      
  206.       }
  207.    }
  208. }
  209. //************************************************?
  210. //发送rec指令
  211. void isd_rec()
  212. {
  213.         isd_send(0xb0);
  214.         SS=1;
  215. }
  216. //****************************************
  217. //发送setrec指令
  218. void isd_setrec(unsigned char adl,unsigned char adh)
  219. {
  220.         DelayMs(1);
  221.         isd_send(adl); //发送放音起始地址低位
  222.         DelayUs(2);
  223.         isd_send(adh); //发送放音起始地址高位
  224.         DelayUs(2);
  225.         isd_send(0xa0); //发送setplay指令字节
  226.         SS=1;
  227. }
  228. //=============================================================================
  229. //**********************************************
  230. //定时器0中断程序
  231. void timer0() interrupt 1
  232. {
  233.         TH0=(65536-50000)/256;
  234.         TL0=(65536-50000)%256;
  235.         t0_crycle++;
  236.         if(t0_crycle==2)// 0.1秒
  237.         {
  238.           t0_crycle=0;
  239.       time_total++;
  240.           msecond_count++;
  241.       if(msecond_count==10)//1秒
  242.       {
  243.         msecond_count=0;
  244.         second_count++;
  245.         if(second_count==60)
  246.         {
  247.           second_count=0;
  248.         }
  249.       }
  250.       if(time_total==4800)time_total=0;   
  251.         }
  252. }
  253. //********************************************************************************************
  254. //定时器0初始化函数
  255. void init_t0()
  256. {
  257.            TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒
  258.         TH0=(65536-50000)/256;
  259.         TL0=(65536-50000)%256;
  260.         EA=1;//开总中断
  261.         ET0=1;//允许定时器0中断
  262.         t0_crycle=0;//定时器中断次数计数单元
  263. }
  264. //******************************************
  265. //显示处理程序
  266. void display()
  267. {
  268.         uchar x;
  269.         if(flag3==1||flag4==1)//判断是否有录音过或者放音过
  270.         {
  271.           x=count-1;
  272.           if(x==255){x=count_flag-1;}
  273.         }
  274.         DisplayOneChar( 0,0,x/100+0x30);    //显示当前语音是第几段
  275.         DisplayOneChar( 0,1,x/10%10+0x30);
  276.         DisplayOneChar( 0,2,x%10+0x30);
  277.         if(flag3==0)//录音时显示本段语音的起始和结束地址
  278.         {
  279.            DisplayOneChar( 1,0,st_add/1000+0x30);//计算并显示千位         
  280.            DisplayOneChar( 1,1,st_add/100%10+0x30);
  281.            DisplayOneChar( 1,2,st_add/10%10+0x30);
  282.            DisplayOneChar( 1,3,st_add%10+0x30);
  283.            DisplayOneChar( 1,4,'-');
  284.            DisplayOneChar( 1,5,'-');
  285.            DisplayOneChar( 1,6,end_add/1000+0x30);         
  286.            DisplayOneChar( 1,7,end_add/100%10+0x30);
  287.            DisplayOneChar( 1,8,end_add/10%10+0x30);
  288.            DisplayOneChar( 1,9,end_add%10+0x30);
  289.         }
  290.         if(flag4==1)//放音时显示本段语音的起始和结束地址
  291.         {
  292.            DisplayOneChar( 1,0,adds[x]/1000+0x30);         
  293.            DisplayOneChar( 1,1,adds[x]/100%10+0x30);
  294.            DisplayOneChar( 1,2,adds[x]/10%10+0x30);
  295.            DisplayOneChar( 1,3,adds[x]%10+0x30);
  296.            DisplayOneChar( 1,4,'-');
  297.            DisplayOneChar( 1,5,'-');
  298.            DisplayOneChar( 1,6,adde[x]/1000+0x30);         
  299.            DisplayOneChar( 1,7,adde[x]/100%10+0x30);
  300.            DisplayOneChar( 1,8,adde[x]/10%10+0x30);
  301.            DisplayOneChar( 1,9,adde[x]%10+0x30);
  302.         }
  303. }
  304. //======================================================================
  305. // LCM初始化
  306. //======================================================================
  307. void LCMInit(void)
  308. {
  309. LCM_Data = 0;
  310. WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
  311. DelayMs(5);
  312. WriteCommandLCM(0x38,0);
  313. DelayMs(5);
  314. WriteCommandLCM(0x38,0);
  315. DelayMs(5);
  316. WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
  317. WriteCommandLCM(0x08,1); //关闭显示
  318. WriteCommandLCM(0x01,1); //显示清屏
  319. WriteCommandLCM(0x06,1); // 显示光标移动设置
  320. WriteCommandLCM(0x0C,1); // 显示开及光标设置
  321. DelayMs(100);
  322. }
  323. //*=====================================================================
  324. // 写数据函数: E =高脉冲 RS=1 RW=0
  325. //======================================================================
  326. void WriteDataLCM(uchar WDLCM)
  327. {
  328. ReadStatusLCM(); //检测忙
  329. LCM_Data = WDLCM;
  330. LCM_RS = 1;
  331. LCM_RW = 0;
  332. LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  333. LCM_E = 0; //延时
  334. LCM_E = 1;
  335. }
  336. //*====================================================================
  337. // 写指令函数: E=高脉冲 RS=0 RW=0
  338. //======================================================================
  339. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  340. {
  341. if (BuysC) ReadStatusLCM(); //根据需要检测忙
  342. LCM_Data = WCLCM;
  343. LCM_RS = 0;
  344. LCM_RW = 0;
  345. LCM_E = 0;
  346. LCM_E = 0;
  347. LCM_E = 1;
  348. }
  349. //*====================================================================
  350. //  正常读写操作之前必须检测LCD控制器状态:E=1 RS=0 RW=1;
  351. //  DB7: 0 LCD控制器空闲,1 LCD控制器忙。
  352. // 读状态
  353. //======================================================================
  354. unsigned char ReadStatusLCM(void)
  355. {
  356. LCM_Data = 0xFF;
  357. LCM_RS = 0;
  358. LCM_RW = 1;
  359. LCM_E = 0;
  360. LCM_E = 0;
  361. LCM_E = 1;
  362. while (LCM_Data & Busy); //检测忙信号  
  363. return(LCM_Data);
  364. }
  365. //======================================================================
  366. //功 能:     在1602 指定位置显示一个字符:第一行位置0~15,第二行16~31
  367. //说 明:     第 X 行,第 y 列  注意:字符串不能长于16个字符
  368. //======================================================================
  369. void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char ASCII)
  370. {
  371. X &= 0x1;
  372. Y &= 0xF; //限制Y不能大于15,X不能大于1
  373. if (X) Y |= 0x40; //当要显示第二行时地址码+0x40;
  374. Y |= 0x80; // 算出指令码
  375. WriteCommandLCM(Y, 0); //这里不检测忙信号,发送地址码
  376. WriteDataLCM(ASCII);
  377. }
  378. //======================================================================
  379. //spi串行发送子程序,8位数据
  380. void isd_send(uchar isdx)
  381. {
  382.         uchar isx_counter;
  383.         SS=0;//ss=0,打开spi通信端
  384.         SCLK=0;
  385.         for(isx_counter=0;isx_counter<8;isx_counter++)//先发低位再发高位,依次发送。
  386.         {
  387.                 if((isdx&0x01)==1)
  388.                         MOSI=1;
  389.                 else
  390.                         MOSI=0;
  391.                         isdx=isdx>>1;
  392.                         SCLK=1;
  393.                         DelayUs(2);
  394.                         SCLK=0;
  395.                         DelayUs(2);
  396.         }
  397. }
  398. //======================================================================
  399. //stop指令(停止当前操作)
  400. void isd_stop()//
  401. {
  402.         DelayUs(10);
  403.         isd_send(0x30);
  404.         SS=1;
  405.         DelayMs(50);
  406. }
  407. //======================================================================
  408. //发送上电指令
  409. void isd_powerup()//
  410. {
  411. ……………………

  412. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

2无限段录音程序,不可查询,单片机源程序如下:
  1. /*   忠兴店编辑
  2. 经过长时间的调试,本程序已经通过验证?
  3.   请亲们方向使用。
  4. */
  5. /*====================================================================
  6.   调试要求:
  7.   1.MCU:AT89S52芯片
  8.   2.晶振:12MHz
  9.   使用说明:
  10.   SET_KEY(本店控制板上标号为SET)为录音键。
  11.   录音操作:按住SET键就进入录音模式,放开就停止录音
  12.             再按就再进入录音模式,如此循环操作,将所
  13.             有的语言分段一次性录完。
  14.   录音时操作时,1602会将该段语音的开始和结束地址进行显示。
  15. 主意:录音时,按下录音键要等录音指示灯亮了才开始录音
  16. 录音完后松开录音键显示的地址才是本段语音的地址,本程序可以录255段,
  17. 但是总时间不能超过8分钟,因为本程序不可查询语言的地址,所有每录
  18. 一段语言就用笔手动记下起始和结束地址。
  19. ====================================================================*/
  20. #include <reg52.h>
  21. #include <intrins.h>
  22. #define uchar unsigned char
  23. #define uint  unsigned int
  24. //录音键IO口定义:
  25. sbit    set_key=P2^7;//录音键控制口
  26. // ISD4004控制口定义:
  27. sbit SS  =P1^0;         //4004片选
  28. sbit MOSI=P1^1;         //4004数据输入
  29. sbit MISO=P1^2;         //4004数据输出
  30. sbit SCLK=P1^3;         //ISD4004时钟
  31. sbit INT =P1^4;         //4004中断
  32. sbit STOP=P3^4;                //4004复位
  33. sbit LED1 =P1^5;        //录音指示灯
  34. //===============================LCD1602接口定义=====================
  35. /* 注意,P2.2到P2.4需要接上拉电阻
  36.     ---------------------------------------------------
  37. =============================================================*/
  38. #define LCM_Data     P0    //LCD1602数据接口
  39. sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚
  40. sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚
  41. sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚
  42. //***************函数声明************************************************
  43. void    WriteDataLCM(uchar WDLCM);//LCD模块写数据
  44. void    WriteCommandLCM(uchar WCLCM,BuysC); //LCD模块写指令
  45. uchar   ReadStatusLCM(void);//读LCD模块的忙标
  46. void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
  47. void    LCMInit(void);
  48. void    DelayUs(uint us); //微妙延时程序
  49. void    DelayMs(uint Ms);//毫秒延时程序
  50. void    init_t0();//定时器0初始化函数
  51. void    setkey_treat(void);//录音键处理程序
  52. void    display();//显示处理程序
  53. void    isd_setrec(uchar adl,uchar adh);//发送setrec指令
  54. void    isd_rec();//发送rec指令
  55. void    isd_stop();//stop指令(停止当前操作)
  56. void    isd_powerup();//发送上电指令
  57. void    isd_stopwrdn();//发送掉电指令
  58. void    isd_send(uchar isdx);//spi串行发送子程序,8位数据
  59. //程序中的一些常量定义
  60. uint    time_total,st_add,end_add=0;
  61. uchar   t0_crycle,count;
  62. uchar   second_count=170,msecond_count=0;
  63. //second_count为芯片录音的起始地址,起始地址本来是A0,也就是160,
  64. //我们从170开始录音吧。
  65. #define Busy         0x80   //用于检测LCM状态字中的Busy标识

  66. /*===========================================================================
  67. 主程序
  68. =============================================================================*/
  69. void main(void)
  70. {
  71.    LED1=0;//灭录音指示灯
  72.    time_total=340;//录音地址从170开始,对应的单片机开始计时的时间就是340*0.1秒
  73.    count=0;
  74.    LCMInit();             //1602初始化
  75.    init_t0();//定时器初始化
  76.    DisplayOneChar( 0,5,'I'); //开机时显示000  ISD4004-X
  77.    DisplayOneChar( 0,6,'S');
  78.    DisplayOneChar( 0,7,'D');
  79.    DisplayOneChar( 0,8,'4');
  80.    DisplayOneChar( 0,9,'0');
  81.    DisplayOneChar( 0,10,'0');
  82.    DisplayOneChar( 0,11,'4');
  83.    DisplayOneChar( 0,12,'-');
  84.    DisplayOneChar( 0,13,'X');
  85.    while(1)
  86.    {
  87.       display();//显示处理
  88.           setkey_treat();//录音键处理
  89.    }
  90. }
  91. //*******************************************
  92. //录音键处理程序
  93. //从指定地址开始录音的程序就是在这段里面
  94. void setkey_treat(void)
  95. {
  96.    set_key=1;//置IO口为1,准备读入数据
  97.    DelayUs(1);
  98.    if(set_key==0)
  99.    {
  100.         if(count==0)//判断是否为上电或复位以来第一次按录音键
  101.         {
  102.            st_add=170;
  103.         }
  104.         else
  105.         {
  106.           st_add=end_add+3;
  107.         }//每段语言间隔3个地址
  108.         isd_powerup(); //AN键按下,ISD上电并延迟50ms
  109.                 isd_stopwrdn();
  110.                 isd_powerup();
  111.         LED1=1;//录音指示灯亮,表示录音模式
  112.             isd_setrec(st_add&0x00ff,st_add>>8); //从指定的地址
  113.         if(INT==1)// 判定芯片有没有溢出
  114.         {               
  115.             isd_rec(); //发送录音指令
  116.         }
  117.         time_total=st_add*2;//计时初始值计算
  118.         TR0=1;//开计时器
  119.         while(set_key==0);//等待本次录音结束
  120.         TR0=0;//录音结束后停止计时
  121.         isd_stop(); //发送4004停止命令
  122.         end_add=time_total/2+2;//计算语音的结束地址
  123.         LED1=0; //录音完毕,LED熄灭
  124.         count++;//录音段数自加
  125.   }
  126. }

  127. //************************************************?
  128. //发送rec指令
  129. void isd_rec()
  130. {
  131.         isd_send(0xb0);
  132.         SS=1;
  133. }
  134. //****************************************
  135. //发送setrec指令

  136. ……………………

  137. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
ISD4004配套资料.rar (373.19 KB, 下载次数: 212)

评分

参与人数 2黑币 +105 收起 理由
啧啧啧啧啧啧啧 + 5 很给力!
admin + 100 赞一个!

查看全部评分

回复

使用道具 举报

ID:315029 发表于 2018-4-24 12:48 | 显示全部楼层
很厉害 谢谢大神!
回复

使用道具 举报

ID:436487 发表于 2018-11-30 13:39 | 显示全部楼层
超级好,谢谢大神
回复

使用道具 举报

ID:413541 发表于 2018-11-30 19:10 | 显示全部楼层
早点发就好了,前端时间我做得实践作业就是这个
回复

使用道具 举报

ID:413541 发表于 2018-11-30 19:14 | 显示全部楼层
谢谢大神
回复

使用道具 举报

ID:427609 发表于 2019-4-9 23:44 | 显示全部楼层
好东西参考一下
回复

使用道具 举报

ID:581141 发表于 2019-10-4 14:27 | 显示全部楼层
你好呀,我之前没有接触过这些,想请问一下这个芯片可以通过连接单片机之类的操作,将录音的音频发送出去吗?我们是想对录入的音频再进一步处理,或者有什么推荐的板子吗?谢谢了!
回复

使用道具 举报

ID:649767 发表于 2019-11-26 11:16 | 显示全部楼层
请问可以发给我吗
回复

使用道具 举报

ID:712282 发表于 2020-3-20 15:02 | 显示全部楼层
看着不错的样子
回复

使用道具 举报

ID:848415 发表于 2020-11-29 09:28 | 显示全部楼层
已经下载了资料,学习一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表