大学生毕业设计 基于TEA5767和单片机的数字FM收音机设计
基于TEA5767的数字式收音机设计报告

大学物理与电子学院课程设计报告基于TEA5767的数字调频收音机报告人:王世威专业:通信工程设计小组成员:王世威、何康目录前言 (3)一、主要器材介绍 (4)1.1 STC89C52单片机 (4)1.2 TEA5767收音模块儿 (4)1.3 1602LCD显示屏 (5)1.4 LM386音频功率放大器 (6)二、系统原理及功能介绍 (7)2.1数字FM收音机基本原理 (7)2.2系统功能介绍 (7)三、元件清单 (9)四、制作过程 (10)4.1 前期准备 (10)4.2 实物图 (10)4.3焊接过程中遇到的问题和注意事项 (12)五、程序 (13)六、结论 (23)前言十九世纪无线电通讯技术的发明,使通信摆脱了依赖导线的传统方式,是通信技术上的一次飞跃,也是人类科技史上的一个重要成就。
作为无线电通信的的杰出成果,收音机的发明极改变了人们的生活方式,给人们的生活带来了无穷的乐趣。
随着科技的发展,技术不断地更新换代,收音机也沿着矿石收音机、电子管收音机、晶体管收音机、集成电路收音机的轨道不断进步着。
近年来,随着DSP技术的发展,采用DSP技术研发的收音机芯片的出现,“硬件无线电”由“软件无线电”代替,大大降低了收音机制造业的门槛。
2006年凯隆电子与美国芯科实验室合作,开发出世界上第一台数字收音机。
数字技术收音机的问世,标志着传统模拟收音机将逐渐退出历史舞台。
收音机的数字时代已经到来。
数字调频收音机就是无线电模拟信号由天线感应后接收后,在同一块儿芯片里放大,然后转化为数字信号,再对数字信号进行处理,然后还原成模拟音频信号输出。
数字调频收音机体积小、重量轻、寿命长、频率稳定、操作简便等优点,使其在市场上越来越受欢迎。
本次项目设计,我们对数字调频收音机的原理在理论上进行了充分的了解,基于其基本理论,我们制作了一台数字调频收音机。
一、主要器材介绍本系统主要由STC89C52单片机、1602LCD显示屏、LM386音频功率放大器、TEA5767收音模块儿、电阻电容等组成。
基于单片机和TEA5767HN的FM收音机系统的设计

在当前数字信息技术和网络技术高速发展的PC时代。
嵌入式技术越来越同人们的生活紧密相关。
其中掌上嵌入式电子产品更是给人们的生活带来了很大方便和很多快乐。
尽管生活方式不断发生变化,但无线电仍然很流行。
因此,本文针对TEA5767HN数字收音机芯片的控制机理,阐述了通过该芯片和C51单片机来将FM数字收音机嵌入智能电子产品的设计方法。
1 系统整体设计思路本立体声FM数字收音机的设计目标是通过单片机AT89S52来控制FM接收芯片TEA5767HN,从而实现可自动搜索并存储10多个电台节目(也可手动搜索并存储电台节目)。
所收听电台的频率和台号及时钟可在显示模块中的LCD上显示,音量则可通过音量加、减按键自主控制,并能存储关机时设定的数据以及闹钟功能。
具体系统设计框图如图1所示。
本系统主要由单片机AT89S52控制模块、TEA5767HN收音模块、音量控制模块、ROM存储模块、显示模块、按键模块和电源模块七部分组成。
本系统硬件设计的关键则在于FM接收、音频处理等模拟部分;软件设计的关键在于控制模块与收音模块之间的通信。
从图1中可以看出,控制模块仅仅通过I2C总线与收音模块连接并控制收音机工作。
本设计使用单片机P3口的两个I/O脚来模拟I2C总线的SDA和SCL时序并与TEA5767HN 通信;TEA5767HN输出的左右声道音频信号可通过音量控制模块进行前级放大及音量控制,然后输入到TDA7057进行后级功率放大,最后输出到扬声器。
单片机可通过I2C总线进行音量调节;ROM存储模块主要用于存储电台数据、音量数据和时钟数据,为存储和读取数据带来方便。
系统可通过按键进行操作,通过MCU检测按键信号并经单片机实现手动搜台、自动搜台、音量控制、时钟调整等功能,各项操作提示和操作结果均可通过LCD显示出来。
稳压电源模块产生的5 V和3.3 V电压可分别为各个模块器件供电。
2 硬件系统电路设计由于本系统硬件设计的关键在于FM接收、音频处理等模拟电路部分,其余电路均为常规电路,因而其硬件系统的设计着重分析收音模块、音量控制模块这两部分电路。
单片机控制的TEA5767高性能FM收音机DIY

