找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5847|回复: 2
收起左侧

基于ISD4002与单片机的录音笔设计程序与原理图

[复制链接]
ID:244863 发表于 2017-11-25 21:34 | 显示全部楼层 |阅读模式
这个isd4002没法仿真只有原理图和程序,是别人弄得课程设计,感觉高大上就发上来了

如果开关选在VCC,为录音状态
如果开关选在GND,为放音状态
Altium Designer画的原理图如下:(51hei附件中可下载工程文件)
0.png

单片机源程序如下:
  1. //*****************************************************
  2. // ISD4002-STC89C52开发板演示例程 C51版本 *
  3. //*****************************************************

  4. #include <reg52.h>

  5. sbit SS      = P1^0; //片选
  6. sbit SCLK    = P1^3; //ISD4003时钟
  7. sbit MOSI    = P1^1; //数据输入
  8. sbit MISO    = P1^2; //数据输出
  9. sbit LED     = P1^7; //指示灯
  10. sbit ISD_INT = P3^3; //中断
  11. sbit AN      = P1^6; //执行
  12. sbit STOP    = P1^5; //复位
  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串行发送子程序,8位数据
  37. //************************************
  38. void spi_send(unsigned char isdx)
  39. {         
  40.         unsigned char isx_counter;
  41.         SS=0; //ss=0,打开spi通信端
  42.         SCLK=0;
  43.         for(isx_counter=0;isx_counter<8;isx_counter++) //先发低位再发高位,依次发送。
  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. //发送stop指令
  58. //*******************************
  59. void isd_stop(void)
  60. {         
  61.         delay(10);
  62.         spi_send(0x30);
  63.         SS=1;
  64.         delayms(50);
  65. }

  66. //*******************************
  67. //发送上电指令,并延迟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. //********发送掉电指令,并延迟50ms
  79. void isd_pd(void)
  80. {
  81.         delay(10);
  82.         spi_send(0x10);
  83.         SS=1;
  84.         delayms(50);
  85. }

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

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

  104. //*******************************
  105. //发送setplay指令
  106. //*******************************
  107. void isd_setplay(unsigned char adl,unsigned char adh)           
  108. {        
  109.         spi_send(adl); //发送放音起始地址低位
  110.         adh=adh|0xe0;
  111.         spi_send(adh); //发送放音起始地址高位
  112.         SS=1;
  113. }
  114. //*******************************
  115. //发送setrec指令
  116. void isd_setrec(unsigned char adl,unsigned char adh)
  117. {
  118.         spi_send(adl); //发送放音起始地址低位
  119.         adh=adh|0xa0;
  120.         spi_send(adh); //发送放音起始地址高位
  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; //关闭spi通信端
  152.                 isd_stop(); //发送stop指令
  153.                 return 1; //OVF为1,返回1
  154.         }
  155.         else
  156.         {
  157.                 SCLK=0;
  158.                 SS =1; //关闭spi通信端
  159.                 isd_stop(); //发送stop指令
  160.                 return 0; //OVF为0,返回0
  161.         }
  162. }
  163. //************************************************************************
  164. //主程序
  165. //功能:1.录音时,按住AN键,LED点亮开始录音,松开AN即可停止录音
  166. // 再次按下AN键,LED点亮开始录第二段音,依次类推,直到芯片溢出。
  167. // 按stop键芯片复位
  168. // 2.放音时,按一下AN键,即播放一段语音。 按stop键芯片复位。
  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)                 //按键防抖动
  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则转入录音部分
  187.                         {
  188.                                 delayms(500);         //延迟录音        
  189.                                 isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令
  190.                                 do
  191.                                         {
  192.                                                 isd_rec();                 //发送rec指令
  193.                                                 delay(20);
  194.                                                 while(AN==0)         //等待录音完毕
  195.                                                         {
  196.                                                                 if (ISD_INT==0) //如果芯片溢出,进行LED闪烁提示,
  197.                                                                 isd_overflow(); //如果取消录音(松开AN键)则停止录音,芯片复位
  198.                                                         }               
  199.                                                 if (ISD_INT==0)                break;
  200.                                                 LED=1;                                         //录音完毕,LED熄灭
  201.                                                 isd_stop();                         //发送停止命令
  202.                                                 while(AN==1)                         //如果AN再次按下,开始录制下一段语音
  203.                                                         {
  204.                                                                 if(STOP==0)                 //如果按下STOP按键,则芯片复位
  205.                                                                 break;
  206.                                                                 if (AN==0)
  207.                                                                 delayms(500);
  208.                                                         }
  209.                                         }while(AN==0);        
  210.                         }
  211. ……………………

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

所有资料51hei提供下载:
120基于单片机录音笔设计(ISD4002版).rar (45.81 KB, 下载次数: 101)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:413541 发表于 2018-12-21 13:22 | 显示全部楼层
谢谢楼主分享喽
回复

使用道具 举报

ID:480456 发表于 2019-3-20 13:48
程序编译后和hex不一样,用不了

ID:679011 发表于 2020-3-6 18:10 | 显示全部楼层
请问录音/放音那里那个正方形,里面有个灰色圈圈是什么元器件呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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