数码之家

 找回密码
 立即注册
搜索
查看: 1075|回复: 28

[C51] 使用STC8G1K08A硬件I2C控制RDA5807FP的简易FM收音机

[复制链接]
发表于 2025-4-10 00:11:27 | 显示全部楼层 |阅读模式
最开始对RDA5807FP不太了解,就先尝试用Arduino Pro mini小板的的I2C(A4和A5脚)控制,
开始找了1个库的样例代码,跑不成功,老是在setup里面重复,进不了loop,也不知道啥原因。
换另外1个库的样例代码,一下子就响了。稀里糊涂的,也不知道库代码都干了啥。
之前有用软件模拟I2C控制过大众CD机的,了解到STC单片机的好多型号都有硬件I2C了,那就测试一下吧。

折腾了好几天,一直整不响,没有示波器,也没有逻辑分析仪,也不知道问题出在哪儿,都快放弃了,最后还是坚持尝试,终于成功。

踩了好几个坑,主要有以下几点:
(1)I2C输出的引脚应该配置为准双向口,默认是高阻,无法输出。
(2)最开始按键使用的是INT0外部中断(P3.2),引脚与配置的I2C引脚冲突,后面改成使用INT2。

实物如下:有三层,最底下是PAM8403功放模块,上面音量旋钮是带开关的,中间是RDA5807FP小板,上面有个LED是立体声指示灯,那根红色单独的电线是天线,随意找的,长度大概20厘米。
最上面是STC8G1K08A单片机小板,用了个鼠标微动开关作为按键。


使用的是这样的喇叭,用PAM8403带挺合适,音效还不错。



电路如下(已成功制作实物,并能正常搜台)



下面是C代码,比较简洁,当然功能也简洁,只有一个搜台按钮。
STC8G1K08A剩余3个引脚,还可以增加其他功能按键,有兴趣的自己扩充吧。
  1. //
  2. // RDA5807FP+STC8G1K08A硬件I2C控制测试
  3. // 晶振 4 MHz
  4. // 电源:DC5V
  5. // STC8G1K08A的SCL(P3.2)接RDA5807FP的SCL(7脚), SDA(P3.3)接RDA5807FP的SDA(8脚),RDA5807FP已经内置IIC上拉电阻。
  6. // 单一个按键向上搜台,按键接P5.4和GND之间,并一个103电容
  7. // 音频功放采用带音量点位器的PAM8403小功放板。
  8. // BY:XIAOCAKE 2025/04/09
  9. //
  10. #include "STC\STC8H.H"
  11. #define DevAddrW 0x22 //RDA5087FP 标准I2C写地址
  12. typedef unsigned char uint8;
  13. typedef unsigned short int uint16;
  14. void Wait()
  15. {
  16.     while (!(I2CMSST & 0x40));
  17.     I2CMSST &= ~0x40;
  18. }
  19. void Start()
  20. {
  21.     I2CMSCR = 0x01; //发送START命令
  22.     Wait();
  23. }
  24. void SendData(char dat)
  25. {
  26.     I2CTXD = dat; //写数据到数据缓冲区
  27.     I2CMSCR = 0x02; //发送SEND命令
  28.     Wait();
  29. }
  30. void RecvACK()
  31. {
  32.     I2CMSCR = 0x03; //发送读ACK命令
  33.     Wait();
  34. }
  35. void Stop(void)
  36. {
  37.     I2CMSCR = 0x06; //发送STOP命令
  38.     Wait();
  39. }
  40. void Delay1ms(void) //@4MHz
  41. {
  42.     uint8 i, j;
  43.     i = 4;
  44.     j = 225;
  45.     do
  46.     {
  47.         while (--j);
  48.     } while (--i);
  49. }
  50. void Delay(uint16 n)
  51. {
  52.     uint16 i;
  53.     for (i=0; i<n; i++)
  54.     {
  55.         Delay1ms();
  56.     }
  57. }
  58. void RDA5807N_SendRegData(uint8 addrw, uint8 RegAddr ,uint8 DATH ,uint8 DATL )
  59. {
  60.     Start(); //发送起始命令
  61.     SendData(addrw); //发送设备地址+写命令
  62.     RecvACK();
  63.     SendData(RegAddr); //发送寄存器地址
  64.     RecvACK();
  65.     SendData(DATH); //发送寄存器内容高字节
  66.     RecvACK();
  67.     SendData(DATL); //发送寄存器内容低字节
  68.     RecvACK();
  69.     Stop(); //发送停止命令
  70. }
  71. void RDA5807N_PowerOn(void)
  72. {
  73.     RDA5807N_SendRegData(DevAddrW,0x02,0xD0,0x01); //开机,开启低音增强
  74.     Delay(70);
  75.     RDA5807N_SendRegData(DevAddrW,0x04,0x04,0x10); //GPIO3 设置为立体声指示输出
  76.     Delay(70);
  77.     RDA5807N_SendRegData(DevAddrW,0x05,0x88,0x8A); //音量设置为10(最大是15)
  78. }
  79. void RDA5807N_SeekUp(void) //向上搜索
  80. {
  81.     RDA5807N_SendRegData(DevAddrW,0x02,0xD3,0x01);
  82. }
  83. void INT2_Isr(void) interrupt 10 //INT2中断. 搜台按键接P5.4,按键上并个103电容
  84. {
  85.     RDA5807N_SeekUp(); //中断唤醒后就发送向上搜台命令
  86.     Delay(60);
  87. }
  88. void main(void)
  89. {
  90.     P3M0 = 0x00;
  91.     P3M1 = 0x00;
  92.     P5M0 = 0x00;
  93.     P5M1 = 0x00;                //P3 ,P5所有端口设置为准双向口
  94.     INTCLKO = 0x10; //使能INT2中断
  95.     EA = 1;
  96.     P_SW2 = 0x80; //I2C引脚设置为 SDA:P3.3 + SCL:P3.2针对STC8G1K08(A)8脚系列, 其余单片机对应的是 SDA:P1.4 + SCL:P1.5
  97.     I2CCFG = 0xC2; //使能I2C主机模式, 晶振4Mhz,Mspeed = 2 ,Mspeed可以调大一些。
  98.     RDA5807N_PowerOn(); //RDA5807N开机初始化
  99.     Delay(60);
  100.     RDA5807N_SeekUp(); //发送自动搜台命令
  101.     while(1)
  102.     {
  103.         Delay(60);
  104.         PCON = PD; //进入掉电模式,等待按键中断唤醒
  105.     }
  106. }
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +171 收起 理由
南宁谢工 + 21 優秀文章
IlovePLC + 30
t3486784401 + 30 優秀文章
不长叶子的树 + 90

