久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15191|回復: 10
打印 上一主題 下一主題
收起左側

isd4004語音模塊單片機源程序與電路原理圖等資料

  [復制鏈接]
跳轉到指定樓層
樓主
isd4004語音模塊全部資料,分享一下,共同學習

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


單片機源程序如下(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 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:315029 發表于 2018-4-24 12:48 | 只看該作者
很厲害 謝謝大神!
回復

使用道具 舉報

板凳
ID:436487 發表于 2018-11-30 13:39 | 只看該作者
超級好,謝謝大神
回復

使用道具 舉報

地板
ID:413541 發表于 2018-11-30 19:10 | 只看該作者
早點發就好了,前端時間我做得實踐作業就是這個
回復

使用道具 舉報

5#
ID:413541 發表于 2018-11-30 19:14 | 只看該作者
謝謝大神
回復

使用道具 舉報

6#
ID:427609 發表于 2019-4-9 23:44 | 只看該作者
好東西參考一下
回復

使用道具 舉報

7#
ID:581141 發表于 2019-10-4 14:27 | 只看該作者
你好呀,我之前沒有接觸過這些,想請問一下這個芯片可以通過連接單片機之類的操作,將錄音的音頻發送出去嗎?我們是想對錄入的音頻再進一步處理,或者有什么推薦的板子嗎?謝謝了!
回復

使用道具 舉報

8#
ID:649767 發表于 2019-11-26 11:16 | 只看該作者
請問可以發給我嗎
回復

使用道具 舉報

9#
ID:712282 發表于 2020-3-20 15:02 | 只看該作者
看著不錯的樣子
回復

使用道具 舉報

10#
ID:848415 發表于 2020-11-29 09:28 | 只看該作者
已經下載了資料,學習一下。
回復

使用道具 舉報

11#
ID:1144203 發表于 2025-3-9 23:51 | 只看該作者
你好,請問你用的是什么型號的喇叭和咪頭?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久久无码国产精品 | 日韩一区欧美一区 | 国产精品久久久久久久久久久久久 | 国产精品污污视频 | 在线日韩视频 | 国产一区二区三区在线视频 | 国产精品一区二区日韩 | 国产91观看 | 在线播放一区二区三区 | 久久精品一区二区三区四区 | 国产在线观看福利 | 欧美精品首页 | 国产乱码精品一区二区三区忘忧草 | 亚洲激情综合 | 久久久国产一区二区三区 | 久久精品视频在线观看 | 一级视频在线免费观看 | 国产999精品久久久 精品三级在线观看 | 国产不卡在线观看 | 国产精品福利视频 | 久久99精品久久久久久 | 日韩午夜一区二区三区 | 日韩精品一区二区三区中文在线 | 久久久久久999| h网站在线观看 | 亚洲国产欧美91 | 一级少妇女片 | 91麻豆精品一区二区三区 | 中文字幕免费在线 | 久久电影一区 | 日本精品视频一区二区三区四区 | 国产草草视频 | 亚洲色视频| 欧美日韩精品一区二区天天拍 | 精品国产18久久久久久二百 | 免费在线性爱视频 | 中文字幕一区二区三区四区五区 | 综合另类 | 日本中出视频 | 999热在线视频 | 在线免费观看黄色 |