STM32笔记-FM收音机
程序员文章站
2024-02-25 14:38:39
...
FM的收音机制作比较简单,只用一个芯片就可以实现,代码也比较简单,芯片选用的RDA5807或者RDA5807M,两者稍有区别,主要在复位方面,RDA5807M少一个vio引脚,无法进行软件复位,在买芯片后厂家会提供51的库代码,我们只需要移植一下就可以使用了,在使用中,我们需要插上耳机插孔作为天线,下面贴上芯片外围和连接MCU的电路和操作的函数代码(比较简单,函数也比较易懂,只需要读懂寄存器就行),同时还需要加个功率放大器。
外围电路:
功放电路(比较随意),大部分用D类功放,功耗低
可以发现单片机就起个控制作用,使用的协议是IIC协议(给的库是模拟的),代码和电路都十分简单,下面把主函数的代码贴上:(通过按键来调节选频,可以用串口助手显示目前频段,厂家库中给的比较全)
int main(void)
{
RDA5807_FM_Test();
}
void RDA5807_FM_Test(void)
{
/* config the led */
LED_GPIO_Config();
LED1( ON );
LED2( ON );
/*config key*/
Key_GPIO_Config();
SysTick_Init();
USART1_Config();
printf("\r\n rda5807m 测试实验 \r\n");
if ( i2c_CheckDevice(RDA5807M_SLAVE_ADDRESS) == 0 )
{
printf("\r\n rda5807m 检测成功 \r\n");
}
else
{
printf("\r\n rda5807m 检测不成功 \r\n");
}
RDA5807_power();
printf("\r\n 上电成功 \r\n");
RDA_reg_data[7] = 140; // 05H寄存器低四bit 改变音量
RDA5807_write_reg();
temp = RDA_reg_data[7] & 0xff; //取音量值
printf("当前音量为%d" , temp);
RDA_reg_data[0] |= (1 << 1); //SEEK UP
RDA5807_FM_seek(); //自动寻台
while(1)
{
if( Key_Scan(GPIOC,GPIO_Pin_13) == KEY_ON )
{
RDA_reg_data[0] &= ~(1 << 1); //向下搜台
RDA5807_FM_seek(); //自动寻台
/*反转*/
GPIO_WriteBit(GPIOB, GPIO_Pin_0,
(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_0))));
}
if( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON )
{
RDA_reg_data[0] |= (1 << 1); //向上搜台
RDA5807_FM_seek(); //自动寻台
/*反转*/
GPIO_WriteBit(GPIOF, GPIO_Pin_7,
(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_7))));
}
}
}
其中的按键和定时函数不再写,比较好理解。