查看全部打赏

发表于 2025-4-10 01:13:34 | 显示全部楼层
只有STC老鸟才会踩这个坑,不配置IO不工作
回复 支持 反对

使用道具 举报

发表于 2025-4-10 07:11:25 来自手机浏览器 | 显示全部楼层
楼主,帮忙验证一下这种纯按键控制的,https://blog.csdn.net/m0_63235356/article/details/143717129
说实话,你这用了单片机,应该多弄几个按钮,1键直达固定频率才对,这样便于送给老年人用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-10 07:43:38 来自手机浏览器 | 显示全部楼层
jxf269 发表于 2025-4-10 07:11
楼主,帮忙验证一下这种纯按键控制的,https://blog.csdn.net/m0_63235356/article/details/143717129
说实 ...

纯按键控制的我早验证过啦,只要接线没错,就是免调试的,一装就响的,主要要注意的就是6脚要接到VDD。
另外我用单片机控制只是为了试验I2C通讯,只要响了就算达到目的了。要像你说的更加方便,除了增加按键,还得加个屏幕什么的吧,那要做的事要写的代码还不少呢
回复 支持 反对

使用道具 举报

发表于 2025-4-10 08:50:22 | 显示全部楼层
我也买了一些8K1G的芯片,给孩子做玩具
回复 支持 反对

使用道具 举报

发表于 2025-4-10 09:21:20 | 显示全部楼层
写的不错。5807几个脚gnd内部连通,有区别的,有模拟地和数字地。最好都在外面接地。
回复 支持 反对

使用道具 举报

发表于 2025-4-10 13:15:33 来自手机浏览器 | 显示全部楼层
xiaocake 发表于 2025-4-10 07:43
纯按键控制的我早验证过啦,只要接线没错,就是免调试的,一装就响的,主要要注意的就是6脚要接到VDD。
...

谢谢回复,我一直想买,就怕验证不过。
我感觉不用屏幕,用电阻串联型AD电路,根据输入端的电压,来对应将要执行的动作,不会有多少代码。
回复 支持 反对

使用道具 举报

发表于 2025-4-10 14:42:49 | 显示全部楼层
jxf269 发表于 2025-4-10 13:15
谢谢回复,我一直想买,就怕验证不过。
我感觉不用屏幕,用电阻串联型AD电路,根据输入端的电压,来对应 ...

不用mcu 音量调节比较蛋疼,只有5级。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-10 17:14:35 来自手机浏览器 | 显示全部楼层
jxf269 发表于 2025-4-10 13:15
谢谢回复,我一直想买,就怕验证不过。
我感觉不用屏幕,用电阻串联型AD电路,根据输入端的电压,来对应 ...

