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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ISD4004+51單片機的錄放機與復讀機原理圖及代碼

[復制鏈接]
跳轉到指定樓層
樓主
做了一個復讀機 直接上傳壓縮包了  其他的操作我也不太會  

AD原理圖 加 代碼 已經做出來實物了


單片機源程序如下:
  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, 下載次數: 60)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利视频 | 久草视频观看 | 欧美综合一区 | 精品国产一区二区三区成人影院 | 国产999精品久久久 日本视频一区二区三区 | 成人免费淫片aa视频免费 | 二区三区视频 | 亚洲九色 | 黄网站涩免费蜜桃网站 | 欧美成人精品一区二区三区 | 亚洲精品一区中文字幕乱码 | 在线看一区二区三区 | 成人影院一区二区三区 | 三区在线观看 | 久久成人精品视频 | 久久久精品国产 | 日韩乱码在线 | 剑来高清在线观看 | 欧美久久一区二区三区 | 中文字幕第十一页 | 精品国产一二三区 | 国产精品96久久久久久 | 欧美中文字幕在线观看 | 国产高清视频在线 | 天天干干 | 日韩在线免费 | 日韩av免费在线观看 | 国产精品美女久久久免费 | 亚州av| 国产一区二区三区在线 | 成人国产精品色哟哟 | 国产小视频在线看 | 最新中文字幕 | 日韩精品视频一区二区三区 | 久久久精品久 | 欧美xxxx日本 | 91免费看片 | 99re在线视频 | 欧美aaa一级片 | 精品不卡 | 国产欧美精品一区二区色综合 |