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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機FM收音機制作 帶源碼與原理圖 12864屏顯示

  [復制鏈接]
跳轉到指定樓層
樓主

單片機FM收音機的實物圖:


單片機FM收音機的pcb圖:


單片機FM收音機的原理圖:



源程序:
  1. /*****************************************************************
  2.                                                         FM收音機
  3. 作者:Anyrain
  4. 版本:1.0
  5. 說明:
  6.                                                                  
  7.   K1--- 向上搜索電臺 K2--- 向下搜索電臺                          
  8.   K3--- 音量加       K4--- 音量減                                
  9.                                                                  
  10. *****************************************************************/

  11. #include <reg52.h>
  12. #include <intrins.h>
  13. #include"delay.h"
  14. #include "12864.h"
  15. #include "i2c.h"
  16. #include"ds1302.h"

  17. sbit  K1 = P3^0;
  18. sbit  K2 = P3^2;
  19. sbit  K3 = P3^1;

  20. sbit  K4 = P3^3;

  21. unsigned long frequency;
  22. unsigned char key,timekey,fmkey,mimiflag=0;
  23. unsigned int count,num;

  24. // RDA5807 寄存器初始值設定
  25. unsigned char  RDA_reg_data[8] =
  26. {
  27.    0xd0,0x00,  // 02H         1                1                0                1     XX 0                0         
  28.                                         //        正常操作無靜音        立體聲  重低音        下搜索        停止搜索
  29.                                         //        0                        000                XX        0                        0
  30.                                         //        自動搜臺        32.768                 軟件不復位        上電不使能
  31.    0x00,0x10,  // 03H         0000000000        CHAN[9:0]
  32.                                 //        Frequency=Spacing(KHz)*CHAN+BAND
  33.                                 //        0 0                 10                        00 SPACE
  34.                                 //        調諧關 76-108MHz        100KHz
  35.    0x44,0x40,  // 04H        X 0                                X0                                         0             X000
  36.                                         //          disable Seek/Tune Interrupt           去加重75us
  37.                                         //        1                00                          00            00
  38.                                         //        I2C使能        GPIO3高阻 GPIO2高阻 GPIO1高阻
  39.    0x88,0xA8,  // 05H        1                  0010000
  40.                         //        reg0CH讀產生中斷  seek threshold
  41.                         //        10                00                1000 VOLUME
  42.                         //        LANP        1.8mA        音量
  43. };

  44. /**************************************************************
  45. *********************連續寫寄存器子函數************************/

  46. void RDA5807_write_reg(void)
  47. {
  48.    unsigned char i;
  49.    I2C_start();                                        // 收音模塊寫入操作                       
  50.    I2C_write_byte(0x20);                        // 寄存器連續寫操作                                                       
  51.    for(i=0; i<8; i++)
  52.            {
  53.              I2C_write_byte(RDA_reg_data[i]);
  54.            }
  55.    I2C_stop();
  56. }

  57. /**********************************************************
  58. *******************連續讀寄存器子函數*********************/

  59. void RDA5807_read_reg(unsigned char *reg_buf)
  60. {
  61.            I2C_start();                                        // 收音模塊讀取操作   
  62.            I2C_write_byte(0x21);                         // 寄存器連續讀操作   
  63.            reg_buf[0] = I2C_read_byte(I2C_ACK);
  64.            reg_buf[1] = I2C_read_byte(I2C_ACK);
  65.            reg_buf[2] = I2C_read_byte(I2C_ACK);
  66.            reg_buf[3] = I2C_read_byte(I2C_NACK);
  67.         I2C_stop();
  68. }

  69. /**********************************************************
  70. ******************模塊上電初始化子函數********************/

  71. void RDA5807_power(void)
  72. {
  73.    delayms(50);                                     // 發送軟件復位指令,軟件復位
  74.    RDA_reg_data[0] = 0x00;
  75.    RDA_reg_data[1] = 0x02;
  76.    RDA5807_write_reg();                         //寫指令
  77.    delayms(10);                                            
  78.    RDA_reg_data[0] = 0xd2;                 // 收音模塊默認參數,上電使能
  79.    RDA_reg_data[1] = 0x01;
  80.    RDA5807_write_reg();                         //寫指令
  81. }

  82. /**********************************************************
  83. ******************FM信號顯示子函數********************

  84. void NowSignal()
  85. {
  86.         unsigned char sin;
  87.         unsigned char  reg_data1[4] = {0x00, 0x00, 0x00, 0x00};        //接收寄存初始化
  88.         RDA5807_read_reg(reg_data1);
  89.         delayms(20);
  90.         sin=(reg_data1[2]>>1)&0x7f;
  91.         WriteCommand(0x80);
  92.         if(sin<16)
  93.                 ShowChar(0x0,1);
  94.         else if(sin<32)
  95.                    ShowChar(0x0,2);
  96.         else if(sin<48)
  97.                 ShowChar(0x0,3);
  98.         else
  99.                 ShowChar(0x0,4);
  100. }

  101. **********************************************************
  102. ********************收音模塊自動尋臺子函數****************/

  103. void RDA5807_FM_seek(void)
  104. {
  105.            unsigned int chan;
  106.            unsigned char  reg_data[4] = {0x00, 0x00, 0x00, 0x00}; //接收寄存初始化
  107.           RDA_reg_data[3] &=~(1 << 4) ;                      //調諧禁用          
  108.            RDA_reg_data[0] |=  (1 << 0);                      //SEEK位置1 內部自動尋臺使能
  109.            RDA5807_write_reg();

  110.            while(0 == (reg_data[0]&0x40))                           // 讀寄存器直到SF 標志置0,自動搜臺結束
  111.            {
  112.              delayms(35);
  113.              RDA5807_read_reg(reg_data);                        // 讀取內部狀態
  114.            }
  115.         // 獲取當前工作頻點
  116.            chan = reg_data[0] & 0x03;                                 //READCHAN[9:8]
  117.            chan = reg_data[1] | (chan << 8);                //READCHAN[9:0]
  118.           chan = chan << 6;                                                  //READCHAN[15:6]
  119.                                                                        
  120.         // 保存當前工作頻點
  121.            RDA_reg_data[2] = (chan >> 8) & 0xff;        //chan高八位送03H[15:8]

  122.            RDA_reg_data[3] = (chan & 0xff);                //低位送03H[7:6]

  123. }

  124. /**********************************************************
  125. *********************頻率顯示子函數************************/

  126. void  show_frequency(void)
  127. {
  128.            unsigned int display[5];
  129.         unsigned int temp,i;

  130.            temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0);                 //xxxx xxxx oo00 0000
  131.            temp = temp>>6;                                                                                        //0000 00xx xxxx xxoo
  132.            frequency = (unsigned long)(100*temp+87000)/100;             //M/10
  133.        
  134.            display[0] = (frequency)/1000 ;                                             //百M最高位
  135.            display[1] = (frequency%1000)/100;                                          //十M位
  136.            display[2] = (frequency%100)/10;                                                           //個M位
  137.            display[3] = 10;                                                                  //小數點'.'
  138.            display[4] = (frequency%10);                                                           //ABC.X

  139.            if(display[0] == 0)
  140.            {
  141.              display[0] = display[1];
  142.              display[1] = display[2];
  143.              display[2] = display[3];
  144.              display[3] = display[4];
  145.              display[4] = 18;                                                                          //' '空格
  146.            }
  147.            for(i=0;i<5;i++)
  148.            Displayen(1,6,24+8*i,display[i])        ;                                         //頻率顯示
  149. }

  150. /**********************************************************
  151. *********************音量顯示子函數***********************/

  152. void show_volume()
  153. {
  154.            unsigned char temp,display0[2],i;

  155.            temp = RDA_reg_data[7] & 0x0f;                 //取音量值min0-max15
  156.     display0[0] = temp/10;
  157.            display0[1] = temp%10;
  158.            if(display0[0] == 0)                    //如果高位為0
  159.            {
  160.              display0[0] = display0[1];             //低位顯存內容進入高位顯存
  161.              display0[1] = 18;                   //低位不顯示
  162.            }
  163.           
  164.         for(i=0;i<2;i++)
  165.            Displayen(2,6,48+8*i,display0[i])        ;   //音量值顯示
  166. }

  167. /**********************************************************
  168. *********************按鍵掃描子函數***********************/

  169. void scan()
  170. {
  171.          unsigned char keyx;                                         //用來保存短按的值
  172.          P3=0xff;
  173.          if(!K1)
  174.      {
  175.        delayms(20);
  176.               while(!K1)
  177.                {
  178.                            TR0=1;                                                  //啟動定時器
  179.                            if(!timekey)
  180.                                 {
  181.                                         if(!fmkey)
  182.                                                 keyx=1;                                        //進入1狀態
  183.                                 }
  184.                         else        keyx=5;
  185.                         while(!K1);                                                //長按時間未到,頻道增加
  186.                 }
  187.                         if(count<15)
  188.                                 {
  189.                                         key=keyx;
  190.                                         TR0=0;                                        //關中斷 count清零
  191.                                         count=0;       
  192.                                 }
  193.                         else                                                        //長按則進入設置
  194.                                 {       
  195.                                           key=4;                                        //進入4狀態
  196.                                          timekey=~timekey;                //timekey=1,設置時間。0正常時鐘
  197.                                         count=0;
  198.                                         TR0=0;                                  //停止定時器
  199.                                 }
  200.             
  201.      }
  202.          if(!K2)
  203.      {
  204.        delayms(20);
  205.               while(!K2)
  206.                {
  207.                            TR0=1;                                                  //啟動定時器
  208.                            if(!fmkey)                                                //短按處理
  209.                         {
  210.                                 if(timekey)
  211.                                         keyx=6;                                                //進入6狀態 設置+
  212.                                 else
  213.                                 keyx=2;                                                //進入2狀態 音量加
  214.                         }
  215.                         else
  216.                         {
  217.                                  if(timekey)
  218.                                         keyx=6;                                                //進入6狀態 設置+
  219.                         }
  220.                                                   
  221.                         while(!K2);                                                //長按時間未到
  222.                        
  223.                 }

  224.                 if(count<15)
  225.                         {
  226.                                 key=keyx;
  227.                                 TR0=0;                                        //關中斷 count清零
  228.                                 count=0;       
  229.                         }
  230.                 else                                                        //長按則進入fm設置
  231.                         {       
  232.                                 key=8;
  233.                                 fmkey=~fmkey;                        //fmkey=1關FM,0開FM       
  234.                                 count=0;
  235.                                 TR0=0;                                  //停止定時器
  236.                         }
  237.               
  238.             
  239.      }

  240.      if(K3 == 0)
  241.      {
  242.        delayms(20);
  243.        while(K3 == 0)
  244.        {        TR0=1;
  245.                  if(!fmkey)
  246.                          {
  247.                            if(timekey)
  248.                                 keyx=7;                                                //進入7狀態 設置-
  249.                         else
  250.                            keyx=3;                                                //進入3狀態 音量減
  251.                         }
  252.                 else
  253.                    {
  254.                            if(timekey)
  255.                                 keyx=7;                                                //進入7狀態 設置-
  256.                    }
  257.                            while(K3 == 0);

  258.        }
  259.            if(count<15)
  260.                         {
  261.                                 key=keyx;
  262.                                 TR0=0;                                        //關中斷 count清零
  263.                                 count=0;       
  264.                         }
  265.                 else                                                        //長按則背光點亮
  266.                         {       
  267.                                 mimiflag=~mimiflag;       
  268.                                 count=0;
  269.                                 TR0=0;                                  //停止定時器
  270.                                
  271.                         }
  272.      }

  273.    

  274.          if(!K4)
  275.      {
  276.        delayms(20);
  277.               while(!K4)
  278.                {
  279.                            TR0=1;                                                  //啟動定時器       
  280.                         keyx=5;
  281.                         while(!K4);                                                //長按時間未到,頻道增加
  282.                 }
  283.                         if(count<15)
  284.                                 {
  285.                                         key=keyx;
  286.                                         TR0=0;                                        //關中斷 count清零
  287.                                         count=0;       
  288.                                 }
  289.                         else                                                        //長按則進入設置

  290.                                 {       
  291.                                           key=4;                                        //進入4狀態
  292.                                          timekey=~timekey;                //timekey=1,設置時間, timekey=0正常時鐘.
  293.                                         count=0;
  294.                                         TR0=0;                                  //停止定時器
  295.                                 }
  296.             
  297.      }
  298. }

  299. /**********************************************************
  300. ************************主函數***************************/

  301. void  main(void)
  302. {  

  303.         unsigned char i,j,flag,onedone,flash=15;        //閃爍標志的位置
  304.            TMOD=0X11;                                        //設置定時器0、1為工作方式1
  305.            TH0=0xb1;                                        //延時50ms
  306.            TL0=0Xe0;
  307.            EA=1;                                           //開總中斷
  308.            ET0=1;                                          //開定時中斷
  309.            ET1=1;
  310.            TR1=1;
  311.            InitLCD();                                        //lcd初始化
  312.         initdisplay();
  313.         Init_DS1302();                       //將1302初始化
  314.            Displaytime();                                 //初始化顯示時間
  315.            RDA5807_power();                                //收音機模塊上電
  316.            show_frequency();                        //顯示收音機頻率
  317.            show_volume();                                   //顯示聲音

  318.    while(1)
  319.    {
  320.    scan();
復制代碼



完整源程序下載:
單片機FM收音機資料.rar (359.18 KB, 下載次數: 358)

評分

參與人數 1黑幣 +5 收起 理由
zhaok2013 + 5 很給力!

查看全部評分

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

使用道具 舉報

沙發
ID:73762 發表于 2017-3-6 22:00 | 只看該作者
這個不錯哦,學習
回復

使用道具 舉報

板凳
ID:151348 發表于 2017-3-7 08:57 | 只看該作者
這個不錯,不但充分利用的單片機IO口,還提供了豐富的外設,相比于一些“最小系統”,高了幾個檔次
回復

使用道具 舉報

地板
ID:102293 發表于 2017-5-13 21:15 | 只看該作者
學習了,謝謝分享!
回復

使用道具 舉報

5#
ID:420310 發表于 2018-11-3 23:18 | 只看該作者
學習了,謝謝分享!
回復

使用道具 舉報

6#
ID:448822 發表于 2019-2-9 16:15 | 只看該作者
這個不錯哦,學習
回復

使用道具 舉報

7#
ID:475582 發表于 2019-2-10 19:55 | 只看該作者
很給力
回復

使用道具 舉報

8#
ID:475864 發表于 2019-2-12 11:48 | 只看該作者
這個不錯哦,學習
回復

使用道具 舉報

9#
ID:175749 發表于 2019-4-20 10:02 | 只看該作者
很不錯的資料,謝謝樓主
回復

使用道具 舉報

10#
ID:317472 發表于 2019-4-21 23:13 | 只看該作者
功能很完善了
回復

使用道具 舉報

11#
ID:353831 發表于 2020-1-23 23:17 來自手機 | 只看該作者
樓主你好,1602可以正常顯示嗎?
回復

使用道具 舉報

12#
ID:88256 發表于 2020-1-23 23:55 | 只看該作者
下載一個參考一下,謝謝了!
回復

使用道具 舉報

13#
ID:614068 發表于 2020-2-12 10:22 | 只看該作者
下載下來學習一下,謝謝樓主的無私分享
回復

使用道具 舉報

14#
ID:704585 發表于 2020-4-12 14:50 | 只看該作者
多謝樓主分享
回復

使用道具 舉報

15#
ID:582209 發表于 2020-6-9 12:11 來自手機 | 只看該作者
強啊樓主有pcb嗎?
回復

使用道具 舉報

16#
ID:462267 發表于 2020-6-23 06:51 | 只看該作者
垃圾,只有個圖片
回復

使用道具 舉報

17#
ID:771738 發表于 2020-6-27 20:00 | 只看該作者
很不錯的資料,謝謝樓主分享!
回復

使用道具 舉報

18#
ID:795562 發表于 2020-7-23 21:56 | 只看該作者
收藏備用,謝謝呢
回復

使用道具 舉報

19#
ID:666182 發表于 2020-7-24 20:52 | 只看該作者
功能就只有一個嗎  只能收聽嗎
回復

使用道具 舉報

20#
ID:666182 發表于 2020-7-24 20:54 | 只看該作者
功能只有一個嗎   只能聽嗎
回復

使用道具 舉報

21#
ID:823031 發表于 2020-9-25 09:05 | 只看該作者
能實現正常工作,結收也很穩定,感謝
回復

使用道具 舉報

22#
ID:823031 發表于 2020-9-25 09:06 | 只看該作者
功能很完美,能接收穩定信號,感謝分享
回復

使用道具 舉報

23#
ID:517951 發表于 2020-11-15 17:46 | 只看該作者
不錯,值得學習。51hei有你更精彩!!
回復

使用道具 舉報

24#
ID:641660 發表于 2020-12-6 14:34 | 只看該作者
本帖最后由 zcjwp520 于 2020-12-6 14:36 編輯

努力學習大神的技術,想搞一個單片機控制藍牙,收音機,多路Line輸入的前級,帶遙控,遙控可以切換音頻輸入,藍牙播放上一曲下一曲,暫停,播放,可以控制收音機收臺,總音量調整,低音高音調節等。要求1602顯示,不知道大神有沒有好的推薦,先謝謝了。
回復

使用道具 舉報

25#
ID:972895 發表于 2022-5-13 06:40 | 只看該作者
這個相當不錯,正想把原來的數碼管改為12864,謝謝分享!
回復

使用道具 舉報

26#
ID:325985 發表于 2022-5-13 19:59 | 只看該作者
用液晶代替LED數碼管要省好多電哦。挺好。學習。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 夜夜草 | 亚洲国产成人精品女人久久久野战 | 国产电影一区二区在线观看 | 91久久精品一区二区二区 | 国产精品高潮呻吟久久av黑人 | 久久久久久久国产精品影院 | 日日夜夜免费精品 | 五月婷婷色 | 日本午夜网站 | 久久草视频| 中文字幕成人在线 | 久久人人国产 | 日韩欧美亚洲 | 国产精品v| 欧美黄 片免费观看 | 能免费看的av | 麻豆va| 精品久久影院 | 狠狠干夜夜草 | 日韩av在线中文字幕 | 国产91在线 | 欧美 | 成人免费看黄网站在线观看 | 国产精品一区二区不卡 | 久久成人精品视频 | 亚洲日本乱码在线观看 | 亚洲精品久久久久久国产精华液 | 特一级毛片 | 午夜小视频在线观看 | 久久成人精品一区二区三区 | 特一级毛片| 久久神马 | 日日操日日舔 | 亚洲精品国产精品国自产在线 | 亚洲码欧美码一区二区三区 | 久久久久国产一区二区三区四区 | 91在线视频播放 | 欧美日韩中文字幕在线 | 欧美中文字幕在线 | 精品一区二区三区电影 | www.4虎影院| 一区二区三区四区日韩 |