[分享]单片机控制的TEA5767高性能FM收音机DIY(含原理图,源代码)Post By:2007-10-10 11:41:57本帖向大家介绍新型FM收音机的设计及制作。
想想当年我们是什么做收音机的。
高放混频,解调,立体声解码,锁相等好几个芯片,线路焊好了,但痛苦才开始。
有设备还好些,没有更苦。
为了找谐振点,不停的调电容电感,不停的换电容电感······终于有声音,但始终都没那么好。
现在,痛苦终于过去。
因为有了新一代的芯片TEA5767。
TEA5767 ,零调整。
线路又极其简单。
一个晶振,一个电感,几个电容完了。
通过I2C 接口送几个字节的数据进去就ok。
此主题相关图片如下:此主题相关图片如下:源代码:可以存台的版本。
本文用到的收音模块可到:/参考// WINAVR GCC// ATmega8// clock: internal 1Mhz#include <avr/io.h>#include <avr/interrupt.h>#include <avr/signal.h>#include <avr/delay.h>#include <avr/eeprom.h>#include '3310LCD_function.c'#define uchar uint8_t#define uint uint16_t#define SLA_W 0b11000000 #define SLA_R 0b11000001uchar senddata[5] ;uchar readdata[5] ;uchar search = 0;uchar search_up = 0;uchar mode = 1;uchar station = 0;uint pll = 0x29da; // 88Mhz uint fre = 8750;//-------------------------------// 延时void delay_ms(uint ms){uint i;for(i=0;i<ms;i++)_delay_loop_2(250);}//I2C主机模式输出void set5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG//if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_W; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();for ( i = 0; i < 5; i++ ){TWDR = senddata;TWCR = (1<<TWINT) | (1<<TWEN); // send datawhile (!(TWCR & (1<<TWINT)));// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(60,3,'sOK');}//I2C主机模式输入void read5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG//if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_R; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));for ( i = 0; i < 5; i++ ){TWCR = (1<<TWINT) | (1<<TWEN); // read datawhile (!(TWCR & (1<<TWINT)));readdata = TWDR ;// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(10,3,'rOK');}void show_frequency(void){uint32_t nPLL =0; //Decuint32_t frequency = 0; //Khzuchar display_bit[5];uchar tbTmp1=readdata[1];uchar tbTmp2=readdata[0];tbTmp2&=0x3f;nPLL=pll ;//tbTmp2*256+tbTmp1;// calculate searched station frequencyif(senddata[2]&0x10)frequency =(unsigned long)(nPLL*82/10-225);elsefrequency =(unsigned long)(nPLL*82/10+225);display_bit[0] = frequency / 100000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20;else display_bit[0] += 0x30;display_bit[1] = (frequency / 10000)%10 +0x30;display_bit[2] = (frequency / 1000)%10 +0x30;display_bit[3] = (frequency / 100)%10 +0x30; display_bit[4] = (frequency / 10)%10 +0x30; LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_frequency2(void){uchar display_bit[5];display_bit[0] = fre / 10000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20; else display_bit[0] += 0x30;display_bit[1] = (fre / 1000)%10 +0x30; display_bit[2] = (fre / 100)%10 +0x30;display_bit[3] = (fre/10) %10 +0x30;display_bit[4] = fre%10+0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_rx_power(void){uchar temp;temp = (readdata[3]>>4);LCD_write_english_string(60,0,' ');LCD_write_char((temp/10)%10 + 0x30 ); LCD_write_char(temp%10 + 0x30 );}void show_rx_power_blank(void){LCD_write_english_string(60,0,' ');}void calculate_pll(void){uint32_t temp;temp = fre;pll = (uint)( ( (temp*10-225)*4000)/32768);}void init(void){DDRB = 0XFF;PORTB = 0XFF;DDRD = 0B11100000;PORTD = 0XFF;DDRC = 0B00000000;PORTC = 0Xff; // IO initdelay_nms(250);delay_nms(250);delay_nms(250);delay_nms(250);//TWITWBR = 12;TWCR = (1<<TWEN); //SEND STOP SIGNALOSCCAL=0x9d; // 8M系统内部时钟校准//设置MCU的I/O口DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK;SPSR |= (1<<SPI2X); // 设置SPI时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI接口,主机模式,4M时钟LCD_init(); //初始化液晶}//////////////////////////////////////////////////////////////////int main(void){init();uint x;senddata[0] = pll/256; //load 100MHz pllsenddata[1] = pll%256; // away's low side injection senddata[2] = 0b00100000;senddata[3] = 0b10010000;senddata[4] = 0b01000000;readdata[0] = senddata[0];readdata[1] = senddata[1];LCD_write_english_string(0,0,'FM STEREO' );//LCD_write_english_string(0,5,' stereo' );//LCD_write_english_string(0,2,' 99.1Mhz' );show_frequency();LCD_write_inverse_string(0,5,' UP ');LCD_write_inverse_string(48,5,' DOWN ');station = eeprom_read_byte(22);fre = eeprom_read_word( station *2);calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);//delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);while(1){start:if ( (PIND&0x0c) == 0x04){delay_nms(50);if ( (PIND&0x0c) == 0x04){LCD_write_english_string(48,5,' DOWN ' );delay_nms(200);x= 0;while(bit_is_clear(PIND, 3)){x++;if ( x > 65530 ) //判断是否长按{if ( mode ){mode = 0; //改变模式LCD_write_english_string(0,4,'SET CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{mode = 1; //改变模式LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);LCD_write_english_string(24,4,' ' );eeprom_write_word(station*2,fre);}loop_until_bit_is_set(PIND, 3);LCD_write_inverse_string(48,5,' DOWN '); goto start;}}//LCD_write_english_string(0,4,'KEY1 press' ); LCD_write_inverse_string(48,5,' DOWN ');if ( mode ){station --;if ( station < 1 ) station = 10; eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' ); LCD_write_char(station/10 +0x30); LCD_write_char(station%10 +0x30); }else{fre -=5;if ( fre <= 8750 ) fre = 10800;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();}}if ( (PIND&0x0c) == 0x08){delay_nms(50);if ( (PIND&0x0c) == 0x08){LCD_write_english_string(0,5,' UP ');delay_nms(200);if ( mode ){loop_until_bit_is_set(PIND, 2);LCD_write_inverse_string(0,5,' UP ');station ++;if ( station >= 11 ) station = 1;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' ); LCD_write_char(station/10 +0x30); LCD_write_char(station%10 +0x30); }else{fre +=5;if ( fre >= 10800 ) fre = 8750;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();//loop_until_bit_is_set(PIND, 2);LCD_write_inverse_string(0,5,' UP ');}}}}}。
基于TEA5765收音模块制作可显示频率的FM收音机相关文件

