单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 135|回复: 0
收起左侧

ISD4004+51单片机的录放机与复读机原理图及代码

[复制链接]
hao17568185487 发表于 2019-5-22 09:37 | 显示全部楼层 |阅读模式
做了一个复读机 直接上传压缩包了  其他的操作我也不太会  

AD原理图 加 代码 已经做出来实物了
0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned  char   //定义一个常量用标识符uchar代替常量unsignerd char
  4. #define uint  unsigned  int    //定义一个常量用标识符uint代替常量unsignerd int
  5.                
  6. //=======分段录音首地址定义======================
  7. //ISD4004-8录音时间为8分钟,即8*60=480S, 根据4004的资料,480秒可分为2400段,也就是1S的段数为5段,即从,0000-0005H的内容为1秒.

  8. #define ISD_ADDS1 0x0000 //录音存放地址1   //60秒  0x0000-0x012c//300H     //  -0x0258  120秒
  9. #define ISD_ADDS2 0x0259 //录音存放地址2   //60    0x012d-0x0258//600H     //  -0x04AF  120
  10. #define ISD_ADDS3 0x04B0 //录音存放地址3   //60    0x0259-0x0384//900H     //  -0x0708  120
  11. #define ISD_ADDS4 0x070A //录音存放地址4   //60    0x0385-0x04B0//1200H    //  -0x0960  120
  12. //========ISD4004指令定义========================
  13. #define POWER_UP    0x20 //上电指令
  14. #define SET_PLAY    0xE0 //指定放音指令
  15. #define PLAY        0xF0 //当前放音指令
  16. #define SET_REC     0xA0 //指定录音指令
  17. #define REC         0xB0 //当前录音指令
  18. #define STOP        0x30 //停止当前操作
  19. #define STOP_WRDN   0xF1 //停止当前操作并掉电
  20. #define SET_MC      0xE1 //指定快进指令
  21. #define MC          0xF1 //快进执行指令
  22. #define RINT        0x30 //读状态:OVF和EOM

  23. //=========ISD4004--c51接口定义=================
  24. //P2.6----->放音指示灯
  25. //P2.7----->录音指示灯
  26. //P2.5----->地址1指示灯
  27. //P2.4----->地址2
  28. //P2.3----->地址3
  29. //P2.2----->地址4
  30. //P3.4----->SET
  31. //P3.7----->REC
  32. //P3.6----->PLAY
  33. //P3.5----->STOP
  34. //P1.1----->SS
  35. //P1.2----->MOSI
  36. //P1.5----->SCLK

  37. sbit   SS=P1^1;        //片选   
  38. sbit   MOSI=P1^2;      //数据输入
  39. sbit   MISO=P1^3;      //数据输出
  40. sbit   SCLK=P1^5;      //ISD4004时钟
  41. sbit   INT=P1^6;       //溢出中断
  42. sbit   RAC=P1^7;       //行地址时钟


  43. //==========按键定义==========================
  44. sbit   KY_SET=P3^4;    //选择
  45. sbit   KY_REC=P3^7;    //录音
  46. sbit   KY_PLAY=P3^6;   //放音
  47. sbit   KY_STOP=P3^5;   //停止
  48. sbit   KY_CIRCLE=P3^2; //复读

  49. //==========指示灯定义==========================
  50. sbit   LED_PLAY=P2^6;  
  51. sbit   LED_REC=P2^7;
  52. sbit   LED_ADDR1=P2^5;
  53. sbit   LED_ADDR2=P2^4;
  54. sbit   LED_ADDR3=P2^3;
  55. sbit   LED_ADDR4=P2^2;
  56. sbit   LED_CIRCLE=P2^1;



  57. //==========ISD4004函数定义===================
  58. void ISD_SPI_Send8( uchar isdx8 ); //spi 串行发送子程序,8位数据,从低到高
  59. void ISD_SPI_Send16( uint isdx16 );//spi 串行发送子程序,16位数据.从低到高
  60. void ISD_Stop(void);               //发送 stop 指令
  61. void ISD_PowerUp(void);            //发送上电指令,并延迟 50ms
  62. void ISD_PowerDown(void);          //发送掉电指令,并延迟 50ms
  63. void ISD_Play(void);               //发送放音指令,并延迟 50ms
  64. void ISD_SetPlay(uint add);        //发送指定放音指令,并延迟 50ms
  65. void ISD_Rec(void);                //发送录音指令,并延迟 50ms
  66. void ISD_SetRec(uint add);         //发送指定录音指令,并延迟 50ms

  67. //========延时函数===========================
  68. void Delay1Ms(uchar t);    //延时t*1毫秒
  69. void Delay();
  70. //========按键函数===========================
  71. void Key(void);
  72. void id_case1_key();
  73. //=========变量定义==========================
  74. unsigned char id=0;      
  75. bit play_flag;            //定义一个变量
  76. uchar flag = 0;

  77. /******************************************************************
  78. 名称:ISD_SPI_Send8(uchar isdx)
  79. 功能:spi 串行发送子程序,8 位数据                                                   
  80. 指令:
  81. 调用:无
  82. 返回:无
  83. /******************************************************************/
  84. void ISD_SPI_Send8( uchar isd_data )
  85. {
  86.       uchar i;  
  87.       SS = 0;   //选中ISD4004
  88.       SCLK = 0;
  89.       for(i=0;i<8;i++)    //先发低位再发高位,依次发送。循环8次
  90.       {
  91.        if ((isd_data & 0x01) == 1) //发送最低位
  92.         MOSI = 1;  
  93.        else
  94.         MOSI = 0;
  95.         isd_data >>= 1;   //右移一位
  96.         SCLK = 1;   //时钟下降沿发送
  97.         SCLK = 0;
  98.   }
  99. }
  100. /******************************************************************
  101. 名称:ISD_SPI_Send16(uint isdx16)
  102. 功能:spi 串行发送子程序,16位数据                                                   
  103. 指令:
  104. 调用:无
  105. 返回:无
  106. /******************************************************************/
  107. void ISD_SPI_Send16( uint isd_data )
  108. {
  109.      uchar i;
  110.      SS = 0;   //选中ISD4004
  111.      SCLK = 0;
  112.      for(i=0;i<16;i++) //先发低位再发高位,依次发送。
  113.       {
  114.       if ((isd_data&0x0001)==1) //发送最低位
  115.        MOSI = 1;
  116.       else
  117.        MOSI = 0;
  118.        isd_data = isd_data >> 1;   //右移一位
  119.        SCLK=1;   //时钟下降沿发送
  120.        SCLK=0;
  121.   }
  122. }

  123. /***************************************************************
  124. 名称:ISD_Stop(void)
  125. 功能:发送 stop 指令                                                   
  126. 指令:ISD_SPI_Send8(uchar isdx8);
  127. 调用:无
  128. 返回:无
  129. /******************************************************************/
  130. void ISD_Stop(void)
  131. {
  132.         SS=0;
  133.         MOSI=0;
  134.         SCLK=0;
  135.         ISD_SPI_Send8(STOP);
  136.           SS=1;
  137.         LED_PLAY=1;
  138.         
  139. }
  140. /******************************************************************
  141. 名称:ISD_PowerUp(void)
  142. 功能:发送上电指令                                                   
  143. 指令:ISD_SPI_Send8(uchar isdx8);
  144. 调用:无
  145. 返回:无
  146. /******************************************************************/
  147. void ISD_PowerUp(void)
  148. {
  149.         SS=0;  
  150.         MOSI=0;
  151.         SCLK=0;         
  152.         ISD_SPI_Send8(POWER_UP);
  153.         SS = 1;
  154. }
  155. /******************************************************************
  156. 名称:ISD_PowerDown(void)
  157. 功能:发送掉电指令                                                
  158. 指令:ISD_SPI_Send8(uchar isdx8);
  159. 调用:无
  160. 返回:无
  161. /******************************************************************/
  162. void ISD_PowerDown(void)
  163. {
  164.         SS=0;
  165.         MOSI=0;
  166.         SCLK=0;
  167.         ISD_SPI_Send8(STOP_WRDN);
  168.         SS = 1;
  169. }

  170. /******************************************************************
  171. 名称:ISD_Play(void)
  172. 功能:发送play指令                                                
  173. 指令:ISD_SPI_Send8(uchar isdx8);
  174. 调用:无
  175. 返回:无
  176. /******************************************************************/
  177. void ISD_Play(void)
  178. {
  179.         SS=0;
  180.         MOSI=0;
  181.          SCLK=0;
  182.         ISD_SPI_Send8(PLAY);
  183.         SS = 1;
  184. }
  185. /******************************************************************
  186. 名称:ISD_Rec(void)
  187. 功能:发送rec录音指令                                                  
  188. 指令:ISD_SPI_Se nd8(uchar isdx8);
  189. 调用:无
  190. 返回:无
  191. /******************************************************************/
  192. void ISD_Rec(void)
  193. {
  194.         SS=0;
  195.            MOSI=0;
  196.         SCLK=0;
  197.         ISD_SPI_Send8(REC);
  198.         SS = 1;
  199. }   
  200. /******************************************************************
  201. 名称:ISD_SetPlay(uint add)
  202. 功能:发送setplay指令                                                  
  203. 指令:ISD_SPI_Send8(uchar isdx8);
  204.       ISD_SPI_Send16(uint isdx16);
  205. 调用:无
  206. 返回:无
  207. /******************************************************************/
  208. void ISD_SetPlay(uint add)
  209. {
  210.        Delay1Ms(1);
  211.        ISD_SPI_Send16(add);  //发送放音起始地址
  212.        ISD_SPI_Send8(SET_PLAY); //发送 setplay 指令字节
  213.        SS = 1;
  214. }
  215. /******************************************************************
  216. 名称:ISD_SetRec(uint add)
  217. 功能:发送setrec指令                                                  
  218. 指令:ISD_SPI_Send8(uchar isdx8);
  219.   ISD_SPI_Send16(uint isdx16);
  220. 调用:无
  221. 返回:无
  222. /******************************************************************/
  223. void ISD_SetRec(uint add)
  224. {
  225.        Delay1Ms(1);         
  226.        ISD_SPI_Send16(add); //发送录音起始地址
  227.        ISD_SPI_Send8(SET_REC); //发送 setrec 指令字节
  228.        SS = 1;
  229. }
  230. //************************************

  231. /*=========================================================================
  232. 名称: void Delay1Ms(uchar t);
  233. 功能:延时1ms
  234. 参数:t,最大255
  235. 调用: 无
  236. 返回:无
  237. =========================================================================*/
  238. void Delay1Ms(uchar t)
  239. {
  240.    uchar i;
  241.    for (;t>0;t--)
  242.    {
  243.    for (i=0;i<150;i++)
  244.     {
  245.      _nop_();_nop_();_nop_();_nop_();_nop_();
  246.      _nop_();_nop_();_nop_();_nop_();_nop_();
  247.      }
  248.    }
  249. }
  250. //========================================
  251. void Delay()
  252. {
  253.     uchar i;
  254.     uint d=5000;
  255.     while (d--)
  256.     {
  257.         i=255;
  258.         while (i--);
  259.      }
  260. }
  261. void Key(void)   
  262. {
  263.     if (!KY_STOP)
  264.      {
  265.           Delay1Ms(15);
  266.           if(!KY_STOP)
  267.           {
  268.            while(!KY_STOP);
  269.            ISD_Stop();    //发送停止命令   
  270.             id=0;
  271.            LED_REC=1;
  272.            LED_PLAY=1;
  273.            play_flag=0;
  274.            SS=1;            
  275.            MOSI=1;
  276.            SCLK=1;
  277.                            
  278.          }
  279.        }

  280.     if(!KY_SET)     
  281.     {
  282.      Delay1Ms(15);
  283.      if(!KY_SET)
  284.      {
  285.       Delay1Ms(15);
  286.       while(!KY_SET);
  287.       ++id;
  288.       if(id>4)
  289.       id=0;
  290.       ISD_Stop();
  291.       SS=1;            
  292.       MOSI=1;
  293.       SCLK=1;
  294.       LED_REC=1;
  295.       LED_PLAY=1;
  296.       play_flag=0;
  297.         }
  298.   }

  299. if(id==0){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=1;}
  300. if(id==1){LED_ADDR1=0;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=1;id_case1_key();}  
  301. if(id==2){LED_ADDR1=1;LED_ADDR2=0;LED_ADDR3=1;LED_ADDR4=1;id_case1_key();}
  302. if(id==3){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=0;LED_ADDR4=1;id_case1_key();}
  303. if(id==4){LED_ADDR1=1;LED_ADDR2=1;LED_ADDR3=1;LED_ADDR4=0;id_case1_key();}

  304. if(play_flag==1)
  305.   {
  306.      if(!INT && !flag)
  307.          {
  308.              play_flag=0;
  309.              ISD_Stop();
  310.              SS=1;            
  311.              MOSI=1;
  312.              SCLK=1;              

  313.     }
  314.   }
  315. }

  316. //==========================================================
  317. void id_case1_key(void)     
  318. {
  319.     if (!KY_REC)
  320.        {
  321.                  Delay1Ms(15);
  322.                  if(!KY_REC)
  323.                  {
  324.                           while(!KY_REC);
  325.                           ISD_PowerUp();
  326.                           Delay1Ms(50);
  327.                           if(id==1)
  328.                           {
  329.                              LED_REC=0;
  330.                              ISD_SetRec(ISD_ADDS1);
  331.                           }
  332.                           else if(id==2)
  333.                           {
  334.                              LED_REC=0;
  335.                              ISD_SetRec(ISD_ADDS2);
  336.                           }
  337.                           else if(id==3)
  338.                           {
  339.                              LED_REC=0;
  340.                              ISD_SetRec(ISD_ADDS3);
  341.                           }
  342.                           else if(id==4)
  343.                           {
  344.                              LED_REC=0;
  345.                              ISD_SetRec(ISD_ADDS4);
  346.                           }
  347.                           ISD_Rec();
  348.                           ISD_Stop();    //发送停止命令   
  349.                           ISD_PowerDown();
  350.                           SS=1;            
  351.                           MOSI=1;
  352.                           SCLK=1;
  353.               }
  354.        }
  355.   if (!KY_PLAY)
  356.        {
  357.                  Delay1Ms(15);
  358.                  if(!KY_PLAY)
  359.                  {
  360.                           while(!KY_PLAY);
  361.                           ISD_PowerUp();
  362.                        A:   
  363.                           Delay1Ms(50);
  364.                           if(id==1)
  365.                           {
  366.                              LED_PLAY=0;
  367.                              ISD_SetPlay(ISD_ADDS1);
  368.                            }
  369.                           else if(id==2)
  370.                           {
  371.                              LED_PLAY=0;
  372.                              ISD_SetPlay(ISD_ADDS2);
  373.                           }
  374.                           else if(id==3)
  375.                           {
  376.                              LED_PLAY=0;
  377.                              ISD_SetPlay(ISD_ADDS3);
  378.                           }
  379.                           else if(id==4)
  380.                           {
  381.                              LED_PLAY=0;
  382.                              ISD_SetPlay(ISD_ADDS4);
  383.                           }
  384.                           ISD_Play();
  385.                           play_flag = 1;                 
  386.                           while (INT)
  387.                           {
  388.                                 Key();
  389.                            }
  390.                           if(flag && play_flag)
  391.                           {                          
  392.                                    goto A;
  393.                            }
  394.                           ISD_Stop();  
  395.                           ISD_PowerDown();         
  396.                           SS=1;            
  397.                           MOSI=1;
  398.                           SCLK=1;                                                   
  399.          }                          
  400.        }
  401. }

  402.                  
  403. void  main(void)
  404. {
  405.         EX0 = 1;  //开外部中断1
  406.         IT0 = 0;  //负边沿触发
  407.         EA = 1;          //开总中断
  408.         flag = 0;
  409.         LED_CIRCLE=1;
  410.         while(1)
  411.         {           
  412.           Key();
  413.           id_case1_key();   
  414.         }
  415. }

  416. void Outside_Int1(void) interrupt 1
  417. {        
  418.         Delay1Ms(50);        
  419.         if(!KY_CIRCLE)
  420.         {
  421.          flag=~flag;
  422.          LED_CIRCLE=~LED_CIRCLE;         
  423.             }
  424.         while(!KY_CIRCLE);        
  425. }
复制代码

所有资料51hei提供下载:
新建 WinRAR 压缩文件.rar (801.95 KB, 下载次数: 6)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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