找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5785|回復(fù): 2
收起左側(cè)

基于ISD4002與單片機(jī)的錄音筆設(shè)計(jì)程序與原理圖

[復(fù)制鏈接]
ID:244863 發(fā)表于 2017-11-25 21:34 | 顯示全部樓層 |閱讀模式
這個(gè)isd4002沒(méi)法仿真只有原理圖和程序,是別人弄得課程設(shè)計(jì),感覺(jué)高大上就發(fā)上來(lái)了

如果開(kāi)關(guān)選在VCC,為錄音狀態(tài)
如果開(kāi)關(guān)選在GND,為放音狀態(tài)
Altium Designer畫(huà)的原理圖如下:(51hei附件中可下載工程文件)
0.png

單片機(jī)源程序如下:
  1. //*****************************************************
  2. // ISD4002-STC89C52開(kāi)發(fā)板演示例程 C51版本 *
  3. //*****************************************************

  4. #include <reg52.h>

  5. sbit SS      = P1^0; //片選
  6. sbit SCLK    = P1^3; //ISD4003時(shí)鐘
  7. sbit MOSI    = P1^1; //數(shù)據(jù)輸入
  8. sbit MISO    = P1^2; //數(shù)據(jù)輸出
  9. sbit LED     = P1^7; //指示燈
  10. sbit ISD_INT = P3^3; //中斷
  11. sbit AN      = P1^6; //執(zhí)行
  12. sbit STOP    = P1^5; //復(fù)位
  13. sbit PR      = P1^4; //PR=1錄音  PR=0放音

  14. void delay(unsigned int time) //延遲n微秒
  15. {
  16.         while(time!=0)
  17.         {
  18.                 time-- ;
  19.         }
  20. }
  21. void delayms(unsigned int time) //延遲n毫秒
  22. {         
  23.         TMOD=0x01;
  24.         for(time;time>0;time--)
  25.         {
  26.                 TH0=0xfc;
  27.                 TL0=0x18;
  28.                 TR0=1;
  29.                 while(TF0!=1)
  30.                 {;}
  31.                 TF0=0;
  32.                 TR0=0;
  33.         }

  34. }
  35. //************************************
  36. //ISD4002 spi串行發(fā)送子程序,8位數(shù)據(jù)
  37. //************************************
  38. void spi_send(unsigned char isdx)
  39. {         
  40.         unsigned char isx_counter;
  41.         SS=0; //ss=0,打開(kāi)spi通信端
  42.         SCLK=0;
  43.         for(isx_counter=0;isx_counter<8;isx_counter++) //先發(fā)低位再發(fā)高位,依次發(fā)送。
  44.         {         
  45.                 if ((isdx&0x01)==1)
  46.                                         MOSI=1;
  47.                 else
  48.                                         MOSI=0;
  49.                 isdx=isdx>>1;
  50.                 SCLK=1;
  51.                 delay(2);
  52.                 SCLK=0;
  53.                 delay(2);
  54.         }
  55. }

  56. //*******************************
  57. //發(fā)送stop指令
  58. //*******************************
  59. void isd_stop(void)
  60. {         
  61.         delay(10);
  62.         spi_send(0x30);
  63.         SS=1;
  64.         delayms(50);
  65. }

  66. //*******************************
  67. //發(fā)送上電指令,并延遲50ms
  68. //*******************************
  69. void isd_pu(void)
  70. {
  71.         delay(10);
  72.         SS=0;
  73.         spi_send(0x20);
  74.         SS=1;
  75.         delayms(50);
  76. }


  77. //*******************************

  78. //********發(fā)送掉電指令,并延遲50ms
  79. void isd_pd(void)
  80. {
  81.         delay(10);
  82.         spi_send(0x10);
  83.         SS=1;
  84.         delayms(50);
  85. }

  86. //*******************************
  87. //發(fā)送play指令
  88. //*******************************
  89. void isd_play(void)
  90. {
  91.         LED=0;
  92.         spi_send(0xf0);
  93.         SS=1;
  94. }

  95. //*******************************
  96. //發(fā)送rec指令
  97. //*******************************
  98. void isd_rec(void)
  99. {
  100.         LED=0;
  101.         spi_send(0xb0);
  102.         SS=1;
  103. }

  104. //*******************************
  105. //發(fā)送setplay指令
  106. //*******************************
  107. void isd_setplay(unsigned char adl,unsigned char adh)           
  108. {        
  109.         spi_send(adl); //發(fā)送放音起始地址低位
  110.         adh=adh|0xe0;
  111.         spi_send(adh); //發(fā)送放音起始地址高位
  112.         SS=1;
  113. }
  114. //*******************************
  115. //發(fā)送setrec指令
  116. void isd_setrec(unsigned char adl,unsigned char adh)
  117. {
  118.         spi_send(adl); //發(fā)送放音起始地址低位
  119.         adh=adh|0xa0;
  120.         spi_send(adh); //發(fā)送放音起始地址高位
  121.         SS=1;
  122. }

  123. //************************************
  124. //芯片溢出,LED閃爍提醒停止錄音
  125. //************************************
  126. void isd_overflow(void)
  127. {
  128.         while(AN==0)
  129.         {
  130.                 LED=1;
  131.                 delayms(300);
  132.                 LED=0;
  133.                 delayms(300);
  134.         }
  135. }

  136. //************************************
  137. //檢查芯片是否溢出(讀OVF,并返回OVF值)
  138. //************************************
  139. unsigned char chk_isdovf(void)
  140. {
  141.         SS=0;
  142.         delay(2);
  143.         SCLK=0;
  144.         delay(2);
  145.         SCLK=1;
  146.         SCLK=0;
  147.         delay(2);

  148.         if (MISO==1)
  149.         {
  150.                 SCLK=0;
  151.                 SS =1; //關(guān)閉spi通信端
  152.                 isd_stop(); //發(fā)送stop指令
  153.                 return 1; //OVF為1,返回1
  154.         }
  155.         else
  156.         {
  157.                 SCLK=0;
  158.                 SS =1; //關(guān)閉spi通信端
  159.                 isd_stop(); //發(fā)送stop指令
  160.                 return 0; //OVF為0,返回0
  161.         }
  162. }
  163. //************************************************************************
  164. //主程序
  165. //功能:1.錄音時(shí),按住AN鍵,LED點(diǎn)亮開(kāi)始錄音,松開(kāi)AN即可停止錄音
  166. // 再次按下AN鍵,LED點(diǎn)亮開(kāi)始錄第二段音,依次類(lèi)推,直到芯片溢出。
  167. // 按stop鍵芯片復(fù)位
  168. // 2.放音時(shí),按一下AN鍵,即播放一段語(yǔ)音。 按stop鍵芯片復(fù)位。
  169. //************************************************************************
  170. void main(void)
  171. {        
  172.         unsigned char ovflog;
  173.         while(1)
  174.         {
  175.                 P0=P1=P2=P3=0xff; //初始化
  176.                 while (AN==1)                 //等待AN鍵按下
  177.                         {
  178.                                 if (AN==0)                 //按鍵防抖動(dòng)
  179.                                 {delayms(20);}
  180.                         }
  181.                 delayms(300);        delayms(300);delayms(300);delayms(300);delayms(300);delayms(300);
  182.                 isd_pu(); //AN鍵按下,ISD上電并延遲50ms
  183.                 isd_pd();
  184.                 isd_pu();
  185.                 delayms(300);
  186.                 if (PR==1) //如果PR=1則轉(zhuǎn)入錄音部分
  187.                         {
  188.                                 delayms(500);         //延遲錄音        
  189.                                 isd_setrec(0x00,0x00); //發(fā)送0x0000h地址的setplay指令
  190.                                 do
  191.                                         {
  192.                                                 isd_rec();                 //發(fā)送rec指令
  193.                                                 delay(20);
  194.                                                 while(AN==0)         //等待錄音完畢
  195.                                                         {
  196.                                                                 if (ISD_INT==0) //如果芯片溢出,進(jìn)行LED閃爍提示,
  197.                                                                 isd_overflow(); //如果取消錄音(松開(kāi)AN鍵)則停止錄音,芯片復(fù)位
  198.                                                         }               
  199.                                                 if (ISD_INT==0)                break;
  200.                                                 LED=1;                                         //錄音完畢,LED熄滅
  201.                                                 isd_stop();                         //發(fā)送停止命令
  202.                                                 while(AN==1)                         //如果AN再次按下,開(kāi)始錄制下一段語(yǔ)音
  203.                                                         {
  204.                                                                 if(STOP==0)                 //如果按下STOP按鍵,則芯片復(fù)位
  205.                                                                 break;
  206.                                                                 if (AN==0)
  207.                                                                 delayms(500);
  208.                                                         }
  209.                                         }while(AN==0);        
  210.                         }
  211. ……………………

  212. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
120基于單片機(jī)錄音筆設(shè)計(jì)(ISD4002版).rar (45.81 KB, 下載次數(shù): 101)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:413541 發(fā)表于 2018-12-21 13:22 | 顯示全部樓層
謝謝樓主分享嘍
回復(fù)

使用道具 舉報(bào)

ID:480456 發(fā)表于 2019-3-20 13:48
程序編譯后和hex不一樣,用不了

ID:679011 發(fā)表于 2020-3-6 18:10 | 顯示全部樓層
請(qǐng)問(wèn)錄音/放音那里那個(gè)正方形,里面有個(gè)灰色圈圈是什么元器件呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表