资源描述
36 / 36
专业综合课程设计
基于单片机控制的FM收音机
班级:通信(三)班
成绩:
基于单片机控制的FM收音机
摘 要:
单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步。在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。我们可以开发利用单片机系统以获得很高的经济效益。更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。例如,本文所要论述的通过单片机来控制TEA5767HN芯片与驱动LCD1602液晶屏实现FM收音并显示频率。现在人们常使用的收音机为手动调频收台,使用较为麻烦,而且由于接收灵敏度不高,所接收的频段较窄。本设计采用的是TEA5767HN芯片,它是由PHILIPS公司推出的针对低电压应用的单芯片数字调谐FM立体声收音机芯片。TEA5767HN芯片集成了完整的IF频率选择和鉴频系统,只需很少的低成本外围元件,就可实现FM收音机的全部功能。另外,它具有高性能的RF AGC电路,其接收灵敏度高;参考频率选择灵活;可实现自动搜台。
关键词:
89C52单片机;TEA5767HN芯片;2822功率放大器
Abstract
This test constitute with stc89c52 singlechip micyoco, tea5767 model,2822 power amplifier,1602 and peripheral circuit.In the design process,we used modular design for several types,such as searching model,display model,storage model and some ancillary function.STC series singlechip has very good control ability and stable level to meet the requirements.
前言:
本设计研究FM收音机分为硬件电路和程序设计两个方面。从硬件电路来说,主要是实现所需电压值、稳压、搜台、控制和频率显示等方面;从系统程序来说,主要是如何将电台频率换算出PLL控制字写入TEA5767HN,以与PLL控制字转换成频率送显示。
意义:
随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,TEA5767HN芯片可通过IIC系统总线进行各种功能控制,并通过IIC总线输出7位IF计数值;立体声解调器完全免调,可用软件控制SNC、HCC、暂停和静音功能;具有两个可编程I/O口,可用于系统的其他相关功能,又由于其小尺寸的封装,使得它非常适合用于电路板空间相当有限的设计上。
1课题分析
1.1 总体分析
课题研究分为两部分:硬件电路和程序。硬件电路包括主控制器、调频模块、喇叭(耳机)接收和频率显示四部分。主控制器采用的是单片机AT89S51,调频模块采用的是TEA5767HN芯片,显示电路采用FPB9742芯片和LCD液晶屏直读显示。程序部分用C语言编写包括设定89.6MHZ电台、TEA5767HN写入和读出、PLL控制字转换为频率送显示和IIC总线操作子程序包。通过设计电路图和电路焊接,编写程序并调试,使系统达到设计要求。
1.2主要技术分析:
1.2.1调频广播收音机的原理:
一个典型的调频广播收音机的电路原理图如下:
自动增益控制
高频放大器
混频器
中频放大器
限幅器
鉴频器
音频放大器
调谐器
本地振荡器
1.2.2 本设计用到的TEA5767HN的功能介绍:
(1)具有集成的高灵敏度低噪声射频输入放大器;
(2)具有射频自动增益控制电路RF AGC;
(3)LC调谐振荡器采用廉价的固定片式电感;
(4)具有部实现的FM中频选择性;
(5)具有完全集成的FM鉴频器,无需外部解调;
(6)可选择32.768kHZ或13MHZ的晶体参考频率振荡器,也可使用外部
6.5MHZ的参考频率;
(7)采用PLL合成器调谐系统;
(8)引脚BUSMODE可选择IIC和3-wire总线;
(9)总线可输出7位中频计数器;
(10)总线可输出4位信号电平信息;
(11)具有软件静音功能;
(12)具有免调整立体声解调功能;
(13)具有电台自动搜索功能;
1.2.3 TEA5767HN的IIC总线说明:
TEA5767HN的IIC总线地址是C0H,是可收发的从器件结构,无部地址。最大低电平是0.2VCCD,最大高电平是0.45VCCD。
当使用IIC总线时,引脚BUSMODE必须接地。因总线的最高时钟频率是400kHZ,故芯片的时钟频率不能高于该值。
当向TEA5767HN写入数据时,地址的最低位是0,即写地址是C0H。当从TEA5767HN读出数据时,地址的最低位是1,即读地址是C1H。
TEA5767HN遵守通用的IIC总线通信协议,IIC总线的写模式和读模式格式分别为:
IIC写模式
开始位
写地址
应答位
数据字节
应答位
停止位
IIC读模式
开始位
读地址
应答位
数据字节1
1.2.4写数据:
TEA5767HN部有一个5字节的控制寄存器,在IIC上电复位后,必须先通过总线接口向其写入适当控制字,TEA5767HN才能正常工作。写入控制字应按照以下顺序:
地址,字节1,字节2,字节3,字节4,字节5
首先发送每个字节的最高位。在时钟下降沿后写入的数据才有效。
写模式字节1格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
MUTE
SM
PLL13
PLL12
PLL11
PLL10
PLL9
PLL8
写模式字节1各位说明
位
符号
说明
7
MUTE
左右声道静音设置。1:左右声道静音;0:左右声道非静音
6
SM
搜索模式设置。1:搜索模式;0:非搜索模式
5~0
PLL13~8
预置或搜索电台的频率数据高6位
写模式字节2格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
PLL7
PLL6
PLL5
PLL4
PLL3
PLL2
PLL1
PLL0
写模式字节2各位说明
位
符号
说明
7~0
PLL7~0
预置或搜索电台的频率数据低8位
写模式字节3格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
SUD
SSL1
SSL0
HLSI
MS
ML
MR
SWP1
写模式字节3各位说明
位
符号
说明
7
SUD
上下搜索设置。1:向上搜索;0:向下搜索
6,5
SSL1~0
设定搜索停止电平,见下表
4
HLSI
设定高低本振。1:高端本振注入;0:低端本振注入
3
MS
单声道或立体声设置。1:强制单声道;0:开立体声
2
ML
左静音设置。1:左声道静音强制单声道;0:左声道非静音
1
MR
右静音设置。1:右声道静音强制单声道;0:右声道非静音
0
SWP1
软件可编程输出口1设置。1:SWPOR1为高;0:SWPOR1为低
搜索停止电平设置
SSL1
SSL0
搜索停止电平
0
0
不搜索
0
1
低电平,ADC输出值为5
1
0
中电平,ADC输出值为7
1
1
高电平,ADC输出值为10
(本设计用的是第三种)
1.2.5读数据
读地址为C1H。
读模式字节1格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
RF
BLF
PLL13
PLL12
PLL11
PLL10
PLL9
PLL8
读模式字节1各位说明
位
符号
说明
7
RF
Ready标志。1:发现了一个电台或搜索到头;0:未搜索到头
6
BLF
波段到头标志。1:搜索到头;0:未搜索到头
5~0
PLL13~8
搜索或预置的电台频率值的高6位(需换算)
读模式字节2格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
PLL7
PLL6
PLL5
PLL4
PLL3
PLL2
PLL1
PLL0
读模式字节2各位说明
位
符号
说明
7~0
PLL7~0
搜索或预置的电台频率值的低8位(需换算)
读模式字节3格式
位7(MSB)
位6
位5
位4
位3
位2
位1
位0(LSB)
STEREO
IF6
IF5
IF4
IF3
IF2
IF1
IF0
读模式字节3各位说明
位
符号
说明
7
STEREO
立体声标志。1:立体声;0:单声道
6~0
IF6~0
中频计数结果
1.2.6 根据电台频率换算出PLL控制字写入以与根据PLL控制字换算出电台频率读出。TEA5767HN的中频f固定为225khz,参考频率与所使用的晶振有关,具体数值如下:
XTAL是写模式控制字第4字节的位4,PLLREF是写模式控制字第5字节的7位 。
FM收音机参考频率
XTAL
PLLREF
参考频率
振荡频率
0
0
3000HZ
13MHZ
0
1
3000HZ
6.5MHZ
1
0
32768HZ
32.768KHZ
1
1
32768HZ
32.768KHZ
fRF=(NDEC*fREFS)/4-(+)fIF 式中,fRF为收到的电台频率,NDEC为控制字的十进制值,fIF为中频频率,fREFS为参考频率。当采用高本振时,公式用减号,当采用低本振时,公式用加号。
本设计用的参考频率是32768HZ,低本振,计算公式为: fRF=NDEC*8192+225000(HZ)
2 FM收音机流程图:
3 FM收音机电路图:
器件清单:
器件
规格
件数
电解电容
1µF
2
电解电容
1000µF
1
电解电容
47µF
4
普通电容
0.1µF
1
电阻
10k
2
TDA2822
1
喇叭
1
4 FM收音机实物图:
5.FM收音机核心程序:
#include <reg51.h>
#include <string.h>
#include <math.h>
#include <uart.h>
#include <i2c.h>
#define max_freq 108000
#define min_freq 87500
sbit KEY11=P3^0;
sbit KEY22=P3^1;
sbit KEY1=P3^2;
sbit KEY2=P3^3;
unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40}; //要写入TEA5767的数据
unsigned char radio_read_data[5]; //TEA5767读出的状态
unsigned int default_pll=0x301d; //0x29f9; //默认存台的pll,95.8MHz
unsigned int max_pll=0x339b; //108MHz时的pll,
unsigned int min_pll=9000; //70MHz时的pll
unsigned long frequency;
unsigned int pll;
unsigned long FM;
/*void delay(unsigned int time)
{
while(time--);
}*/
void delay1ms (unsigned int b)//1ms
{
for(b;b>0;b--)
{unsigned int i;
for(i=0;i<300;i++)
{;}
}
}
#include<intrins.h>
sbit RS = P2^4; //定义端口
sbit RW = P2^3;
sbit EN = P2^2;
sbit P20=P2^0;//定义锁存使能端口 段锁存
sbit P21=P2^1;// 位锁存
sbit P35 = P3^5;//这是为了关闭开发板上的点阵实际应用去掉
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
#define DataPort P1
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
DataPort= 0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return (bit)(DataPort & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char )
{
while(LCD_Check_Busy()); //忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort= ;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort= Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开与光标设置*/
}
//1602显示
void DISP_FM()
{
unsigned char j;
j=(radio_read_data[3]&0xf0)>>4;
LCD_Write_Com(0x8e);
LCD_Write_Data('0'+(j/10));
LCD_Write_Data('0'+(j%10));
LCD_Write_Com(0x8c);
LCD_Write_Data('S');
LCD_Write_Data(':');
FM=frequency;
LCD_Write_Com(0x80);
LCD_Write_Data('F');
LCD_Write_Data('M');
LCD_Write_Data(' ');
LCD_Write_Data('R');
LCD_Write_Data('a');
LCD_Write_Data('d');
LCD_Write_Data('i');
LCD_Write_Data('o');
LCD_Write_Com(0xc2);
if(FM/100000)
LCD_Write_Data('0'+FM/100000);
else LCD_Write_Data(' ');
LCD_Write_Com(0xc3);
LCD_Write_Data('0'+(FM%100000)/10000);
LCD_Write_Com(0xc4);
LCD_Write_Data('0'+(FM%10000/1000));
LCD_Write_Com(0xc5);
LCD_Write_Data('.');
LCD_Write_Com(0xc6);
LCD_Write_Data('0'+(FM%1000)/100);
LCD_Write_Com(0xc7);
LCD_Write_Data('0'+(FM%100)/10);
LCD_Write_Com(0xc8);
LCD_Write_Data('0'+(FM%10));
LCD_Write_Com(0xc9);
LCD_Write_Data(' ');
LCD_Write_Com(0xca);
LCD_Write_Data('M');
LCD_Write_Com(0xcb);
LCD_Write_Data('H');
LCD_Write_Com(0xcc);
LCD_Write_Data('Z');
}
void radio_write(void)
{
unsigned char i;
iic_start();
iic_write8bit(0xc0); //TEA5767写地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
iic_write8bit(radio_write_data[i]);
iic_ack();
}
}
iic_stop();
}
//由频率计算PLL
void get_pll(void)
{
unsigned char hlsi;
unsigned int twpll=0;
hlsi=radio_write_data[2]&0x10; //HLSI位
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
}
void radio_read(void)
{
unsigned char i;
unsigned char temp_l,temp_h;
pll=0;
iic_start();
iic_write8bit(0xc1); //TEA5767读地址
if(!iic_testack())
{
for(i=0;i<5;i++)
{
radio_read_data[i]=iic_read8bit();
iic_ack();
}
}
iic_stop();
temp_l=radio_read_data[1];
temp_h=radio_read_data[0];
temp_h&=0x3f;
pll=temp_h*256+temp_l;
get_frequency();
}
//手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
void search(bit mode)
{
radio_read();
if(mode)
{
frequency+=100;
if(frequency>max_freq)
frequency=min_freq;
}
else
{
frequency-=100;
if(frequency<min_freq)
frequency=max_freq;
}
get_pll();
radio_write_data[0]=pll/256;
radio_write_data[1]=pll%256;
radio_write_data[2]=0x41;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
radio_write();
DISP_FM();
}
//自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台
void auto_search(bit mode)
{
bit BLF;
radio_read();
if(BLF)
{ if(mode)frequency=min_freq;
else frequency=max_freq;
}
else{
if(mode)
{
frequency+=100;
if(frequency>max_freq)
frequency=min_freq;
}
else
{frequency-=100;
if(frequency<min_freq)
frequency=max_freq;
}
}
get_pll();
if(mode)
radio_write_data[2]=0xb1;
else
radio_write_data[2]=0x41;
radio_write_data[0]=pll/256+0x40; //加0x40是将SM置为1 为自动搜索模式
radio_write_data[1]=pll%256;
radio_write_data[3]=0x11; //SSL1和SSL0控制搜索停止条件
radio_write_data[4]=0x40;
radio_write();
radio_read();
while(!(radio_read_data[0]&0x80)) //搜台成功标志
{
radio_read();
DISP_FM();
UART_Put_Num(frequency);
}
if((radio_read_data[0]&0x40)==0x40)BLF=1;
else BLF=0;
get_pll();
if(radio_read_data[2]&0x80)radio_write_data[2]=0xb1;
else radio_write_data[2]=0x41;
radio_write_data[0]=pll/256;
radio_write_data[1]=pll%256;
radio_write_data[3]=0x11;
radio_write_data[4]=0x40;
radio_write();
radio_read();
DISP_FM();
}
void main(void)
{ P3=0xFF;
P1=0x00;//这是为了关闭开发板上的数码管实际应用去掉
P20=0; //这是为了关闭开发板上的数码管实际应用去掉
P21=0; //这是为了关闭开发板上的数码管实际应用去掉
P35=0; //这是为了关闭开发板上的点阵实际应用去掉
P1=0xFF;//P1口置1
LCD_Init();
LCD_Clear();//清屏
UART_Init();//串口初始化
UART_Send_Str("调频收音机\n");
radio_write();
while(1)
{
if(KEY1==0)
{
delay1ms(15); //延时15ms
if(KEY1==0)
while(KEY1==0);//等待按键释放
search(1);
radio_read();
UART_Send_Str("目前频率\n");
UART_Put_Num(frequency);
UART_Send_Str("\n");
DISP_FM();
}
if(KEY2==0)
{
delay1ms(15); //延时15ms
if(KEY2==0)
while(KEY2==0);//等待按键释放
search(0);
radio_read();
UART_Send_Str("目前频率\n");
UART_Put_Num(frequency);
UART_Send_Str("\n");
DISP_FM();
}
if(KEY11==0)
{
delay1ms(15); //延时15ms
if(KEY11==0)
while(KEY11==0);//等待按键释放
auto_search(0);
radio_read();
UART_Send_Str("目前频率\n");
UART_Put_Num(frequency);
UART_Send_Str("\n");
DISP_FM();
}
if(KEY22==0)
{
delay1ms(15); //延时15ms
if(KEY22==0)
while(KEY22==0);//等待按键释放
auto_search(1);
radio_read();
UART_Send_Str("目前频率\n");
UART_Put_Num(frequency);
UART_Send_Str("\n");
DISP_FM();
}
}
}
6总结
经过三天的设计和开发,FM收音机已经做成并能正常工作,通过这次设计实践掌握了基本硬件电路的设计、焊接与故障调试,并学习了keilc编程语言,总之收获颇丰。我了解了无线电信号的产生、发射和接收过程,尤其是懂得了接收机的完全工作原理。在今后的实践工作中,它将带给我无穷的设计思路和指导。
对硬件方面的焊接工作没想到这项看起来不需要多少技术的工作却是非常的劳心劳力。作为一个电子方面的大学生,在今后的工作中难免需要很强的实践动手能力,所以这次课程设计实践对我来说是很值得珍惜的好机会。这次课程设计,虽然短暂,但却给了我一次自主设计电路的机会。在设计过程中,以前书本上的容第一次完完全全的在实际中实现,并且遇到了书本中不曾学到的情况。
通过本次设计,留给我印象最深的是要设计一个成功的电路,必须要有耐心,要有坚持的毅力。在整个电路的设计过程中,花费时间最多的是各个单元电路的连接与电路的细节设计上。在设计过程中,我们仔细比较分析其原理以与可行的原因,最后还是在老师的耐心指导下,使整个电路可稳定工作。实习过程中,我深刻的体会到在设计过程中,需要反复实践,其过程很可能相当烦琐,有时花很长时间设计出来的电路还是需要重做,那时心中未免有点灰心,有时还特别想放弃,此时更加需要静下心,查找原因。
7参考文献
[1] 俊谟.单片机中级教程——原理与应用.:航空航天大学,2006年10月.
[2] 唐工.51单片机工程应用实例. :航空航天大学,2006年3月.
展开阅读全文