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

      QQ登錄

      只需一步,快速開始

      搜索
      查看: 9097|回復(fù): 12
      打印 上一主題 下一主題
      收起左側(cè)

      基于ISD4004的單片機(jī)錄音筆程序源碼與實(shí)物設(shè)計(jì)

        [復(fù)制鏈接]
      跳轉(zhuǎn)到指定樓層
      樓主
      制作出來實(shí)物圖如下:


      單片機(jī)源程序如下:
      1. // 以ISD4004-8錄音時(shí)間為8分鐘,即8*60=480S根據(jù)4004的資料,480秒可分為2400段,也就是1S的段數(shù)為
      2. //  5段,即從,0000-0005H的內(nèi)容為1秒。0X0000-0X012C ;0X012D-0X0258;0X259-0X0384;0X0385-0X04B0.
      3. #include <reg52.h>
      4. #include <intrins.h>
      5. #include"1602.c"
      6. #include"eeprom.h"
      7. #define uchar unsigned  char
      8. #define uint  unsigned  int
      9. bit playbit,recbit;        //定義兩個(gè)位變量,放音和錄音位

      10. ////////定義放音命令,定義常量//////
      11. #define ISDPOWERUP      0X20           //ISD4004上電
      12. #define ISDSTOP         0X10           //ISD4004下電
      13. #define OPERSTOP        0X30           //ISD4004停止當(dāng)前操作
      14. #define PLAYSET         0XE0           //ISD4004從指定地址開始放音
      15. #define PLAYCUR         0XF0           //ISD4004從當(dāng)前地址開始放音
      16. #define RECSET          0XA0                 //ISD4004從指定地址開始錄音
      17. #define RECCUR          0XB0                   //ISD4004從當(dāng)前地址開始錄音

      18. sbit   SCLK=P3^7;
      19. sbit   SS=P3^6;            //LOW IS ACTIVELY
      20. sbit   MOSI=P3^5;
      21. //sbit   MISO=P3^4;

      22. sbit   K1=P1^2;
      23. sbit   K2=P1^3;
      24. sbit   K3=P1^4;                  //按鍵輸入

      25. sbit   LED1=P1^0;
      26. sbit   LED2=P1^1;          //指示燈

      27. uchar aa,bb,cc,dd,ee;
      28. uchar num_rec=0;
      29. void  delayms(uchar ms);
      30. uchar playcout,reccout;         //放音和錄音次數(shù)。               
      31. ////////////////放音部分子程序,放音地址由ADDR決定////
      32. void play(uint addr)
      33. {         uint y;
      34.         SS=0;
      35.         MOSI=0;//發(fā)送開始
      36.         SCLK=0;
      37.         for(y=0;y<8;y++)
      38.         {
      39.                 SCLK=0;
      40.                 if((0x20>>y)&0x01)MOSI=1;
      41.                 else MOSI=0;
      42.                 _nop_();
      43.                 _nop_();
      44.                 _nop_();
      45.                 SCLK=1;
      46.                 _nop_();
      47.                 _nop_();
      48.                 _nop_();
      49.         }//發(fā)送結(jié)束
      50.         SS=1;//上電結(jié)束
      51.         delayms(50);
      52.         SS=0;
      53.         MOSI=0;//發(fā)送地址
      54.         SCLK=0;
      55.         for(y=0;y<16;y++)
      56.         {
      57.                 SCLK=0;
      58.                 if((addr>>y)&0x01)MOSI=1;
      59.                 else MOSI=0;
      60.                 _nop_();
      61.                 _nop_();
      62.                 _nop_();
      63.                  SCLK=1;
      64.                 _nop_();
      65.                 _nop_();
      66.                 _nop_();
      67.         }//發(fā)送地址結(jié)束
      68.         MOSI=0;//放音
      69.         SCLK=0;
      70.         for(y=0;y<8;y++)
      71.         {
      72.                 SCLK=0;
      73.                 if((0xe0>>y)&0x01)MOSI=1;
      74.                 else MOSI=0;
      75.                 _nop_();
      76.                 _nop_();
      77.                 _nop_();
      78.                 SCLK=1;
      79.                 _nop_();
      80.                 _nop_();
      81.                 _nop_();
      82.         }
      83.         SS=1;
      84.         SS=0;
      85.         MOSI=0;//放音
      86.         SCLK=0;
      87.         for(y=0;y<8;y++)
      88.         {
      89.                 SCLK=0;
      90.                 if((0xf0>>y)&0x01)MOSI=1;
      91.                 else MOSI=0;
      92.                 _nop_();
      93.                 _nop_();
      94.                 _nop_();
      95.                 SCLK=1;
      96.                 _nop_();
      97.                 _nop_();
      98.                 _nop_();
      99.         }
      100.         SS=1;          }       
      101. //////////////////////////lu音部分子程序,地址由ADDR決定/////////////////////////
      102. void rec(addr)               
      103. {         uint y;       
      104.         SS=0;
      105.         MOSI=0;//發(fā)送開始
      106.         SCLK=0;
      107.         for(y=0;y<8;y++)
      108.         {
      109.                 SCLK=0;
      110.                 if((0x20>>y)&0x01)MOSI=1;
      111.                 else MOSI=0;
      112.                 _nop_();
      113.                 _nop_();
      114.                 _nop_();
      115.                 SCLK=1;
      116.                 _nop_();
      117.                 _nop_();
      118.                 _nop_();
      119.         }//發(fā)送結(jié)束
      120.         SS=1;//上電結(jié)束
      121.         delayms(50);
      122.         SS=0;
      123.         MOSI=0;//發(fā)送開始
      124.         SCLK=0;
      125.         for(y=0;y<8;y++)
      126.         {
      127.                 SCLK=0;
      128.                 if((0x20>>y)&0x01)MOSI=1;
      129.                 else MOSI=0;
      130.                 _nop_();
      131.                 _nop_();
      132.                 _nop_();
      133.                 SCLK=1;
      134.                 _nop_();
      135.                 _nop_();
      136.                 _nop_();
      137.         }//發(fā)送結(jié)束
      138.         SS=1;//上電結(jié)束
      139.         delayms(50);
      140.         delayms(50);
      141.         SS=0;
      142.         MOSI=0;//發(fā)送地址
      143.         SCLK=0;
      144.         for(y=0;y<16;y++)
      145.         {
      146.                 SCLK=0;
      147.                 if((addr>>y)&0x01)MOSI=1;
      148.                 else MOSI=0;
      149.                 _nop_();
      150.                 _nop_();
      151.                 _nop_();
      152.                 SCLK=1;
      153.                 _nop_();
      154.                 _nop_();
      155.                 _nop_();
      156.         }//發(fā)送地址結(jié)束
      157.         MOSI=0;
      158.         SCLK=0;
      159.         for(y=0;y<8;y++)
      160.         {
      161.                 SCLK=0;
      162.                 if((0xa0>>y)&0x01)MOSI=1;
      163.                 else MOSI=0;
      164.                 _nop_();
      165.                 _nop_();
      166.                 _nop_();
      167.                 SCLK=1;
      168.                 _nop_();
      169.                 _nop_();
      170.                 _nop_();
      171.         }
      172.         SS=1;
      173.         SS=0;
      174.         MOSI=0;
      175.         SCLK=0;
      176.         for(y=0;y<8;y++)
      177.         {
      178.                 SCLK=0;
      179.                 if((0xb0>>y)&0x01)MOSI=1;
      180.                 else MOSI=0;
      181.                 _nop_();
      182.                 _nop_();
      183.                 _nop_();
      184.                 SCLK=1;
      185.                 _nop_();
      186.                 _nop_();
      187.                 _nop_();
      188.         }
      189.         SS=1;          }

      190. ////////////////////////////////////
      191. ////////////////////////////////
      192. void stop()
      193. {
      194.     uchar y;
      195.         SS=1;
      196.         SS=0;
      197.         MOSI=0;//放音
      198.         SCLK=0;
      199.         for(y=0;y<8;y++)
      200.         {
      201.                 SCLK=0;
      202.                 if((0x30>>y)&0x01)MOSI=1;
      203.                 else MOSI=0;
      204.                 _nop_();
      205.                 _nop_();
      206.                 _nop_();
      207.                 SCLK=1;
      208.                 _nop_();
      209.                 _nop_();
      210.                 _nop_();
      211.         }
      212.         SS=1;
      213. }
      214. ////////////////////////////////////
      215. ////////////////////////////////////
      216. void delayms(uchar ms)       
      217. // 延時(shí)子程序
      218. {                                               
      219.         uchar j;
      220.         while(ms--)
      221.         {
      222.                 for(j = 0; j < 120; j++);
      223.         }
      224. }
      225. ////////////////////////////////
      226. void playsound()        ///錄放音子函數(shù)
      227. {
      228.   if(playbit)
      229.   {
      230.      playbit=0;
      231.      switch(playcout)
      232.     {                         ///////////====每段60S=====////////////////
      233.          case 0x01:{play(0x0000);LCD_write_str(0,0,"NUM:1 Playing  ");}break;        //此處第一段音樂的開始地址為0X00,到0X012d地址結(jié)束,約為60秒。
      234.      case 0x02:{play(0x012d);LCD_write_str(0,0,"NUM:2 Playing  ");}break;
      235.      case 0x03:{play(0x0259);LCD_write_str(0,0,"NUM:3 Playing  ");}break;
      236.      case 0x04:{play(0x0385);LCD_write_str(0,0,"NUM:4 Playing  ");}break;
      237.     }
      238.    }
      239.   if(recbit)
      240.    {
      241.     recbit=0;
      242.     switch(reccout)
      243.         {   
      244.              case 0x01:{rec(0x0000); LCD_write_str(0,0,"NUM:1 Recording");aa=1;}break;
      245.              case 0x02:{rec(0x012d);LCD_write_str(0,0,"NUM:2 Recording");aa=1;}break;
      246.              case 0x03:{rec(0x0259);LCD_write_str(0,0,"NUM:3 Recording");aa=1;}break;
      247.              case 0x04:{rec(0x0385);LCD_write_str(0,0,"NUM:4 Recording");aa=1;}break;
      248.      }
      249.     }
      250. }
      251. bit key_bit1=0,key_bit2=0;
      252. uchar num11;
      253. uchar  play_count=4,rec_count=4;
      254. ////////////////////////////////////
      255. void keyscan()  //直控鍵盤掃描子程序。
      256. {

      257.                    if(K1==0)
      258.               {
      259.                     while(K1==0);
      260.                         key_bit1=1;
      261.                     recbit=1;
      262.                     reccout++;
      263.                          LED2=0;LED1=1;
      264.                     if(reccout>rec_count)          //
      265.                     reccout=1;
      266.                   }
      267.                   if(K2==0&&key_bit2==0)
      268.                     {
      269.                            while(K2==0);
      270.                            key_bit1=1;
      271.                            playbit=1;
      272.                        playcout++;
      273.                            LED1=0;LED2=1;
      274.                            if(playcout>play_count)
      275.                            playcout=1;       
      276.                 //           reccout=num_rec;                  
      277.                    }                             
      278.                  if(K3==0&&key_bit1==1)
      279.                     {
      280.                           while(K3==0);
      281.                           stop();
      282.                           LED2=1;
      283.                           LED1=1;
      284.                           if(aa==1){
      285.                           num_rec++;
      286.                           aa=0;       
      287.                           if(num_rec>4){
      288.                                  num_rec=1;
      289.                                 key_bit1=0;
      290.                           }
      291.                           }
      292.                           ISP_ERASE(0x2c00);                //注意:字節(jié)編程時(shí)必須要先要擦除整個(gè)扇區(qū)       
      293.                           ISP_PROGRAM(0x2c00, num_rec);        //寫入eeprom 掉電保存
      294.                           ISP_PROGRAM(0x2c01, reccout);
      295.                           play_count=num_rec;                //保存播放的段數(shù)
      296.                       reccout=num_rec;                //從第幾段錄起
      297.                           LCD_write_str(0,0,"                ");
      298.                           key_bit1=0;
      299.                   }
      300. ////////////////////////////////////////////////////////////////////////////////////////////////
      301.                  if(K3==0&&key_bit1==0)                                        //選擇播放哪段
      302.                     {
      303.                            while(K3==0&&key_bit1==0);
      304.                                 key_bit2=1;
      305.                             num11++;                       
      306.                            if(num11>play_count)
      307.                            {
      308.                                    num11=0;
      309.                                    bb=0;cc=0;dd=0;
      310.                                    key_bit2=0;
      311.                                    LCD_write_str(0,0,"                ");
      312.                            }
      313.                                 switch(num11)
      314.                           {   
      315.                                      case 1:{LCD_write_str(0,0,"NUM:1 Rec    ");bb=1;cc=0;dd=0;ee=0;}break;
      316.                                      case 2:{LCD_write_str(0,0,"NUM:2 Rec    ");bb=0;cc=1;dd=0;ee=0;}break;
      317.                                      case 3:{LCD_write_str(0,0,"NUM:3 Rec    ");cc=0;bb=0;dd=1;ee=0;}break;
      318.                                      case 4:{LCD_write_str(0,0,"NUM:4 Rec    ");cc=0;bb=0;dd=0;ee=1;}break;
      319.                       }               
      320.                         }
      321.                         if(bb==1){

      322.                                   if(K2==0&&key_bit2==1)
      323.                           {
      324.                                     while(K2==0);        
      325.                                         key_bit1=1;
      326.                                         play(0x0000);
      327.                                         LCD_write_str(0,0,"NUM:1 Playing  ");
      328.                                
      329.                                   }
      330.                          }
      331.                          if(cc==1){

      332.                                   if(K2==0&&key_bit2==1)
      333.                           {
      334.                                     while(K2==0);
      335.                                         key_bit1=1;
      336.                                         play(0x012d);
      337.                                         LCD_write_str(0,0,"NUM:2 Playing  ");
      338.                                   }
      339.                          }
      340.                          if(dd==1){

      341.                                   if(K2==0&&key_bit2==1)
      342.                           {
      343.                                     while(K2==0);
      344.                                         key_bit1=1;
      345.                                         play(0x0259);
      346.                                         LCD_write_str(0,0,"NUM:3 Playing  ");

      347.                                   }
      348.                          }
      349.                      if(ee==1){

      350.                                   if(K2==0&&key_bit2==1)
      351.                           {
      352.                                     while(K2==0);
      353.                                         key_bit1=1;
      354.                                         play(0x0385);
      355.                                         LCD_write_str(0,0,"NUM:4 Playing  ");
      356.                                   }
      357.                          }

      358. }
      359. ////////////////////////////////////////////////
      360. /////////以下部分為主程序///////////////////
      361. void main()
      362. {  
      363.    num_rec = ISP_READ(0x2c00);  //保存數(shù)值回讀
      364.    reccout = ISP_READ(0x2c01);
      365.    play_count=num_rec;                //保存條數(shù)
      366.    init1602();                                 //液晶初始化
      367.    LCD_write_str(0,1,"N:");
      368.    stop();
      369.         while(1)
      370.            {
      371.               keyscan();           //按鍵掃描
      372.               playsound();           //錄播放

      373.                   Write_num(0xC2,num_rec);        //顯示條數(shù)
      374.                          
      375.                    }


      376. }
      377.             
      復(fù)制代碼

      所有資料51hei提供下載:
      基于單片機(jī)錄音筆設(shè)計(jì).rar (10.23 MB, 下載次數(shù): 257)


      評(píng)分

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

      查看全部評(píng)分

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

      使用道具 舉報(bào)

      沙發(fā)
      ID:380971 發(fā)表于 2018-8-2 21:31 | 只看該作者
      圖紙沒有對(duì)應(yīng)引腳號(hào)怎么接?
      回復(fù)

      使用道具 舉報(bào)

      板凳
      ID:438436 發(fā)表于 2018-12-3 15:33 | 只看該作者
      劉風(fēng) 發(fā)表于 2018-8-2 21:31
      圖紙沒有對(duì)應(yīng)引腳號(hào)怎么接?

      兄弟在么。能不能把里面的東西共享一下。
      回復(fù)

      使用道具 舉報(bào)

      地板
      ID:352018 發(fā)表于 2020-2-23 15:52 | 只看該作者
      有仿真嗎
      回復(fù)

      使用道具 舉報(bào)

      5#
      ID:697580 發(fā)表于 2020-2-24 19:20 來自手機(jī) | 只看該作者
      請(qǐng)問有講解視頻嗎?
      回復(fù)

      使用道具 舉報(bào)

      6#
      ID:284357 發(fā)表于 2020-8-6 11:06 | 只看該作者
      劉風(fēng) 發(fā)表于 2018-8-2 21:31
      圖紙沒有對(duì)應(yīng)引腳號(hào)怎么接?

      你可以根據(jù)那個(gè)程序的引腳定義來接啊
      回復(fù)

      使用道具 舉報(bào)

      7#
      ID:284357 發(fā)表于 2020-8-6 11:07 | 只看該作者
      18135776781 發(fā)表于 2020-2-24 19:20
      請(qǐng)問有講解視頻嗎?

      沒有講解視頻
      回復(fù)

      使用道具 舉報(bào)

      8#
      ID:848415 發(fā)表于 2020-12-5 16:42 | 只看該作者
      我已經(jīng)下載了你的程序,請(qǐng)問一下,第一張圖片上面藍(lán)色的那個(gè)小板子是什么。渴茿M1117嗎?
      回復(fù)

      使用道具 舉報(bào)

      9#
      ID:848415 發(fā)表于 2020-12-5 16:44 | 只看該作者
      另外,4004好像沒有擦除錄音的指令。
      回復(fù)

      使用道具 舉報(bào)

      10#
      ID:167530 發(fā)表于 2021-2-3 08:58 | 只看該作者
      建議貼一下引腳方便對(duì)照代碼看。
      回復(fù)

      使用道具 舉報(bào)

      11#
      ID:894185 發(fā)表于 2021-3-20 10:02 來自手機(jī) | 只看該作者
      請(qǐng)問錄好的音是存在語音芯片里面,還是單片機(jī)里面?
      回復(fù)

      使用道具 舉報(bào)

      12#
      ID:778106 發(fā)表于 2021-4-10 19:59 來自手機(jī) | 只看該作者
      你好,想問一下能具體實(shí)現(xiàn)什么功能呢
      回復(fù)

      使用道具 舉報(bào)

      13#
      ID:277420 發(fā)表于 2021-7-6 16:57 | 只看該作者
      18135776781 發(fā)表于 2020-2-24 19:20
      請(qǐng)問有講解視頻嗎?

      圖紙沒有對(duì)應(yīng)引腳號(hào)怎么接?
      回復(fù)

      使用道具 舉報(bào)

      本版積分規(guī)則

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

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

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