找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19641|回复: 12
收起左侧

学51单片机做了一个RDA5807M的FM收音机-但杂音大

  [复制链接]
ID:192216 发表于 2017-6-16 14:50 | 显示全部楼层 |阅读模式
学51单片机做了一个RDA5807M的FM收音机-但杂音大,不知道是哪问题,杂音真的很大,是不是程序出问题了?程序是在网络上下载的,电路装好后就可以有声音了。

20170606_210755.jpg 20170606_210806.jpg 20170606_210847.jpg 20170616_142814.jpg 20170616_142825.jpg 20170616_142832.jpg 20170616_142839.jpg 20170616_142939.jpg 2017-06-16_144655.jpg

  1. /*****************************************************************
  2. *                                                                *
  3. * ME850单片机开发系统扩展应用 -  收音模块演示程序               *
  4. *                                                                *
  5. * MCU 芯片: AT89S52      工作频率: 11.0592MHz                    *
  6. *                                                                *
  7. *【版权】Copyright(C) 深圳硕飞科技有限公司  All Rights Reserved  *
  8. *【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      *
  9. *                                                                *
  10. ******************************************************************
  11. *                                                                *
  12. *  K1--- 向上搜索电台 K2--- 向下搜索电台                         *
  13. *  K3--- 音量加       K4--- 音量减                               *
  14. *                                                                *
  15. *****************************************************************/

  16. #include <reg51.h>         
  17. #include <intrins.h>
  18. //#include "lcd.h"
  19. #include "IIC.h"
  20. #include "delay.h"

  21. sbit  K1 = P3^2;
  22. sbit  K2 = P3^3;
  23. sbit  K3 = P3^4;
  24. sbit  K4 = P3^5;

  25. unsigned long frequency;

  26. // RDA5807 寄存器
  27. unsigned char  RDA_reg_data[8] =
  28. {
  29.    0xd0,0x00,  // 02H
  30.    0x00,0x00,  // 03H
  31.    0x00,0x40,  // 04H
  32.    0x90,0x88,  // 05H
  33. };

  34. //unsigned char code  cdis1[ ] = {"FM STEREO RADIO "};
  35. //unsigned char code  cdis2[ ] = {"FM       VOL    "};

  36. char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节

  37. #define uchar unsigned char
  38. #define uint  unsigned int

  39. /**********************************************************

  40. 连续写寄存器子函数

  41. **********************************************************/
  42. void RDA5807_write_reg(void)
  43. {
  44.    uchar i;

  45.    I2C_start();
  46.     // 收音模块写入操作
  47.    I2C_write_byte(0x20);
  48.     // 寄存器连续写操作
  49.    for(i=0; i<8; i++)
  50.    {
  51.      I2C_write_byte(RDA_reg_data[i]);
  52.    }
  53.    I2C_stop();
  54. }

  55. /**********************************************************

  56. 连续读寄存器子函数

  57. **********************************************************/
  58. void RDA5807_read_reg(uchar *reg_buf)
  59. {
  60.    I2C_start();

  61.     // 收音模块读取操作
  62.    I2C_write_byte(0x21);

  63.     // 寄存器连续读操作
  64.    reg_buf[0] = I2C_read_byte(I2C_ACK);
  65.    reg_buf[1] = I2C_read_byte(I2C_ACK);
  66.    reg_buf[2] = I2C_read_byte(I2C_ACK);
  67.    reg_buf[3] = I2C_read_byte(I2C_NACK);

  68.    I2C_stop();
  69. }

  70. /**********************************************************

  71. 模块上电初始化子函数

  72. **********************************************************/
  73. void RDA5807_power(void)
  74. {
  75.    delayms(50);

  76.     // 发送软件复位指令
  77.    RDA_reg_data[0] = 0x00;
  78.    RDA_reg_data[1] = 0x02;
  79.    RDA5807_write_reg();

  80.    delayms(10);

  81.     // 收音模块默认参数
  82.    RDA_reg_data[0] = 0xd0;
  83.    RDA_reg_data[1] = 0x01;
  84.    RDA5807_write_reg();
  85. }
  86. /**********************************************************

  87. 功能描述:收音模块自动寻台模式

  88. **********************************************************/
  89. void RDA5807_FM_seek(void)
  90. {
  91.    uint chan;
  92.    uchar  reg_data[4] = {0x00, 0x00, 0x00, 0x00};

  93.    RDA_reg_data[3] &= ~(1 << 4);      //调谐禁用

  94.    // 内部自动寻台使能
  95.    RDA_reg_data[0] |=  (1 << 0);      //SEEK位置1
  96.    RDA5807_write_reg();

  97.     // 等待STC 标志置位
  98.    while(0 == (reg_data[0] & 0x40))
  99.    {
  100.      delayms(20);
  101.       // 读取内部状态
  102.      RDA5807_read_reg(reg_data);
  103.    }
  104.     // 获取当前工作频点
  105.    chan = reg_data[0] & 0x03;
  106.    chan = reg_data[1] | (chan << 8);
  107.    chan = chan << 6;

  108.     // 保存当前工作频点
  109.    RDA_reg_data[2] = (chan >> 8) & 0xff;
  110.    RDA_reg_data[3] = (chan & 0xff);
  111. }
  112.    #include<stdio.h>
  113. void        mInitSTDIO( void )
  114. {        /* 仅用于调试用途及显示内容到PC机,与该程序功能完全无关,为printf和getkey输入输出初始化串口 */
  115.         SCON = 0x50;
  116.         PCON = 0x80;
  117.         TMOD = 0x20;
  118.         TH1  = 0xfd;  /* 11.0592MHz晶振, 19200bps */
  119.         TR1  = 1;
  120.         TI   = 1;
  121. }


  122. /**********************************************************

  123. 频率显示子函数

  124. **********************************************************/
  125. /*void  show_frequency(void)
  126. {
  127.   // unsigned char i,display[5];
  128.    unsigned int  temp;
  129.       double temp1;


  130.    temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0);         //计算
  131.    temp = temp>>6;
  132.    frequency = (unsigned long)(100*temp+87000)/100;

  133.    temp1=  (double)frequency/10.0;

  134.    printf("the fz=%.1fM\n",temp1) ;

  135.    /*for(i=0; i<5; i++)  // 清显存单元
  136.    display[i] = 0x00;

  137.    display[0] = (frequency)/1000 ;     //数据转换
  138.    display[1] = (frequency%1000)/100;
  139.    display[2] = (frequency%100)/10;
  140.    display[3] = 0x2e;                  //小数点
  141.    display[4] = (frequency%10);

  142.    if(display[0] == 0)
  143.    {
  144.      display[0] = display[1]+0x30;
  145.      display[1] = display[2]+0x30;
  146.      display[2] = display[3];
  147.      display[3] = display[4]+0x30;
  148.      display[4] = 0x20;
  149.    }
  150.    else
  151.    {
  152.      display[0] += 0x30;
  153.      display[1] += 0x30;
  154.      display[2] += 0x30;
  155.      display[4] += 0x30;
  156.    }

  157.    lcd_pos_xy(3,2);                      //频率显示
  158.    lcd_wdat(display[0]);
  159.    lcd_wdat(display[1]);
  160.    lcd_wdat(display[2]);
  161.    lcd_wdat(display[3]);
  162.    lcd_wdat(display[4]); */
  163. //}
  164.               
  165. /**********************************************************

  166. 音量显示子函数

  167. **********************************************************/
  168. /*void show_volume()
  169. {
  170.    unsigned int  temp;

  171.    temp = RDA_reg_data[7] & 0x0f; //取音量值

  172.    printf("the voice=%d\n",temp);

  173.   /* display[0] = temp/10;
  174.    display[1] = temp%10;

  175.    if(display[0] == 0)            //如果高位为0
  176.    {
  177.      display[0] = display[1];     //低位显存内容进入高位显存
  178.      display[1] = 0x20;           //低位不显示
  179.    }
  180.    else
  181.    {
  182.      display[1] += 0x30;
  183.    }
  184.    display[0] += 0x30;

  185.    lcd_pos_xy(13,2);              //音量值显示
  186.    lcd_wdat(display[0]);
  187.    lcd_wdat(display[1]); */

  188. //}                                   

  189. /**********************************************************

  190. 主函数

  191. **********************************************************/
  192. void  main(void)
  193. {  
  194.    RDA5807_power();
  195.    mInitSTDIO();

  196.    while(1)
  197.    {
  198.      if(K1 == 0)
  199.      {
  200.        delayms(20);
  201.        if(K1 == 0)
  202.        {
  203.          RDA_reg_data[0] |= (1 << 1);         //SEEK UP         
  204.          RDA5807_FM_seek();                  
  205.          while(K1 == 0);
  206.        }
  207.      }

  208.      if(K2 == 0)
  209.      {
  210.        delayms(20);
  211.        if(K2 == 0)
  212.        {
  213.          RDA_reg_data[0] &= ~(1 << 1);  //SEEK DOWN                 
  214.          RDA5807_FM_seek();
  215.          while(K2 == 0);
  216.        }
  217.      }

  218.      if(K3 == 0)
  219.      {
  220.        delayms(20);
  221.        if(K3 == 0)
  222.        {
  223.          if((RDA_reg_data[7] & 0x0f) < 0x0f)
  224.          {
  225.            RDA_reg_data[0] = 0xd0;
  226.            RDA_reg_data[1] = 0x01;
  227.            RDA_reg_data[3] &= ~(1 << 4);

  228.            RDA_reg_data[7]++;         // 音量递增
  229.            RDA5807_write_reg();
  230.                    while(K3 == 0);
  231.          }
  232.        }
  233.      }

  234.      if(K4 == 0)
  235.      {
  236.        delayms(20);
  237.        if(K4 == 0)
  238.        {
  239.          if((RDA_reg_data[7] & 0x0f) > 0x00)
  240.          {
  241.            RDA_reg_data[0] = 0xd0;
  242.            RDA_reg_data[1] = 0x01;
  243.            RDA_reg_data[3] &= ~(1 << 4);
  244.            
  245.            RDA_reg_data[7]--;         // 音量递减
  246.            RDA5807_write_reg();
  247.            while(K4 == 0);
  248.          }
  249.        }
  250.      }

  251.                      delayms(200);
  252. //    show_volume();
  253. //    show_frequency();
  254.    }
  255. }

  256. /*********************************************************/