TEA5767的总线接口和控制寄存器可编程芯片必须要由单片机通过控制总线向芯片内的寄存器写入控制字才能正常工作。
TEA5767的控制总线有I2C和3-wire两种,引脚BUSMODE为低时选用I2C总线,引脚BUSMODE 为高时选用3-wire总线。
这里以I2C总线为例说明控制字的写入和读出。
1.TEA5767的I2C总线TEA5767 I2C总线的地址是CO,是可收发的从器件结构,无内部地址。
最大低电平是0.2 VCCD,最大高电平是0.45VCCD。
向TEA5767 写入数据时,地址的最低位是0,即写地址是C0。
读出数据时地址的最低位是1,即读地址是C1。
TEA5767的控制寄存器要写入5个字节,每次写入数据时必须严格按照下列顺序进行:地址、字节1、字节2、字节3、字节4、字节5。
每个字节的最高位首先发送。
在时钟的下降沿后写入的数据生效。
上电复位后,设置为静音,所有其它位均被置低,必须写入控制字初始化芯片。
表1 I2C写模式TEA5767遵守通用的I2C总线通信协议,写模式和读模式的格式分别见表1和表2。
2.写数据TEA5767内部有一个5个字节的控制寄存器,在IC上电复位后必须通过总线接口向其中写入适当的控制字,它才能够正常工作。
每个数据字节各位的功能含义见表4到表14。
表3 写模式数据序列表4 数据字节1的格式表5 数据字节1各位的说明表6 数据字节2的格式表7 数据字节2各位的说明表10 搜索停止电平设定3.读数据和写数据类似,从TEA5767 读出数据时,也要按照“地址、字节1、字节2、字节3、字节4、字节5”这样的顺序读出,读地址是C1。
读出的5个字节的含义见表16到表25中的说明。
表15 读模式表16 字节1的格式表17 字节1的说明表19 字节2的说明表20 字节3的格式下面是用来计算PLL控制字的C语言程序:static void AssembleFrequencyWord(void){UINT16 twPLL =0; //DecUINT32 tdwPresetVCO =gdwPresetVCO; //KhzBYTE tbTmp1;BYTE tbTmp2;// calcu1ate frequency dataword bits from given station frequency BCD:if(FlagHighInjection)twPLL =(unsigned int)((float)((tdwPresetVCO+225)*4)/(float)REFERENCE_FREQ);elsetwPLL=(unsigned int)((float)((tdwPresetVCO -225)*4)/(float)REFERENCE_FREQ);//convert word to byte f.tbTmp1 =(unsigned char)(twPLL%256); //6789=Hex1A85 -->133=Hex85tbTmp2 =(unsigned char)(twPLL/256); // -->26=Hex1AWriteDataWord[0]=tbTmp2; //high block WriteDataWord[1]=tbTmp1;}其中频率的单位均为KHz,计算的结果是2字节的二进制数。
单片机控制的TEA5767高性能FM收音机DIY

[分享]单片机控制的 TEA5767高性能FM 收音机 DIY (含原理图,源代码 ) Post By : 2007-10-10 11:41:57本文用到的收音模块可到: / 参考本帖向大家介绍新型 FM 收音机的设计及制作。
想想当年我们是什么做收音机的。
高放混频,解调,立体声解码,锁相等好几个芯片,线路焊好了,但痛苦才开始。
有设备还好些,没有更苦。
为了找谐振点,不 停的调电容电感,不停的换电容电感••…终于有声音,但始终都没那么好。
现在,痛苦终于过去。
因为有了新一代的芯片 TEA5767。
TEA5767 ,零调整。
线路又极其简单。
一个晶振,一个电感,几个电容完了。
通过 接口送几个字节的数据进去就ok 。
I 弓此主题相关图片如下:电子・CNC 爱好看源动力|二1此主题相关图片如下: 电子・CNC 爱好者■源动力源代码:可以存台的版本。
I2C 磁动力论坛bbs 磁动力论坛bbs.cdle. net// WINAVR GCC// ATmega8// clock: internal 1Mhz#include <avr/io.h>#include <avr/interrupt.h>#include <avr/signal.h>#include <avr/delay.h>#include <avr/eeprom.h>#include '3310LCD_function.c'#define uchar uint8_t#define uint uint16_t#define SLA_W 0b11000000 #define SLA_R 0b11000001uchar senddata[5] ;uchar readdata[5] ;uchar search = 0;uchar search_up = 0;uchar mode = 1;uchar station = 0;uint pll = 0x29da; // 88Mhzuint fre = 8750;//// 延时void delay_ms(uint ms){uint i;for(i=0;i<ms;i++)_delay_loop_2(250);}//I2C 主机模式输出void set5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START whileSIGNAL (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG //if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_W; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));//if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();for ( i = 0; i < 5; i++ ){TWDR = senddata;TWCR = (1<<TWINT) | (1<<TWEN); // send datawhile (!(TWCR & (1<<TWINT)));// if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL // if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();}//LCD_write_english_string(60,3,'sOK');}//I2C 主机模式 输入void read5767(void){uchar i = 0;TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START while (!(TWCR & (1<<TWINT))); // WAIT FOR START SIG //if ((TWSR & 0xF8) != START) ERROR();TWDR = SLA_R; // send addressTWCR = (1<<TWINT) | (1<<TWEN);while (!(TWCR & (1<<TWINT)));for ( i = 0; i < 5; i++ ){TWCR = (1<<TWINT) | (1<<TWEN); // read datawhile (!(TWCR & (1<<TWINT)));readdata = TWDR ;SIGNALTWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL//LCD_write_english_string(10,3,'rOK');}void show_frequency(void){uint32_t nPLL =0; //Decuint32_t frequency = 0; //Khzuchar display_bit[5];uchar tbTmp1=readdata[1];uchar tbTmp2=readdata[0];tbTmp2&=0x3f;nPLL=pll ;//tbTmp2*256+tbTmp1;// calculate searched station frequency if(senddata[2]&0x10)frequency =(unsigned long)(nPLL*82/10-225); elsefrequency =(unsigned long)(nPLL*82/10+225);display_bit[0] = frequency / 100000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20; else display_bit[0] += 0x30;display_bit[1] = (frequency / 10000)%10 +0x30;display_bit[2] = (frequency / 1000)%10 +0x30;display_bit[3] = (frequency / 100)%10 +0x30;display_bit[4] = (frequency / 10)%10 +0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]);LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' MHz' );}void show_frequency2(void){uchar display_bit[5];display_bit[0] = fre / 10000 ;if ( display_bit[0] == 0 ) display_bit[0] = 0x20;else display_bit[0] += 0x30;display_bit[1] = (fre / 1000)%10 +0x30; display_bit[2] = (fre / 100)%10 +0x30; display_bit[3] = (fre/10) %10 +0x30;display_bit[4] = fre%10+0x30;LCD_write_english_string(0,2,' ' );LCD_write_char(display_bit[0]);LCD_write_char(display_bit[1]);LCD_write_char(display_bit[2]);LCD_write_english_string(30,2,'.' );LCD_write_char(display_bit[3]); LCD_write_char(display_bit[4]);LCD_write_english_string(48,2,' }void show_rx_power(void){uchar temp;temp = (readdata[3]>>4);LCD_write_english_string(60,0,'LCD_write_char((temp/10)%10 LCD_write_char(temp%10 + } void show_rx_power_blank(void) {LCD_write_english_string(60,0,' }void calculate_pll(void){uint32_t temp;temp = fre;MHz' );');+ 0x30 ); 0x30 );');pll = (uint)( ( (temp*10-225)*4000)/32768);void init(void){DDRB = 0XFF;PORTB = 0XFF;DDRD = 0B11100000;PORTD = 0XFF;DDRC = 0B00000000;PORTC = 0Xff; // IO initdelay_nms(250);delay_nms(250);delay_nms(250);delay_nms(250);//TWITWBR = 12;TWCR = (1<<TWEN); //SEND STOP SIGNALOSCCAL=0x9d; // 8M 系统内部时钟校准// 设置MCU 的I/O 口DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI| SPI_CLK;SPSR |= (1<<SPI2X); // 设置SPI 时钟倍速SPCR |= (1<<SPE)|(1<<MSTR); // 使能SPI 接口,主机模式,4M 时钟LCD_init(); // 初始化液晶////////////////////////////////////////////////////////////////// int main(void){init();uint x;senddata[0] = pll/256; //load 100MHz pllsenddata[1] = pll%256; // away's low side senddata[2] = 0b00100000;senddata[3] = 0b10010000;senddata[4] = 0b01000000;readdata[0] = senddata[0];readdata[1] = senddata[1];LCD_write_english_string(0,0,'FM STEREO' //LCD_write_english_string(0,5,' stereo' );//LCD_write_english_string(0,2,' 99.1Mhz' ); show_frequency();LCD_write_inverse_string(0,5,' UP ');LCD_write_inverse_string(48,5,' DOWN '); station = eeprom_read_byte(22);injection );fre = eeprom_read_word( station *2); calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);//delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);while(1){start:if ( (PIND&0x0c) == 0x04){delay_nms(50);if ( (PIND&0x0c) == 0x04){LCD_write_english_string(48,5,' DOWN ' );delay_nms(200);x= 0;while(bit_is_clear(PIND, 3))x++;if ( x > 65530 ) //判断是否长按{if ( mode ){mode = 0; // 改变模式LCD_write_english_string(0,4,'SET CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{mode = 1; // 改变模式LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);LCD_write_english_string(24,4,' ' );eeprom_write_word(station*2,fre);loop_until_bit_is_set(PIND,3);LCD_write_inverse_string(48,5,' DOWN '); goto start;}//LCD_write_english_string(0,4,'KEY1 press' );LCD_write_inverse_string(48,5,' DOWN ');if ( mode ){station --;if ( station < 1 ) station = 10;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2); calculate_pll(); show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{fre -=5;if ( fre <= 8750 ) fre = 10800;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();}}if ( (PIND&0x0c) == 0x08){delay_nms(50);if ( (PIND&0x0c) == 0x08){LCD_write_english_string(0,5,'delay_nms(200);UP ');if ( mode ){loop_until_bit_is_set(PIND, LCD_write_inverse_string(0,5,' station ++;if ( station >= 11 ) station 2);UP '); = 1;eeprom_write_byte( 22,station);//*pst = station *2;fre = eeprom_read_word( station *2);calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767();show_frequency2();show_rx_power();LCD_write_english_string(0,4,'CH' );LCD_write_char(station/10 +0x30);LCD_write_char(station%10 +0x30);}else{fre +=5;if ( fre >= 10800 ) fre = 8750;calculate_pll();show_rx_power_blank();senddata[0] = pll/256;senddata[1] = pll%256;set5767();delay_nms(200);delay_nms(200);read5767(); show_frequency2(); show_rx_power();} }//loop_until_bit_is_set(PIND,LCD_write_inverse_string(0,5,' UP ');2);。
《网络与信息》基于TEA5767的数字收音机设计

一、总体方案设计 1、FM接收频率范围:88MHz~108MHz。
2、设计硬件控制电路和单片机控制程序完成对FM收音模块的操作。
3、有电台自动搜索功能,能够控制电台搜索方向,搜索到电台信号后即可收听电台播音。
4、有电台频率显示功能,电台存储功能二、软硬件的系统设计(一)、硬件结构及各部分功能:单片机根据键盘输入,通过I2C对5767模块的控制寄存器进行读写操作,以实现5767模块的自动手动搜索功能,音频信号经过由TDA2822构成的功放电路放大处理由扬声器输出。
并将从5767模块中读取的频率字换算后显示在LCD上。
按存储键时,单片机将频率字写入24c02实现存台功能,按读取键即可收听所存电台。
总体框图:(二)、软件流程图三、测试给收音机上电后频率跳到初始设定值(91.8MHz),按手动搜索(上、下),可实现0.1MHz步进;按自动搜索键(上、下),可搜出最近的符合设定信号清晰度的频道;按存台键,可以将即时频率存入24c02中;按读取键即可调出该频率所对应的电台。
手动搜索时,从低端频率88MHz(PLL控制字是2A11H),每按一次手动搜索按钮,频率增加100kHz,读搜到电台标志位RF(读模式字节1的B7)为1时搜到电台,否则未搜到。
当搜索到波段尽头时,BLF(读模式字节1的B6)为1,如果再按手动搜索按钮,则从低端频率重新开始搜索。
自动搜索时,可以用静音搜索模式,搜索开始前静音位(写模式字节1的B7)置1,若从波段的低端频率88MHz开始搜索,采用向上搜索方式(写模式字节3的B7=1),反复读取控制字的RF标志位,若RF=1,则表明搜到电台。
接着检测STEREO位(读字节3的B7)为1,说明是立体声信号。
再检测BLF标志位,若BLF=1,说明已经搜到波段尽头,这时需将搜索的起始频率设为高端频率108MHz(PLL控制字是339BH),搜索方向设为向下搜索。
若BLF=0,说明未搜索到波段尽头,这时注意再按下自动搜索按钮时,应将当前停止位置的频率增加100kHz,然后继续搜索,否则程序可能停留在第一个搜到的电台频率上。
基于单片机的数字FM收音机设计与实现

基于51单片机的数字FM收音机
设计与实现
摘 要
关键词:数字调频;STC89C52;TEA5767;TDA2030
ABSTRACT
Nowadays peopleusually 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 inthis designingI will use the STC89C52 single-chip microcomputer and TEA5767 as the core components of digital FM radio system andUse the I2C communication to connect between STC89C52 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。
基于TEA5767模块的数字FM收音机设计

基于TEA5767模块的数字FM收音机设计姓名:指导老师:摘要本设计是一个数字调频收音机(FM),就是接受频率调制的无线电信号,经过解调还原成原信号的电子设备,利用单片机控制有FM功能的专用芯片,设计一个收音机系统。
本设计采用模块化设计,整个系统由控制模块,FM音频模块,电源模块和功放模块组成。
未处理系统采用单片机控制。
单片机自从20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。
STC89C52单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。
本设计另一核心采用的是TEA5767芯片,它是由PHILIPS 公司推出的针对低电压应用的单芯片数字调谐FM立体声收音机芯片。
TEA5767芯片内集成了完整的IF频率选择和鉴频系统,就可实现FM收音机的全部功能。
设计的液晶屏采用的是Nokia5110,该液晶屏的性价比高,接口简单,速度快,适合便携式供电设备。
本设计主要是体现单片机系统的自动控制能力,更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。
关键词:STC89C52 Nokia5110 TEA5767AbstractThe design is a digital FM radio (FM), It is to receive the frequency modulated radio signals, electronic equipment restored to the original signal after demodulation,the use of dedicated chip MCU control FM functions, design a radio system. The system consists of the control module, FM audio module, power module and power amplifier module. The Themicro-processing system microcontroller.The singlechip has come out since the 1970s, compared to is valued people's and the attention by the extremely high performance price, therefore the application is very broad, the development is very quick.STC89C52 Monolithic integrated circuit's characteristic is the volume is small, the integration rate is high, the weight is light, antijamming ability, is not high to the environment request, the low in price, the reliability is high, the flexibility is good, the development is easier. What this design uses is the TEA5767 chip, it is promotes by PHILIPS Corporation in view of the low voltage application single chip digit harmonious FM stereophonic receiver chip. In the TEA5767 chip integrated the complete IF frequency selection and the frequency discrimination system, only need the very few low cost periphery part, be possible to realize the FM radio's complete function.The design of the LCD screen is Nokia5110, The LCD screen have high cost , simple interface, fast, and suitable for portable power supply equipment. A more vital significance was monolithic integrated circuit's application changed the control system tradition design concept and the method.Keywords:STC89C52 , Nokia5110 , TEA5767目录摘要 (2)Abstract (2)目录 (3)绪论 ................................................................................................................ 错误!未定义书签。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要本设计是一个数字调频收音机(FM),就是接受频率调制的无线电信号,经过解调还原成原信号的电子设备,利用单片机控制有FM功能的专用芯片,设计一个基于TEA5767模块的数字FM收音机。
本设计采用模块化设计,整个系统由控制模块,FM音频模块和功放模块组成。
本设计核心采用的是TEA5767芯片,它是由PHILIPS公司推出的针对低电压应用的单芯片数字调谐FM立体声收音机芯片。
TEA5767芯片内集成了完整的IF频率选择和鉴频系统,就可实现FM收音机的全部功能。
采用的是Lcd1602液晶显示屏,实现单片机的频率值与模块内部的寄存器(PLL值)之间的相互转换,从而带动功放的工作。
功能:自动收台,手动收台,液晶显示。
采用主要模块有:(1)STC89C52单片机模块。
(2)Lcd1602显示模块。
(3)TEA5767收音机模块。
关键词:STC89C52 Lcd1602 TEA5767模块目录摘要 (2)1.绪论 (5)1.1 课题背景 (5)1.2 课题概述 (5)2.设计要求与思路 (5)2.1 收音机的设计要求 (5)2.2 系统设计整体思路 (5)3.主要电路模块的实现方案比较及选择 (6)3.1 控制模块方案选择 (7)3.2 液晶显示模块方案选择 (7)3.3 无线芯片方案选择 (7)4.系统电路图 (8)4.1 微控制器模块 (8)4.2 FM模块 (9)4.2.1 FM模块介绍 (9)4.3 工作原理 (10)4.3.1串行总线工作模式 (10)4.3.2 串行总线基本操作 (10)4.3.3数据传送 (12)4.3.4、三线总线工作模式 (12)5.系统软件设计 (13)5.1 主程序设计 (13)5.2 流程图 (14)6.硬件电路测试与检测 (14)6.1 硬件装配 (14)6.2 系统测试 (14)7.结束语 (15)8.参考文献 (15)9.致谢 (15)10.附录 (16)10.1 电路原理图 (16)10.2 电路PCB图 (16)10.3 电路实物图 (17)10.3 元器件清单 (18)11.操作框图 (19)程序框图 (20)12.程序 (21)12.1 主程序 (21)12.2 I2C总线 (26)12.3 Lcd1602程序 (29)基于TEA5767模块的数字FM收音机设计一.绪论1.1课题背景随着科学技术的不断发展,新颖的调频收音机的不断出现,技术不断的提高,设计出来的收音机外型精致和小巧。
从分离元件到集成电路,这标志着收音机的内部电路简单。
用一个集成块就能完成所有的工作。
从早期的调幅收音机到现在的调频收音机,我们可以想象收音机的不断的改进和不断创新,使收音机的发展空间愈来愈大。
现在,出现了新一代高科技产品——数字调频收音机,功能强大,性能优良,设计精巧耐用。
1.2课题概述收音机的接收原理就是把从天线接收到的高频信号经检波(解调)还原成音频信号,送到耳机变成音波。
由于广播事业发展,天空中有了很多不同频率的无线电波。
如果把这许多电波全都接收下来,音频信号就会象处于闹市之中一样,许多声音混杂在一起,结果什么也听不清了。
为了设法选择所需要的节目,在接收天线后,有一个选择性电路,它的作用是把所需的信号(电台)挑选出来,并把不要的信号“滤掉”,以免产生干扰,这就是我们收听广播时,所使用的“选台”按钮。
选择性电路的输出是选出某个电台的高频调幅信号,利用它直接推动耳机(电声器)是不行的,还必须把它恢复成原来的音频信号,这种还原电路称为解调,把解调的音频信号送到耳机,就可以收到广播。
二.设计要求与思路2.1收音机的设计要求:可对无线接收机的频率进行控制。
通过键盘可以设置接收频率,接收频率在88-108MHz内自选20M的带宽。
2.2系统设计整体思路(1)硬件部分:整体由52单片机控制,组成由液晶显示屏、功放模块、TEA5767收音机模块、按键。
如下图所示:图为:系统方案设计框图三、主要电路模块的实现方案比较及选择AM:改变载波的振幅称振幅调制。
AM是指对信号进行幅度调制。
一般做法就是先在原信号上叠加一个直流信号以保证信号f(t)+A>0,然后乘上一个高频的余弦信号,即得到g(t)=[f(t)+A]coswt。
在频域上的效果就是将原信号的频谱移动到w处,以适合信道传输的最佳频率范围。
g(t)的包络线即f(t)+A,用一个简单的包络检测电路就可以接收并还原信号了。
FM:改变载波的频率称频率调制。
音频信号的改变往往是周期性的。
与“FM 无线电波”相同,“FM合成理论”同样也有着发音体(载体)和调制体两个元素。
发音体或称载波体,是实际发出声音的频率振荡器;调制体或称调制器.本次方案选用的是FM调制。
理由有以下几点:1)在同样的频率、功率等条件下,用调频方式传输信号比调幅方式要远得多。
因为调幅方式的载频电平要高出噪声电平三四十分贝才能得到良好的图像指标,而调频方式只要高出噪声电平几分贝即可。
2)调频比调幅抗干扰能力强:外来的各种干扰、加工业和天电干扰等,对已调波的影响主要表现为产生寄生调幅,形成噪声。
调频制可以用限幅的方法,消除干扰所引起的寄生调幅。
而调幅制中已调幅信号的幅度是变化的,因而不能采用限幅,也就很难消除外来的干扰。
3)另外,信号的信噪比愈大,抗干扰能力就愈强。
而解调后获得的信号的信噪比与调制系数有关,调制系数越大,信噪比越大。
由于调频系数远大于调幅系数,因此,调频波信噪比高,调频广播中干扰噪声小。
4)调频波比调幅波频带宽。
3.1控制模块方案选择:方案:控制核心选择STC89C52单片机,该单片机有一个8位的微处理器,与通用的微处理器基本相同,STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
优势为结构简单,价格不高,易于购买。
缺点为缺少AD转换功能,运行速度较慢。
由于方案的单片机使用较为广泛,功能较为了解。
故采用此方案作为控制模块。
3.2液晶显示模块方案选择:方案:用Lcd1602显示屏,该显示屏具有2行16个字符。
Lcd1602具有体积小、重量轻、功耗低、寿命长、无辐射、无污染等优点,低压、微功耗极低的工作电压,只要2V-3V即可工作,而工作电流仅几个微安即每个显示字符只有几个微安。
优势为结构简单,价格不高,易于购买。
实际中应用到的机会比较大。
通过自己所掌握的知识与能力,由于对Lcd1602的使用比较了解。
故采用此次模块。
3.3无线芯片方案选择:TEA5767芯片,通过I2C接口与单片机进行通信。
单片机按键对TEA5767进行初始化输入接收频段的频率,TEA5767内部对信号滤波、放大、解调处理,输出信号经过功放进行放大,插上耳麦即可收听到电台节目,接收频率为87M~108MHz。
方案(1)采用无线芯片TEA5767,自己设计外围电路。
方案(2)采用相关厂家生产的TEA5767模块来实现。
很显然,第一种方案需要自己设计电路、画PCB和焊接,而TEA5767采用的是FVQFN40(耐热的薄型四脚扁平封装)封装,在短时间内和有限的条件下实现硬件功能的难度相当大。
所以本设计采用第二种选择方案——使用现成的模块。
四、系统电路图4.1微控制器模块单片机是控制单元的核心,起着控制收音机所有运行状态的作用。
单片机控制模块使用的是STC89C52,使用该芯片很容易实现对其他模块的控制。
通过对单片机STC89C52写入程序,可以方便的用软件来控制整个过程。
STC89C52单片机,支持USB口或者是串口两种下载程序方式,不用另买烧写器,编程器等产品,可以方便的烧写程序到单片机里;单片机内部有P0、P1、P2、P3个八位双向I/O口,外设与这些端口可以直接相接,无需另外的接口芯片。
P0-P3既可以按字节输入或输出,也可以按进位进行输入输出,共32条口线,其控制十分灵活方便。
单片机特点:(1)集成度高,体积小,可靠性高(2)控制功能强(3)低电压,低功耗(4)性价比高图4.1单片机最小系统P1口负责控制LCD液晶显示。
通过软件模拟SPI总线控制显示内容。
P2.6接TEA5767模块的DAT线。
P2.7接TEA5767模块的CLK线。
RET接复位端的RSTP3.0接下载线的RXDP3.1接下载线的TXDP3口负责扫描按键。
P3.2接按键1。
P3.3接按键2。
P3.4接按键3。
P3.5接按键4。
P3.6接按键5。
P3.7接按键6。
4.2FM模块图4.2 FM模块原理图DAT线接微控制器模块P2.6引脚。
CLK线接微控制器模块P2.7引脚。
DAT和CLK线组成IIC总线与微控制器通信。
OUTL输出左声道。
OUTR输出右声道。
4.2.1 FM模块介绍在方案设计时就已经确定FM部分采用按照datasheet推荐的应用设计电路图生产的模块。
本设计FM模块采用B20C封装的完整版收音机模块,外接引脚只有10个,开发者只需要关注引脚而不需要关注模块的内部结构,开发方便简单,使用过程简单。
4.3 工作原理:由于TEA5767收音机模块,必须要由单片机通过控制总线向芯片内的寄存器写入控制字才能正常工作。
而TEA5767收音机模块的控制总线有I2C和3-wire 两种。
在设计过程中,我们把模块的8脚(MODE)接地,因此,我们采用I2C 总线方式。
我们通过往单片机写入相关程序,然后通过I2C总线,实现单片机与TEA5767模块之间的双向转。
利用不同的按键操作,实现频率的各种改变。
在手动搜索模式下,通过按键的操作,增加(减少)频率值,然后通过I2C总线,传送数组到模块的寄存器中,转化为内PLL值。
而在自动搜索模式中,我们通过按键控制模块内部PLL值的增加(减少),然后通过读取模块内部的数组,通过计算,得出频率值,显示在数码管上,以带动蜂鸣器的工作。
4.3.1.串行总线工作模式:串行总线在传送数据过程中共有三种类型信号,它们分别是:开始信号,结束信号和应答信号。
开始信号:CLOCK为高电平时,DATA由高电平向低电平跳变,开始传送数据;结束信号:CLOCK为高电平时,DATA由低电平向高电平跳变,结束传送数据;应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
4.3.2 串行总线基本操作:⑴串行规程运用主/从双向通讯。
器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。
主器件和从器件都可以工作于接收和发送状态。
总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟 CLOCK 控制总线传输方向,并产生起始条件和停止条件。
DATA线上的数据状态仅在CLOCK 为低电平的期间才能改变,CLOCK为高电平的期间,DATA状态的改变被用来表示起始和停止条件。