FM收音机模块单片机实现
FM收音机模块例程说明
设计思路和方法:
TEA5767集成电路芯片是Philips公司推出的针对低电压应用的数字调谐FM立体声收音机芯片。它采用创新的收音机架构和小尺寸封装,外围电路简单,功能强大,可用单片机通过I2C总线或3-Wire总线对芯片内部寄存器进行控制。
本实验采用I2C总线对芯片内部寄存器进行控制,结合功能键、数码管、按键1、按键2等模块,完成收音机自动搜台、手动搜台、调节音量,并控制相关频率、音量在数码管上显示。
程序总框图设计流程如下所示:
电路原理图:
整个收音机包括音量调节模块实现电路:
收音机模块:
如图给出FM收音模块的一种微型贴片元件B-102BC模块图以及引脚功能表。
引脚 |
功能 |
引脚 |
功能 |
1 |
GND |
6 |
DATA |
2 |
L-OUT |
7 |
CLK |
3 |
R-OUT |
8 |
BUS MODE |
4 |
MPX |
9 |
W/R |
5 |
ANT |
10 |
VCC |
引脚(2)和引脚(3)分别是左右声道输出,引脚(4)MPX是FM解调器MPX信号输出,引脚(5)接天线,便携式产品中通常将耳机线作为天线。引脚(8)是通信总线类型选择输入端,使用I2C总线时,该引脚接地,引脚(9)不用,只使用引脚(6)和引脚(7)进行通信。采用3-Wire总线时,引脚(8)接高电平,使用引脚(6)、(7)和(9)。B-102BC应用模块与单片机采用I2C通信。
音量调节模块:
采用的是M62429芯片,内部集成调音电路,采用串行数据控制的方法,可以将音量控制在 0—83dB(1dB/step)之间 ,同时也以独立对每个声道音量进行控制。芯片内部电路截图如下:
按键电路模块:
按键1、2工作:
按键1、按键2按下去,引脚KEY1、KEY2输出低电平0。在按键1、2触发进行操作前要对其进行消抖的工作,延时一段时间判断按键1、2的输出电平,仍为0证明按键已经按下,完成消抖,对于按键1,按下期间显示音量(两位数码管),松开音量加1db;对于按键2,按下期间显示音量(两位数码管),松开音量减1db。
功能键工作:
通过A/D获取键值并进行判断,以区别“上”、“下”、“左”、“右”、“确认”五键。监听到监听到“上”键:手动设置频率(增),同时显示当前的频率;监听到“下”键:手动设置频率(减),同时显示当前的频率;监听到“左”键:自动搜索电台(增),同时显示当前的频率;监听到“右”键:自动搜索电台(减),同时显示当前的频率;监听到“确认”键:保存当前电台至存储器供下次上电时读取(增),同时关闭显示;
显示模块:(详见前面已经提供的8位数码管动态显示例程)
I/O引脚及相关寄存器配置
IO脚:
- 数码管使能引脚:
sbit led_sel = P2^3 ;
- 按键引脚:
sbit Key1=P3^2; //Key1对应触发外部中断0
sbit Key2=P3^3; //Key2对应触发外部中断1
sbit Key3=P1^7; //Key3
- EEPROM中IIC总线相关引脚:
sbit IIC_SDA=P4^0; //EEPROM中的SDA
sbit IIC_SCL=P5^5; //EEPROM中的SCL
- 收音机中IIC总线相关引脚:
sbit FM_CLK=P4^5;
sbit FM_DATA=P2^7;
- 音量调节相关引脚:
sbit Val_CLK=P2^5;
sbit Val_DATA=P2^6;
FM读写相关寄存器:
TEA5767内部有一个5字节的控制寄存器,通过对控制寄存器的操作可以设定或改变芯片的工作状态。TEA5767上电复位时默认为静音,控制寄存器所有位为低。当TEA5767HN通过I2C总线与外界交换数据时,TEA5767是从器件,当向TEA5767HN写入数据时,I2C总线地址是C0H,向TEA5767HN读出数据时,读地址是C1H。
(1)写控制寄存器
当向TEA5767HN写控制字时,按地址和写第1~5字节顺序进行。先写一个字节的最高位,在时钟下降沿写入的数据有效。下面简单介绍写模式字节的格式:
字节1格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
MUTE |
SM |
PLL13 |
PLL12 |
PLL11 |
PLL10 |
PLL9 |
PLL8 |
在自动搜台时SM置位1,表示搜索模式,手动的时候设置为0表示不在搜索模式。PLL13~PLL8:预置或搜索电台的频率数值的高6位。
字节2格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
PLL7 |
PLL6 |
PLL5 |
PLL4 |
PLL3 |
PLL2 |
PLL1 |
PLL0 |
PLL7~PLL0:预置或搜索电台的频率数值的低8位。
字节3格式
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
SUD |
SSL1 |
SSL0 |
HLSI |
MS |
ML |
MR |
SWP1 |
SUD:搜索方向设置。1向上搜索,0向下搜索。
字节4格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
SWP2 |
STBY |
BL |
XTAL |
SMUTE |
HCC |
SNC |
SI |
STBY:待机设置。1待机模式,待机时可减小工作电流。0非待机模式。
设置BL为0,表示中国FM波段与美欧接近波段设置。
设置XTAL为1对应晶振频率为32.768kHz。
字节5格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
PLLREF |
DTC |
- |
- |
- |
- |
- |
- |
(2)读控制寄存器
当向TEA5767读控制字时,同样先读地址,再按顺序读第1~5字节。读数据时的5个数据字节格式及含义如下。
字节1格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
RF |
BLF |
PLL13 |
PLL12 |
PLL11 |
PLL10 |
PLL9 |
PLL8 |
RF:Ready标志位。1表明发现一个电台或搜索到头,0表明未找到电台。在自动获取电台时,以该位为while循环的条件判断,直到搜到台停止对FM五个字节的读取。PLL13~PLL8:搜索或预置的电台频率值的高6位(需换算)。
字节2格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
PLL7 |
PLL6 |
PLL5 |
PLL4 |
PLL3 |
PLL2 |
PLL1 |
PLL0 |
PLL7~PLL0:搜索或预置的电台频率值的低8位(需换算)。
字节3格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
STEREO |
IF6 |
IF5 |
IF4 |
IF3 |
IF2 |
IF1 |
IF0 |
STEREO:立体声标志。1表示立体声,0表示单声道。IF6~IF0:中频(IF)计数器结果。
字节4格式:
B7(MSB) |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0(LSB) |
LEV3 |
LEV2 |
LEV1 |
LEV0 |
CI3 |
CI2 |
CI1 |
0 |
LEV3~LEV0:ADC输出电平。CI3~CI0:芯片识别,这些位必须置0
A/D获取键值相关寄存器:
P1ASF寄存器:
初始化时,设置P1ASF=P1_7_ADC(0x80),即P1.7口为模拟功能A/D使用;
ADC_RES寄存器:
初始化时,设置ADC_RES=0x00;
ADC_CONTR寄存器:
初始化时,设置ADC_CONTR = ADC_POWER | ADC_FLAG | ADC_START | ADC_SPEED_90 | ADC_CHS1_7,即对应位都值1,其中ADC_SPEED_90对应SPEED1、SPEED0均为1;ADC_CHS1_7对应CHS2、CHS1、CHS0均为1;
代码部分具体实现详见对应的工程文档。
FM读写五字节数据(IIC总线方式):
根据IIC总线协议:首先,总线在空闲的时候,数据线SDA因为有上拉电阻而为高电平;数据线只有在SCL为低时才能变化;SCL为高电平的时候,数据线变化只能是一次传输的起始或停止条件;关于应答信号,主机给从机写时(数据、地址)要应答(SDA为低电平);主机读从机时不需要应答(SDA为高电平)。
(1)起始条件:SCL为高电平,SDA由高电平变为低电平;
(2)停止条件:SCL为高电平,SDA由低电平变为高电平;
(3)一字节写:SCL为低电平,改变SDA的值,延时一小段时间,SCL为高电平,延时一小段时间,SCL为低电平,这完成1bit数据的写;在SCL为低的时候,重复上面的变化,完成一个字节的写;
(4)一字节读:SCL为低电平,延时一小段时间,SCL为高电平,延时一小段时间,保存SDA上电平高低,SCL为低电平,这完成1bit数据的读;重复上面的变化,完成一个字节的读;
(5)应答信号:在第9个时钟周期,检测SDA(从机占用)的电平,高电平表示非应答(只是延迟一时钟周期);低电平表示应答。
(6)五字节按序连续写:启动总线,开始发送从器件写地址(FM收音机模块地址0xc0),从器件应答,再连续按序发送五个字节数据(不同于写存储器),这里只须负责送入数据即可,模块内部决定数据送往哪儿,每个字节发完以后在第九个时钟周期要应答。停止总线。
(7)五字节按序连续读:启动总线,开始发送从器件读地址(FM收音机模块地址0xc1),从器件应答,再连续按序读取五个字节数据(不同于写存储器),每个字节发完以后不要应答在第九个时钟周期以延时替代。停止总线。
FM电台频率、PLL值计算:
(1)由电台频率计算PLL控制字
若已知电台频率为fR,本振频率为fL,TEA5767HN的中频频率fI为固定的225kHz。当写模式字节3的B4位HLSI=1时,采用高本振,fL=fR+fI,HLSI=0时,采用低本振,fL=fR-fI。PLL控制字由下式计算:
式中,频率单位采用kHz。NDEC计算出的是PLL的十进制控制字,编程时须换算成二进制或十六进制写入写模式字节1的低6位和写模式字节2,即可收听到目标电台信号。采用高本振时,取fR与fL相加,采用低本振时,取fR与fL相减。 fREF为参考频率,与芯片使用的晶振频率,XTAL位,PLLREF位设置有关,具体参见下表:
XTAL |
PLLREF |
参考频率 |
振荡频率 |
0 |
0 |
5kHz |
13MHz |
0 |
1 |
5kHz |
6.5MHz |
1 |
0 |
32.768 kHz |
32.768 kHz |
1 |
1 |
32.768 kHz |
32.768 kHz |
表中,13MHz和32.768 kHz为芯片通过控制寄存器XTAL位设置的晶体振荡器频率,6.5MHz为可选择的外部时钟参考频率。
(2)读取电台频率控制字,换算成十进制后显示电台频率
搜索到一个电台后,可以读出控制寄存器的5个字节数值,获得电台的所有信息。其中第1,2字节包含电台频率的PLL控制字二进制值。将其转化成十进制值,然后再利用下面的公式即可计算出电台实际频率。
式中,频率单位采用kHz。高本振时,括号中用减号,低本振时,括号中用加号。fR、fL、fI、fREF分别为电台频率、本振频率、中频频率、参考频率。将得出的fR送到LED数码管或LCD液晶即可显示出电台实际频率。
转载于:https://www.cnblogs.com/ct1104/p/3878260.html
FM收音机模块单片机实现相关推荐
- RDA5807 FM收音机模块
一. 简介 这是一个购自于淘宝网店的RDA5807调频接收模块,价格只有3块钱人民币.' RDA5807是一颗调频广播单芯片接收调谐芯片.只需要外部非常少的元器件,便可以组成一个完整的调频广播 ...
- FM收音机模块TEA5767介绍
介绍 [caption id="attachment_1171" align="alignnone" width="207"] TEA576 ...
- brew开发--FM 收音机
终于完成了自己在brew平台上的第一个项目--FM收音机.由于之前项目硬件的原因,项目组之前没有开发FM收音机模块.所以我得从最原始的需求开始,编写概要设计文档,接下来是详细设计,不过公司不用写详细设 ...
- 测试RDA5807收音机模块
一. 简介 这是一个购自于淘宝网店的RDA5807调频接收模块,价格只有3块钱人民币. RDA5807是一颗调频广播单芯片接收调谐芯片.只需要外部非常少的元器件,便可以组成一个完整的调频广播接 ...
- FM收音机ic FM发射模块SX6116
原文地址::http://china.coovee.net/business1/detail/12753421.html 相关文章 1.HS6760 FM调频发射端芯片 SSOP-10封装----ht ...
- 使用TEA5767和stm32制作一台数字FM收音机
本节我们来使用stm32控制一款集成收音机芯片TEA5767,来制作一台FM收音机. TEA5767是一款低功耗立体声收音IC,接收频率76MHz-108MHz(适应日本/美国/欧洲各FM频段选择)并 ...
- 50行实现C语言FM收音机-Taskbus Stdio封装器在SDR课程中的应用
自从学校引入SDR教学以来,总觉得学生的实验课上的很吃力--还不如学习Matlab仿真算了.原因是编程基础不是很扎实的学生,可能只会使用C语言课上介绍的最基础的知识,这些知识往往无法支持其完成完整的S ...
- 基于RTL—SDR及Simulink的FM收音机仿真
在有了一些rtl-sdr基础,并学习了一些通信系统建模与仿真原理后,便利用rtl-sdr模块在Simulink上进行FM收音机仿真. 目录 一.知识储备 SDR-Receiver模块原理 电台AM-D ...
- ESP32设备驱动-TEA5767收音机模块驱动
TEA5767收音机模块驱动 1.TEA5767介绍 TEA5767HN 是一款用于低压应用的单芯片电子调谐 FM 立体声收音机,具有完全集成的中频 (IF) 选择性和解调功能,频率范围从76-108 ...
最新文章
- android 事件驱动编程,跟我学android之四 事件驱动模型
- Eclipse中SVN的安装步骤(两种)和用法
- sudo规则支持正则
- VTK:图表之DirectedGraphToMutableDirectedGraph
- Flink流计算编程--在WindowedStream中体会EventTime与ProcessingTime
- primefaces_使用PrimeFaces开发数据导出实用程序
- php base64尺寸,PHP base64编码的图像显示不正确
- webstorm 创建react组件_webstorm的下载以及React环境搭建
- hashmap是线程安全的吗?怎么解决?_线程安全及三种解决方案
- Html.Partial vs Html.RenderPartial&Html.Action vs Html.RenderAction
- JS设为首页、添加到收藏夹
- CentOS 5 常见的configure error的解决方法
- 用NE555的延时电路
- 在日软件工程师的远虑近忧
- Servlet学习记录2
- 基于CNN的人脸 性别、年龄识别
- 关于D3D9 Stretchrect
- 计算机分享硬盘,共享磁盘是什么怎么设置
- SimpleRemote -开源的远程连接管理工具
- android登录界面优化,Android 对登陆页面的美化(一)
热门文章
- 项目开发计划书_100个知识点—商业计划书
- java jtextfield清空_java – 当鼠标点击JTextField时如何清除JTextField
- java webclient使用_Spring WebClient使用
- rk3368 Android9.0调试记录之系统分区调整
- 瑞芯微rk3368(px5)编译环境搭建
- ma5822是什么设备_MA5822 配置二层交换
- nginx状态码详解
- 产品解读丨鸿翼ISO质量体系文件管理系统 合规 安全 高效
- 一文快速搞懂对95%置信区间的理解
- 2016款touchbar RX560显卡笔记本电脑安装双系统以及安装显卡驱动