复制代码



全部资料下载地址:
RDA5807M-FM程序.rar (39.17 KB, 下载次数: 255)
回复

使用道具 举报

ID:96682 发表于 2017-6-16 19:11 | 显示全部楼层
可以这么说,使用这种电源较使用纯直流的电池简直是没法比

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:162582 发表于 2017-6-19 18:00 | 显示全部楼层
首先你不能使用充电器供电,其次用电池供电也要加滤波电容。最后你的功放要去掉。我用tea5767做的也是这样
回复

使用道具 举报

ID:448994 发表于 2019-3-2 19:49 | 显示全部楼层
能求电路图吗
回复

使用道具 举报

ID:659397 发表于 2020-1-20 10:49 | 显示全部楼层
对,就像楼上说的,先把电源改成电池;接着去掉功放,因为RDA5807有耳机驱动能力
回复

使用道具 举报

ID:1025655 发表于 2023-12-26 11:14 | 显示全部楼层
FM的天线呢?实物上没看到哟!
回复

使用道具 举报

ID:1025655 发表于 2023-12-26 11:15 | 显示全部楼层
FM的天线呢?实物上面看不到呀!
回复

使用道具 举报

ID:774081 发表于 2023-12-29 15:18 | 显示全部楼层
最大的原因是没有焊接天线。。。
回复

使用道具 举报

ID:712493 发表于 2023-12-29 15:46 | 显示全部楼层
实际要分清什么杂音,或说是杂音  还是噪音
回复

使用道具 举报

ID:1085441 发表于 2024-1-25 17:41 | 显示全部楼层
杂音大除了天线原因,还有可能是调谐频率不准,您的频率控制字对吗?
回复

使用道具 举报

ID:524818 发表于 2024-1-26 10:47 | 显示全部楼层
用充电头做电源应该不行,换成电池吧
回复

使用道具 举报

ID:195496 发表于 2024-4-11 08:27 | 显示全部楼层
折腾才有快乐
回复

使用道具 举报

ID:71233 发表于 2024-4-12 19:43 | 显示全部楼层
信号一般的地方,天线必须长些,像我这里,即使天线很长,还是比不上以前那种分立元件调频收音机。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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