放心买吧,买回来就能愉快的玩耍了。也就几块钱的事,我记得是5个5块还包邮的
回复 支持 反对

使用道具 举报

发表于 2025-4-11 00:49:20 | 显示全部楼层
kkstun 发表于 2025-4-10 14:42
不用mcu 音量调节比较蛋疼,只有5级。

就算用MCU,音量调节也不好用,音量0都还有声音,音量1已经很大声了。
回复 支持 反对

使用道具 举报

发表于 2025-4-11 08:04:14 | 显示全部楼层
mmxx2015 发表于 2025-4-11 00:49
就算用MCU,音量调节也不好用,音量0都还有声音,音量1已经很大声了。

mcu调有15级。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-12 10:48:02 | 显示全部楼层
mmxx2015 发表于 2025-4-11 00:49
就算用MCU,音量调节也不好用,音量0都还有声音,音量1已经很大声了。

所以我测试时用了电位器,完美避开了你说的问题
回复 支持 反对

使用道具 举报

发表于 2025-4-12 20:45:53 | 显示全部楼层
刚打了板子做这个收音机,不过我没加单片机,后续看情况,能不能用单片机驱动起来玩。
回复 支持 反对

使用道具 举报

发表于 2025-4-14 01:28:33 | 显示全部楼层
厉害,要软硬件都会才能弄这个
回复 支持 反对

使用道具 举报

发表于 2025-4-14 23:23:29 | 显示全部楼层
xiaocake 发表于 2025-4-10 07:43
纯按键控制的我早验证过啦,只要接线没错,就是免调试的,一装就响的,主要要注意的就是6脚要接到VDD。
...

一开始我也有类似的疑惑,都上单片机了,至少要有屏,哪怕是数码管也好吧,毕竟不用单片机的情况下,纯按键就能实现开关机、搜台、音量调节的,甚至不接功放就能推动小点的扬声器,唯一的不便就是搜台是纯盲搜。
如果只是做功能验证,那就理解了
回复 支持 反对

使用道具 举报

发表于 2025-4-14 23:31:08 | 显示全部楼层
jxf269 发表于 2025-4-10 07:11
楼主,帮忙验证一下这种纯按键控制的,https://blog.csdn.net/m0_63235356/article/details/143717129
说实 ...

不用验证,直接打板或者买套件就行了,5807的纯按键方案,已经有很多做无屏小收音机或者三轮车收音机的厂家还有爱折腾的人验证过了,我最开始也是想自己打板自己买料,但算算不划算,最终是某宝上买了那种分立件的套件,回来焊起来,又找了个老门铃的外壳和老年机的喇叭,把供电从套件的两节5号换成了7号,然后天线先是内部绕了个漆包线的,后来捡到一个带小天线的卷闸门遥控器,就又把那玩意的小拉杆天线给续到了漆包线的尾巴上,做了一个床头小收音机。
RDA5807小收音机
回复 支持 反对

使用道具 举报

发表于 2025-4-15 00:44:52 | 显示全部楼层
厉害了!之前玩这种迷你单片机玩的Atmel的,Attiny85或者贴片型的ATmega328/168之类的,那个有硬件IIC、ADC和SPI,但也贵不少
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-15 08:50:38 | 显示全部楼层
1325133 发表于 2025-4-14 23:23
一开始我也有类似的疑惑,都上单片机了,至少要有屏,哪怕是数码管也好吧,毕竟不用单片机的情况下,纯按 ...

是呀,可以使用I2C接口的OLED屏,硬件连接就比较简单了,直接挂在现有I2C总线上就行。然后主要就是软件部分会费点脑筋。
目前我手上只有1个12864屏(看引脚标识有CS1和CS2,所以猜测是KS1018主控),主要这个屏引脚太多,这个8脚单片机直接应付不来,我也就没动手。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-15 08:53:55 | 显示全部楼层
bg4jkl 发表于 2025-4-10 08:50
我也买了一些8K1G的芯片,给孩子做玩具

应该让孩子自己做玩具,你只管挣钱养家就好
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-15 09:13:45 | 显示全部楼层
beluga98 发表于 2025-4-15 00:44
厉害了!之前玩这种迷你单片机玩的Atmel的,Attiny85或者贴片型的ATmega328/168之类的,那个有硬件IIC、ADC ...

开始我玩的那个Arduino小板的主控好像就是Atmega328,因为直接用的样例代码,我还不了解这个单片机
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 02:27 , Processed in 0.124800 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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