设计与实现
摘 要
现在人们常使用的收音机为手动调频收台,使用较为麻烦,而且由于接收灵敏度不高,所接收的频段较窄。TEA5767具有高性能的RF AGC电路,其接收灵敏度高、参考频率选择灵活、可实现自动搜台。本课题采用STCC52单片机和TEA5767为核心器件,用I2C通信方式联接单片机与TEA5767,实现数字FM收音机系统。通过编写软件利用单片机控制TEA5767实现手动活自动调频,收到的信号通过TAD2822功放器件放大后,再用扬声器输出信号。在调频的过程中可以通过LCD1602液晶显示屏来随时查看信号的频率。
关键词:数字调频; STCC52; TEA5767; TDA2030
ABSTRACT
Nowadays people usually use the radio for manual FM accept , it is much trouble, and because the rx sensitivity is not high, the frequency band received is very narrow。TEA5767 has high-performance RF AGC circuit, high sensitivity receiving, reference frequency selection flexible and it can be the realization of automatic search platform。So in this designing I will use the STCC52 single-chip microcomputer and TEA5767 as the core components of digital FM radio system and Use the I2C communication to connect between STCC52 and TEA5767 chip。Through the software written and using single chip computer control TEA5767 achieve manually live to be automatic FM, received signal through the TAD2030 amplifier amplification device, then use the speaker output the signal。In the process of FM the frequency of the signal can be checked by LCD1602 。
Key words:Digital FM; STCC52; TEA5767; TAD2030
绪论
虽然手机、计算机、电视等各种电子娱乐设施已经越来越普遍,但是收音机在丰富的娱乐媒介中仍然占有重要地位。随着消费类电子的兴起和繁荣以及数字电子技术的发展,收音机逐渐数字化,集成化,而且成本越来越低,这使得在各种设备中嵌入收音机的现象更加普遍。广大从事消费类电子设计的厂商都不忘在诸如MP3、智慧手机、便携式Video播放器等产品中嵌入FM部分。TEA5767系列单片数字元收音机就被广泛地应用在各类电子产品中。利用TEA5767设计数字FM收音机与传统的超外差式收音机的调谐方式不太一样,传统的超外差式收音机的固定频率为10.7MZ,而TEA5767系列数字元收音机的固定中频为225KHz,由于固定中频不同,锁相环系统的软件控制就有很大的差别,这就给广大芯片应用设计者带来一定的难度。本设计将采用宏晶STCC52芯片来控制Philips公司的TEA5767收音模块,从而做成一个数位收音机。该收音机,具有抗干扰能力强、体积小、方便携带、调频范围宽等优点。
1 基于单片机的FM收音机工作原理
1.1 FM收音机的基本工作原理
FM收音机由输入回路、高放回路、本振回路、混频回路、中放回路、鉴频回路和音频功率放大器组成。如图1-1所示。
调频的接收天线以耳机的地线替代,也可直接插上配给的天线ANT,二者工作原理相同。调频广播的高频信号输入回路直接经电容C、L组成的LC振荡回路,实际上构成一带通滤波器,其通频带为88MHz—108MHz。在集成块内部接受的调频信号经过高频放大,谐振放大。被放大的信号与本地振荡器产生的本振信号在内部进行FM混频,混频后输出。
图1-1 FM收音机原理框图
FM混频信号由FM中频回路进行选择,提取以中频10.7MHz为载波的调频波。该中频选择回路由10.7MHz滤波器构成。中频调制波经中放电路进行中频放大,然后进行鉴频得到音频信号,经功率放大输出,耦合到扬声器,还原为声音。此外,因在调频波段未收到电台信号时,内部增益处于失控而产生的噪声很大。为此,通过检出无信号时的控制电平,控制静噪电路工作,使音频放大器处于微放大状态,从而达到静噪功能。
1.2 数字调节FM收音机的工作原理
此设计的基本原理与上述传统收音机的原理相似,在此不再累述。主要组成部分有单片机、存储器、功放、收音芯片。此处介绍不同之处。此方案通过单片机根据键盘输入,通过I2C对TEA5767模块的控制寄存器进行读写操作,以实现TEA5767模块的自动手动搜索功能,音频信号经过由TDA2822构成的功放电路放大处理由扬声器输出。并将从TEA5767模块中读取的频率字换算后显示在LCD上。按存储键时,单片机将频率字写入24c02实现存台功能,按读取键即可收听所存电台。
1.3 用单片机完成数字调节的FM收音机的功能设计
该设计分为两部分:硬件电路和程序。硬件电路包括控制模块、FM调频模块、电源供电模块和接收模块四部分。主控制器采用的是单片机STCC52,调频模块采用的是TEA5767芯片,电源供电模块可采用电池直接供电或通过变压设备得到要求的电源。本设计采用模块化设计,整个系统由、控制模块、TEA576模块、音量控制模块和功放模块显示模块组成,系统的整体方案框图如图1-2
图1-2 系统框图
从图1-2中可以看出,控制模块仅仅通过I2C总线与收音模块连接并控制收音机工作。本设计使用单片机P3口的两个I/O脚来模拟I2C总线的SDA和SCL时序并与TEA5767通信;TEA5767输出的左右声道音频信号可通过音量控制模块进行前级放大及音量控制,然后输入到TDA7057进行后级功率放大,最后输出到扬声器。单片机可通过I2C总线进行音量调节;ROM存储模块主要用于存储电台数据、音量数据和时钟数据,为存储和读取数据带来方便。系统可通过按键进行操作,通过MCU检测按键信号并经单片机实现手动搜台、自动搜台、音量控制、时钟调整等功能,各项操作提示和操作结果均可通过LCD显示出来。稳压电源模块产生的5 V和3.3 V电压可分别为各个模块器件供电。
2 硬件电路设计
2.1 硬件组成
基于单片机的数字FM收音机需要用到的主要硬件设施有STCC52单片机、TDA2030功放芯片、PT2257音量模块、TEA5767FM收音模块,各个硬件之间互相连接后,组成整个收音机的硬件系统。
2.1.1 数字FM收音机系统控制中心单片机
在本设计中,需要选用单片机作为整个系统的控制中心,由于对单片机的要求不高,可以选用普通的51系列单片机。考虑到引脚数量和经济实惠等诸多因素,此设计将采用STCC52芯片,STCC52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash, 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STCX52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。外形图和引脚图如图2-1所示
图2-1 STCC52单片机外形图及引脚图
STCC52在本设计中发挥着至关重要的作用,它是这个系统的控制核心。STCC52与外围的硬件相连,向FM收音模块发出指令,决定自动搜索或手动搜索模式。再通过读按键的方式判断外围电路的指令,该指令经过单片机分析后直接向收音模块发出信号,收音模块在收到信号后,响应外围电路的指令,调整收音的频道。收音的频道经过单片机的 处理之后,将所搜索到的频率显示在LCD1602液晶显示屏上。
2.1.2 收音功放芯片TDA2030
收音机系统直接接收到的信号一般都比较微弱,因此需要用通过功率放大器把信放大之后在用扬声器输出。这个环节需要选用一个体积小、输出功率大、失真小的音频功放芯片。德律风根生产的TDA2030采用V型5 脚单列直插式塑料封装结构。按引脚的形状引可分为H型和V型。该集成电路广泛应用于汽车立体声收录音机、中功率音响设备,具有内部保护电路。具体外形如图2-2,引脚功能如表2-1,具体参数如表2-2
图2-2 TDA2030外形图
表2-1 TDA2030功能引脚
| 引脚 | 功能 |
| 1 | 正向输入端 |
| 2 | 反向输入端 |
| 3 | 负电源输入端 |
| 4 | 功率输出端 |
| 5 | 正电源输入端 |
表2-2 TDA2030主要参数表
| A2030极限参数 | ||
| 参数名称 | 极限值 | 单位 |
| 电源电压(Vs) | ±18 | V |
| 输入电压(Vin) | Vs | V |
| 差分输入电压(Vdi) | ±15 | V |
| 峰值输出电流(Io) | 3.5 | A |
| 耗散功率(Ptot)(Vdi) | 20 | V |
| 工作结温(Tj) | -40±150 | ℃ |
| 存储结温(Tstg) | -40±150 | ℃ |
2.1.3 PT2257音量模块
在收音系统中还需要一个芯片来控制收音机输出的音量,PT22257是由CMOS技术制造而成的2声道音量控制IC,只有8个脚位,采用I2C控制界面,具备0~-79dB的衰减范围,低噪声,高立体分离度及使用极少的周边原件。内部连接图2-3和外观图分别如图2-4
图2-3 PT2257内部电路图
图2-4 PT2257外观图
表2-3 PT2257引脚
| 引脚名称 | I/O | 叙述 | 引脚编号 |
| LIN | I | 左声道输入,需加一交连电容后连接至讯源 | 1 |
| LOUT | O | 左声道输出,需加一交连电容后连接至输出端 | 2 |
| Vss | - | 地线 | 3 |
| SDA | I | I2C 介面DATA 输入脚位 | 4 |
| SCL | I | I2C 介面CLOCK 输入腳位 | 5 |
| VDD | - | 正电源输入端 | 6 |
| ROUT | O | 右声道输出,需加一交连电容后连接至输出端 | 7 |
| RIN | I | 右声道输入,需加一交连电容后连接至讯源 | 8 |
FM模块的控核心芯片采用飞利浦公司的TEA5767数字立体声FM芯片,该芯片把所有的FM功能都集成到一个不足6*6平方米的用HVQFN40封装的小方块中。芯片工作电压2.5V~5.0V,典型值是3V;RF接收频率范围是76~108MHz,(最强信号+噪声)/噪声的值在60dB左右,失真度在0.4%左右;双声道音频输出的电压在60~90mV左右,带宽为22.5KHz。芯片的引脚分布及其引脚定义分别见图2-3和表2-3。
图2-3 TEA5767芯片引脚分布
表2-3 引脚定义
| 管脚 | 定义 | 管脚 | 定义 |
| 1 | 空脚 | 21 | 空脚 |
| 2 | 锁相环输出 | 22 | 左声道输出 |
| 3 | 本振 | 23 | 右声道输出 |
| 4 | 本振 | 24 | 软静音时间常数 |
| 5 | 本振电源 | 25 | 检波输出 |
| 6 | 数字地 | 26 | 基准 |
| 7 | 数字电源 | 27 | 中频中心频率调整时间常数 |
| 8 | 数据线 | 28 | 中频限幅器退藕1 |
| 9 | 时钟线 | 29 | 中频限幅退藕2 |
| 10 | 空脚 | 30 | 空脚 |
| 11 | 三线读写控制 | 31 | 空脚 |
| 12 | 总线模式选择 | 32 | 增益控制 |
| 13 | 总线使能端 | 33 | 模拟地 |
| 14 | 软口1 | 34 | 模拟电源 |
| 15 | 软口2 | 35 | 射频输入1 |
| 16 | 晶振 | 36 | 高频地 |
| 17 | 晶振 | 37 | 射频输入2 |
| 18 | 相位滤波 | 38 | 高放AGC时间常数 |
| 19 | 导频低通滤波 | 39 | 锁相环开关输出 |
| 20 | 空脚 | 40 | 空脚 |
其基本工作原理分析:
(1)天线输入电路:
RF ANT 天线经过C1耦合送入LI、C2、C4组成的RF带通滤波器(87.6MHz~108MHz和76MHz~87.5MHz)送入TEA5767的35、37脚,通过TEA5767内部高通放大。模拟电源由FM 3V3经过R1限流C5滤波后送入TEA5767的34脚。
(2)可调式LC谐振回路:
2、3、4脚接内部VCO,外接变容二极管D1、D2。2脚为调谐电压输出,自动搜索时电压在1V内变化。VCO供电由FM 3V3经过R4限流C13滤波送如TEA5767的第5脚。
(3)I2C控制总线:
内置I2C接口,通过TEA5767的8、9脚控制,CPU通过I2C对其进行搜台、选台操作。数字电源由FM 3V3经过R7限流C19滤波送如TEA5767的第7脚。
(4)CO震荡电路:
CO震荡电路主要由XT1(32.768)、C14送入TEA5767的17脚输入,再从18脚输出到C15,产生32.768的基本时钟。
(5)音频输出电路:
经过TEA5767处理后的模拟音频信号从23(右声道)、22(左声道)输出到后级功放电路放大。
原理框图如图2-4
图2-4 原理框图
2.2 FM电路及其设计
FM接收电路是系统硬件电路中的核心部分之一,本硬件系统采用单芯片TEA5767HN模块作为FM接收电路的核心元器件。Philips公司提供的TEA5767HN模块芯片为低电压、低功耗和低价位的全集成单芯片立体声无线电产品,它只需要极少的外围元件,并且基本上不需要外部对高频信号的手动调准。另外,其频带范围较宽,可以完全免费调到欧洲、美国和日本的调频波段。其模块应用接线图如图2-5所示。
图2-5 FM模块应用接线图
图2-5中VCC接3.3V的电源,并通过磁珠及电容器件进行干扰抑制,注意磁珠FB应选用特征频率为100MHz,直流电阻的贴片元件,这样有利于对高频噪声进行抑制但同时又不是系统产生过多的直流损耗22uF的电容最好选用钽电容,2个0.1uF的电容可选用介电常数高、高频性能好的陶瓷电容,这样就保证了整个FM Module的电源系统的稳定。BUS-MODE是用来选择CPU与FM Module,串口通信的方式,为I2C的通信方式DATA和CLK即为I2C通信的数据线和时钟线,系统的CPU通过I2C接口即可对FM Module进行控制。W/READ在该系统没有使用,此时FM Module通过W/READ,CLK,DATA与系统的CPU实现三线方式串行通信。BUS-ENABLE为总线使能信号,当BUS-ENABLE为逻辑低时使FM Module进入省电模式,该系统中把其直接拉高,是因为FM Module可以通过I2C接口控制其进入省电模式。FM_ANT为FM Module的天线接口即射频信号输入脚,目前在此类消费电子产品中,天线大多采用耳机线代替,该产品也不例外,上图中的J3即为立体声耳机接口。耳机左右声道信号线上感应到的毫伏级的FM信号即可通过J3脚的脚③进入到FM Nodule中。当然这么小的信号不会对耳机上的音质有什么影响,而且由于有上图中的3个0.22uH空心电感的隔离作用,FM的信号可以损耗很小的地被FM Module接收。值得注意的是3个空心电感应该在电路板上紧靠耳机接口放置以增加接收的灵敏度,并且电感的直流阻抗应尽量小,这样可以减少音频的功率损耗。3个电感的选用考虑到空心结构的、可能外形尺寸比较大,不太合适于便携式产品的应用,可以选用陶瓷支架的电感。尽量不要选用非线性比较大的铁氧支架电感,因为这有可能影响耳机的音质。
2.3 单片机控制与显示电路
微控制器部分以STCC52为核心,包括复位电路,晶振电路和按键控制电路,特别注意的是电源输入要加上去藕电容,电路原理图见图2-6
图2-6 单片机控制电路
显示电路采用LCD1602为主器件,具体电路如图2-7
图2-7 LCD1602显示电路
2.4 供电电路与放大电路
供电电路直接输入DC9V,经过ASM1117-5V进行5V稳压输出。模块3.3V电源由ASM1117-3.3直接提供。如图2-8
图2-8 供电电路
放大电路如图2-9该电路工功能是放大收音机收到的信号
图2-9 放大电路
3 软件设计
基于STCC52的单片机控制平台的TEA5767数字收音机的软件设计主要包括六个部分:I2C总线通信协议、TEA5767HN收音模块控制、PT2257音量控制、AT24C02存储模块控制、键盘扫描及状态显示。本文的软件系统设计应当着重分析TEA5767HN收音模块控制、PT2257音量模块这两部分的工作原理以及编程思路。
本系统程序使用C语言编写,主程序由启动、初始化、键盘扫描、按键处理、液晶显示等5大模块组成。其中系统初始化包括STCC52的初始化、TEA5767HN的初始化和LCD的初始化;按键处理通过调用函数的方法实现按键复用功能,可实现手动搜台、自动搜台、音量控制、时间调整、闹钟调整等操作;显示模块可显示系统的各个工作状态。
3.1键盘与显示函数设计
3.1.1 LCD液晶显示函数
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志位低电平,表示不忙,否则指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块哪里显示字符,图3-1是1602的内部显示地址
图3-1 LCD1602内部地址
LCD1602初始化指令:
延时15mS
写指令38H(不检测忙信号)延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令和读/ 写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清零
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
3.1.2 键盘读键子程序:
图3-2 流程图
char readkey(void)
{
char temp,temp1,char key;
temp=p3;
delay(100);
if((temp1=p3)==temp)
{
temp=temp&0x0f;
switch(temp)
{
case 0x0e: key=1;break;
case 0x0d: key=2;break;
case 0x0b: key=3;break;
case 0x07: key=4;break;
default;key=0;
}
}
return key;
}
3.2数字调节与收音控制程序设计
3.2.1 EA5767HN读写寄存器
吃透芯片的寄存器是编好程序的关键TEA5767HN有5个写寄存器和5个读寄存器,每个寄存器可存储8位数据。写寄存器可以存储控制信息,包括软件静音、模式选择、PLL可编程计数器的设置、向上向下搜索模式选择、静左/右音频、可编程端口的设置、待机节能模式、欧洲/日本频段选择、晶振频率选择、ADC门限设置、去加重设置等。
读寄存器可检测接收电路状态,反馈控制信息,包括搜索到有效电台标志位、搜索到有效电台后PLL可编程计数器的状态、4 b ADC的输出、以及7 b IF中频输出。下面就对芯片的寄存器进行详细说明。
(1)芯片寄存器地址的格式如下:
表3-1 芯片寄存器地址格式
R/W=0为读模式;R/W=1为写模式
(2)写模式下5个数据字节的格式及各位的描述。
数据字节1
a)字节格式
表3-2 数据字节1字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| MUTE | SM | PLL13 | PLL12 | PLL11 | PLL10 | PLL9 | PLL8 |
表3-3 数据字节1位描述
| 位号 | 符号 | 描述 |
| 7 | MUTE | 如果 MUTE=1,则左右声道被静音;MUTE=0,左右声道正常工作。 |
| 6 | SM | 如果 SM=1,则处于搜索模式;SM=0,不处于搜索模式。 |
| 5 到 0 | PLL[13:8] | 设定用于搜索和预设的可编程频率合成器。 |
a)字节格式
表3-4 数据字节2字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| PLL7 | PLL6 | PLL5 | PLL4 | PLL3 | PLL2 | PLL1 | PLL0 |
b)位描述
表3-5 数据字节2位描述
| 位号 | 符号 | 描述 |
| 7 到 0 | PLL[7:0] | 设定用于搜索和预设的可编程频率合成器。 |
a)字节格式
表3-6 数据字节3字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| SUD | SSL1 | SSL0 | HLSI | MS | ML | MR | SWP1 |
表3-7 数据字节3位描述
| 位号 | 符号 | 描述 |
| 7 | SUD | SUD=1,增加频率搜索;SUD=0,减小频率搜索。 |
| 6 和 5 | SLL[1:0] | 搜索停止标准:见下表 1。 |
| 4 | HLSI | 高/低充电电流切换:HLSI=1,高充电电流; HLSI=0,低充电电流。 |
| 3 | MS | 立体声/单声道:MS=1,单声道;MS=0,立体声。 |
| 2 | ML | 左声道静音:ML=1,左声道静音并置立体声,ML=0,左声道正常。 |
| 1 | MR | 右声道静音:MR=1,右声道静音并置立体声,MR=0,右声道正常。 |
| 0 | SWP1 | 软件可编程端口 1:SWP1=1,端口 1 高电平;SWP1=0,端口 1 低电平。 |
表3-8 搜索停止标准
| SSL1 | SSL2 | 搜索停止标准 |
| 0 | 0 | 在搜索模式下禁止 |
| 0 | 1 | 低:ADC 输出大小为 5 |
| 1 | 0 | 中:ADC 输出大小为 7 |
| 1 | 1 | 高:ADC 输出大小为 10 |
数据字节4
a)字节格式
表3-9 数据字节4字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| SWP2 | STBY | BL | XTAL | SMUTE | HCC | SNC | SI |
a)字节格式
表3-10 数据字节5字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| PLLREF | DTC | ------ | ------ | ------ | ------ | ------ | ------ |
表3-11 数据字节5位描述
| 位号 | 符号 | 描述 |
7 | PLLREF | 若 PLLREF=1,6.5MHz 的锁相环参考频率启用; 若 PLLREF=0,6.5MHz 的锁相环参考频率关闭。 |
6 | DTC | 若 DTC=1,去加重时间常数为 75us; 若 DTC=0,去加重时间常数为 50us。 |
| 5 到 0 | ------ | 未用,状态不必考虑。 |
数据字节1
a)字节格式
表3-12 数据字节1字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| RF | BLF | PLL13 | PLL12 | PLL11 | PLL10 | PLL9 | PLL8 |
表3-14 位描述
| 位号 | 符号 | 描述 |
7 | RF | 准备好标志:RF=1,有一个频道被搜到或者一个制式已经符合;RF=0, 没有频道被搜到。 |
6 | BLF | 波段制式:BLF=1,一个制式已经符合; BLF=0,没有制式已经符合。 |
| 5 到 0 | PLL[13:8] | 用于搜索和预设后的可编程频率合成器设定结果。 |
a)字节格式
表3-15数据字节1位描述
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| PLL7 | PLL6 | PLL5 | PLL4 | PLL3 | PLL2 | PLL1 | PLL0 |
表3-16 数据字节2位描述
| 位号 | 符号 | 描述 | |||||||
| 7 到 0 | PLL[7:0] | 设定用于搜索和预设后的可编程频率合成器设定结果。 | |||||||
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) | ||
| STEREO | IF6 | IF5 | IF4 | IF3 | IF2 | IF1 | IF0 | ||
a)字节格式
表3-17 数据字节3字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| STEREO | IF6 | IF5 | IF4 | IF3 | IF2 | IF1 | IF0 |
表3-18 数据字节3位描述
| 位号 | 符号 | 描述 |
7 | STEREO | 立体声标志位:STEREO=1,立体声接收;STEREO=0,单声道接 收。 |
| 6 到 0 | IF[6:0] | 中频计数器结果。 |
a)字节格式
表3-19 数据字节4字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| LEV3 | LEV2 | LEV1 | LEV0 | CI3 | CI2 | CI1 | 0 |
表3-20 数据字节4位描述
| 位号 | 符号 | 描述 |
| 7 到 4 | LEV[3:0] | ADC 的输出。 |
| 3 到 1 | CI[3:1] | 芯片验证号。 |
| 0 | ------ | 该位内部置 0。 |
字节格式
表3-21 数据字节5字节格式
| 位 7(高位) | 位 6 | 位 5 | 位 4 | 位 3 | 位 2 | 位 1 | 位 0(低位) |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
3.2.2 TEA5767HN的数据传输
TEA5767HN的数据顺序是:地址、字节1、字节2、字节3、字节4、字节5,数据传送必须按照这个顺序。每个字节将控制不同的功能。
每个字节的第七位为最高位,并作为字节的第一位传送。在时钟的下降沿,数据变为有效信号。在每一字节后面加停止信号可以缩短传送时间。在整个传输完成之前,发送一个停止条件,其保留的字节将包含以前的信息。如果一个字节没有传送完,新的字节将被使用,但新的调谐周期不会开始。
3.2.3 TEA5767HN的读写流程
根据TEA5767HN的读写协议,调用公用I2C驱动即可编写出TEA5767HN的读写函数:radio_write(),radio_read()。它们可为手动搜台、自动搜台等FM功能调用,以实现程序的模块化,优化程序结构。TEA5767HN的读写流程如图3-3所示。其中I2C_Start(FM)和I2C_Stop(FM)分别表示启动和停止I2C总线,Check_(FM)为应答信号。
图3-3 TEA5767HN 读写流程图
3.2.4 收音模块的初始化
TEA5767HN在上电复位时,静音位设置为“1”,其他所有位设置为“0”。为了初始化集成块,所有位都必须重新设定。所以,上电后必须重新给TEA5767HN写入数据,以初始化收音模块。
图3-4 TEA5767HN初始化流程图
TEA5767HN的初始化流程图如图3-4所示。图中的radio_write_data[]分别为要写入TEA5767HN的5个字节数据。本系统写入数据让TEA5767HN接收的频率为88100 kHz,选择欧洲制式和32.768 MHz晶振,同时采用立体声输出。函数get_pll()是根据当前频率计算出PLL值的函数。调用get_pll()函数计算出PLL值后,应再把PLL高6位送给字节1的低6位,接着把PLL的低8位送给字节2。频率显示则可直接调用fm_disp()函数来完成。
3.3 PT2257的音量控制设计
本系统使用PT2257来控制收音机输出的音量,以实现数字化音量控制。PT2257的地址为88H。单片机可与PT2257通过I2C进行通信。PT2 257的写操作先由单片机发出启动信号写入PT2257的片地址0x88,然后,由PT2257送回应答信号,单片机收到应答信号后,即向PT2257发送音量衰减量数据,单片机再次收到应答信号后,即发出停止信号,如此即可完成一次控制过程。PT2257衰减量数据Vol由十位和个位两部分组成。数据的传输顺序是先发送十位数据,再发送个位数据。写入的十位数据为(Vol/10)|TenDB,个位数据为(Vol%10)|OneDB。其中TenDB=0xe0,OneDB=0xd0。衰减量的大小为十位和个位值的合并,图3-5和图3-6给出了PT2257的写流程和音量控制流程。
图3-5 PT2257写流程图
图3-6 PT2257音量控制流程图
结论
软硬件都设计好之后,要把编号的程序下载到单片机内。下载工具可以用此前实习时焊接的简易单片机开发板,下载软件可以用STC_ISP_V480。在调试软件时,由于开始时没有定义好参数,导致程序虽没错误却难以实现预想的功能,后经反复仔细检查终于发现,并解决了问题。在调试整机系统时能够搜索的频率范围为87.5~108MHz,能够接收到6~8个电台,由于没有专用天线,电路板质量也不高,再加上电台本身信号强度的问题,有3~4个电台的音质效果不是很好,干扰很大。总体来说本次课题还是比较成功的。
致 谢
从整体上来讲,基于单片机的FM收音机设计是一个成功的设计。反观整个过程,掌握好寄存器的功能是整个设计的关键。从这个设计中,我学会(1)通过软件模拟I2C总线通信协议(2)编程操作串口(3)熟悉芯片的工作原理
同时也发现了自己有很多不足的地方:焊接技术不够好,同时编程能力也很薄弱。在以后的工作学习中一定要多加强练习。
本论文是在的悉心教导下完成的,是他在我最困难的时候给了我及时的提醒与帮助。字里行间都流露着导师的谆谆教诲。本人在与导师的多次交流过程中被导师诲人不倦的态度和渊博的知识深深地所折服。正是因为有了导师如此敬业的指导,本人才能顺利完成本篇论文。
参考文献
【1】 C语言程序设计/谭浩强著.-2版.-北京:清华大学出版社,2008.11
【2】 模拟电子技术基础/童诗白,华成英主编;清华大学教研组编.-4版.-北京:高等教育出版社, 2006.5
【3】 单片机原理与应用/朱兆优等编著.-北京:电子工业出版社,2010.9
【4】 王辉平.基于IIC 总线数字收音机的控制实现[J].仪表技术,2008(11):56-58.
【5】 余修武.USB 接口技术在嵌入式系统中的应用研究[J].电子技术应用,2008(10):151-153
【6】 林峰.采用TEA5767 的调频收音电路设计[J].电声技术,2005(4):35-36.
【7】 PhilipsSemiconductors .TEA5767HN Datasheet.2002
【8】 辛友顺. 单片机应用系统设计与实现[ M] . 福州: 福建科学技术出版社, 2005.
【9】 冯建华. 单片机应用系统设计与产品开发[ M] . 北京: 人民邮电出版社, 2004.
【10】 沈红卫. 单片机应用系统设计实例与分析[ M] . 北京: 北京航空航天大学出版社, 2003.
【11】 徐明雪. 用单片机控制T EA5768H L 设计数字调谐FM 收音机[ J] . 无线电, 2005( 7) : 9293.
【12】 张俊谟.单片机中级教程——原理与应用.北京:北京航空航天大学出版社,2006年10月.
【13】 郭天祥.新概念51单片机C语言教程:入门、提高、开发、拓展全攻略.北京:电子工业出版社.2009 (01)
【14】 张有德等.单片微型机原理、应用与实验.上海:复旦大学出版社.2006
【15】 康华光.《电子技术基础》(模拟部分 第五版) 高等教育出版社,2006
附录
附录一 主程序
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
#include"mylib.h"
uchar input_frq_lab=0;
uchar input_sti_lab=0;
uchar frq_wei=0;
uchar tai_wei=0;
uchar frq[10]={0};
uchar tai[4]={0};
uchar temp_wei=0;
uchar st_num=0;
code uchar dis_fr[]="_";
code uchar dis_fb[]=" ";
extern uchar flash;
extern uchar sti_flash;
extern uchar flash_temp=0;
uchar stion_h[2];
extern unsigned char radio_write_data1[5];
void set_stions(uchar a)
{
EA=0;
rdnbyt(0xa0,a*2,2,stion_h);
radio_write_data1[0]=stion_h[0];
radio_write_data1[1]=stion_h[1];
radio_write_data1[2]=0x20;
radio_write_data1[3]=0x11;
radio_write_data1[4]=0x00;
radio_write();
radio_read();
frequency=frequency+20;
EA=1;
}
void main(void)//主程序
{
uchar a,b,key; //按键所要的变量
ini_int(); //中断和系统设置
init(); //屏幕初始化
set_stions(1); //设置第一个电台
radio_write(); //写电台频率
disp_chin_st("调频收音机",24,0);
disp_chin_st("电台频率:",0,2);
disp_chin_st("电台编号:",0,4);
disp_uchar(st_num,55,4);
disp_chin_st("调频收音机",0,6);
//-------------------------------------------
frq[0]=1;
frq[1]=0;
frq[2]=7;
frq[3]=5;
set_frq(frq);//设置电台频率并送数据到收音头
//-------------------------------------------
//while(1)
//auto_search(0);
//---------------键盘扫描开始--------------------
while(1)
{
for(a=0;a<4;a++) //让行线依次出现底电平(四次同样的循环)
{
P2=~(0X80>>a); //让行线依次出现底电平,列线为输入状态(这里把高4位做行线,低四位做列线)
if((P2&0x0f)==0x0f)//假如没按键按下,这时候,列线不会检测到低电平
{
key=0;
}
else
{
for(b=0;b<4;b++)//假如按键按下,这时候,列线会检测到低电平
{
P2=~(0X08>>b);
if((P2>>4)!=0X0F)
break; //让列线依次出现低电平行线检测,看哪列有按键按下
}
P2=0X0F;
while((P2&0X0F)!=0X0F);
key=a*4+b+1; //每行有四个按键,所以所得到的行数*4加按键的列数,就是被按下的位置,这里加1是想跳过0。
break;
}
}
//------------键盘扫描结束----------------------
switch(key)
{
case 0:
break;
case 16:
auto_search(0);
disp_int(frequency/10,55,2);
break;
case 12:
auto_search(1);
disp_int(frequency/10,55,2);
break;
key=0;
}
}
}
附录二 TEA5767读写子程序
#include"reg52.h"
#include"24c02.h"
#include"lcm.h"
#define max_freq 108000
#define min_freq 87500
unsigned char radio_write_data[5]={0xb1,0xa0,0x20,0x11,0x00}; //要写入TEA5767的数据
unsigned char radio_write_data1[5]={0x31,0xa0,0x20,0x11,0x00}; //要写入TEA5767的数据
unsigned char radio_read_data[5]; //TEA5767读出的状态
unsigned int default_pll=0x29c2;//0x29f9; //默认存台的pll,87.8MHz
unsigned int pll=0;
float frequency=0;
void get_frequency(void);
extern void sta();
extern void wrbyt(unsigned char byt);
extern bit iic_testack() ;
extern void mack();
extern void stop();
extern unsigned char rdbyt();
extern uchar frq[10];
sbit ds_1302=P1^5;
void radio_write(void)
{
unsigned char i;
stop();
sta();
wrbyt(0xc0); //TEA5767写地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
wrbyt(radio_write_data1[i]);
mack();
}
}
stop();
}
//读TEA5767状态,并转换成频率
void radio_read(void)
{
unsigned char i;
unsigned char temp_l,temp_h;
pll=0;
stop();
sta();
wrbyt(0xc1); //TEA5767读地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
radio_read_data[i]=rdbyt();
mack();
}
}
stop();
temp_l=radio_read_data[1];
temp_h=radio_read_data[0];
temp_h&=0x3f;
pll=temp_h*256+temp_l;
get_frequency();
}
//由频率计算PLL
void get_pll(void)
{
unsigned char hlsi;
unsigned int twpll=0;
hlsi=radio_write_data[2]&0x10;
if (hlsi)
pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768); //频率单位:k
else
pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768); //频率单位:k
}
//由PLL计算频率
void get_frequency(void)
{
unsigned char hlsi;
unsigned int npll=0;
npll=pll;
hlsi=radio_write_data[2]&0x10;
if (hlsi)
frequency=(unsigned long)((float)(npll)*(float)8.192-225); //频率单位:KHz
else
frequency=(unsigned long)((float)(npll)*(float)8.192+225); //频率单位:KHz
}
//手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
void search(bit mode)
{
radio_read();
if(mode)
{
frequency+=50;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
frequency-=50;
if(frequency } EA=0; get_pll(); radio_write_data1[0]=pll/256; radio_write_data1[1]=pll%256; radio_write_data1[2]=0x20; radio_write_data1[3]=0x11; radio_write_data1[4]=0x00; radio_write(); EA=1; } void set_frq(uchar *frq_m) { EA=0; frequency=(float)((*frq_m)*1000+(*(frq_m+1))*100+(*(frq_m+2))*10+(*(frq_m+3)))*100; if((frequency<87500)||(frequency>108500)) { EA=1; *frq_m=0; *(frq_m+1)=0; *(frq_m+2)=0; *(frq_m+3)=0; return; } get_pll(); radio_write_data1[0]=pll/256; radio_write_data1[1]=pll%256; radio_write_data1[2]=0x20; radio_write_data1[3]=0x11; radio_write_data1[4]=0x00; radio_write(); EA=1; } void auto_search(uchar dec) { int k=0; unsigned char aa[6]={0}; ds_1302=0; radio_write(); if(dec) { while(frequency get_pll(); radio_write_data1[0]=pll/256; radio_write_data1[1]=pll%256; radio_write_data1[2]=0xA0; radio_write_data1[3]=0x11; radio_write_data1[4]=0x00; radio_write_data1[0]|=0x40; radio_write(); for(k=0;k<20000;k++) EA=0; radio_read(); if((radio_read_data[0]&0x80)) { EA=0; frequency+=50; return; } } frequency=min_freq; } else { while(frequency>min_freq) { get_pll(); radio_write_data1[0]=pll/256; radio_write_data1[1]=pll%256; radio_write_data1[2]=0x20; radio_write_data1[3]=0x11; radio_write_data1[4]=0x00; radio_write_data1[0]|=0x40; radio_write(); for(k=0;k<20000;k++) EA=0; radio_read(); if((radio_read_data[0]&0x80)) { EA=0; frequency-=50; return; } } frequency=max_freq; } } 附录三 按键子程序 #include "reg51.h" #define uchar unsigned char #define uint unsigend int xdata uchar delay_1s=0; //连按时间存放 xdata uchar have_down=0; //有下降按件按下 xdata uchar key=0; xdata uchar oldkey=0; //上次按件号 xdata uchar newkey=0; //本次按件号 xdata uchar eq_time=0; xdata uchar eq_key_lab=0; //连按标志 xdata uchar inputtime=0; xdata uchar input_sttime=0; xdata uchar inputtime_lab=0; xdata uchar input_sttime_lab=0; sbit key_16 =P1^7; sbit key_15 =P1^6; sbit key_14 =P1^5; sbit key_13 =P1^4; sbit ds_1302=P1^5; extern uchar input_frq_lab; extern uchar input_sti_lab; extern uchar frq_wei; uchar flash=0; uchar sti_flash=0; extern void display_char(uchar char_[18],uchar f_cl,uchar b_cl,uchar x,uchar y); void ini_int(void) { EA=0; EX0=0; ET1=0; EX1=0; ET0=1; PT1=0; PT0=1; PX1=1; PX0=0; IT0=1; TMOD=0X01; TH0=0X00; TL0=0X01; TR0=1; EA=1; } void time_int()interrupt 1 { uchar a=0; uchar b=0; uchar c=0; uchar d=0; uchar e=0; uchar f=0; uchar j=0; uchar k=0; uchar m=0; TH0=0X00; TL0=0X00; P1=0XFF; if(input_frq_lab) { if(inputtime<20) inputtime++; else { inputtime=0; if(inputtime_lab==0) inputtime_lab=1; else inputtime_lab=0; if(inputtime_lab) { flash=0; } else flash=1; } } if(input_sti_lab) { if(input_sttime<20) input_sttime++; else { input_sttime=0; if(input_sttime_lab==0) input_sttime_lab=1; else input_sttime_lab=0; if(input_sttime_lab) { sti_flash=0; } else sti_flash=1; } } if(!key_13) { key=13; goto test_eq; } if(!key_14) { key=14; goto test_eq; } if(!key_15) { key=15; goto test_eq; } if(!key_16) { key=16; goto test_eq; } P1=0XF8; a=(0x01); m=P1; for(c=0;c<3;c++) { k=~a; b=(0xff&k); P1=(b|0x02); d=(P1>>4); a=(a<<1); if(d!=0x0f) for(e=0;e<4;e++) { d=d>>e; if(!(d&0x01)) { key=(c*4)+e+1; goto test_eq; } else key=0; } } test_eq: if((key!=0)) { oldkey=key; key=0; if(eq_time<60) eq_time++; else { eq_time=70; eq_key_lab=0xff; } } else if((oldkey!=0)&&(key==0)) { newkey=oldkey; eq_time=0; oldkey=0; eq_key_lab=0x00; }//以上语句为按件处理 单次按下 和连按分析 ds_1302=0; }下载本文