1、课程设计单片机控制的收音机五邑大学单片机课程设计题目:基于单片机的收音机设计 院系 信息工程学院 专业 电子信息工程(职教师资) 学号 13071825 姓名 骆子申 学号 13071826 姓名 申春龙 指导教师 姜为民 报告日期 2014年12月 一、 概述收音机,是一种小型的无线电接收机。主要用于收听无线电发射台,通常是民用广播电台发送的娱乐及资讯节目。收音机的工作过程是:天线把空中的电磁场转化成电压信号,调谐电路选中所需频率的信号,检波器将高频信号还原成音频信号(即解调),解调后得到的音频信号,再经过放大获得足够功率,推动扬声器发声。本次设计利用STC89C52单片机控制收音机模块PL
2、102BA-S(基于SI4730芯片),可以接收不同频率的FM电台信号。作品使用LCD1602液晶屏显示,通过5个按键实现了调节频率和音量,存台和读台的功能。图1 作品展示二、 设计方案分析 1. 原理图分析1.1收音机模块PL102BA-S(基于SI4730芯片)图2 鞭状天线加上调频电路和AM铁氧体天线原理图收音部分选用了PL102BA-S收音机模块,它是最新开发生产的一片高性能调频/调幅(FM/AM )双波段收音模块,采用Silicon LABS 的全数字COMS单晶片集成电路SI4730。内置数字频率调谐和DSP解码器,支持数字音频输出及RDS 接收功能。支持I2C及SPI总线控制模式
3、,AM支持环状天线及铁氧体磁性棒状天线。 其具有接收灵敏度高、抗干扰能力强、外部元件少、体积小、低功耗、低噪声、低成本、使用简单等优点。图3 PL102BA-S收音机模块电路接线图其中在:CLK(时钟脚): 接一个上拉电阻,因为SI4730使用了I2C通信接口。DIO(数据脚):由于SI4730和单片机电压不匹配,因此要串入一个限流电阻。RST(复位脚):为低电平有效,同理此处也要串入一个限流电阻。FMI(天线脚):需要串入一个104的瓷片电容,只让频率合适的信号通过。ROT和LOT(左右声道输出脚):各接了一个耦合电容,防止直流输出。因为SI4730模块是3.3V供电,而STC89C52单片
4、机是5V供电,因此需要降压供电。我们选用了AMS公司生产的线性稳压器AMS1117-3.3提供3.3V的电压给SI4730模块供电。AMS1117-3.3是一个正向低压降稳压器,具有高精度、低漏失电压、有限流限热保护等优点。图4 用排针和洞洞板引出引脚的收音机模块PL102BA-S(基于SI4730芯片)1.2单片机最小系统单片机最小系统,是指用最少的元器件组成单片机可以工作的系统。单片机最小系统的三要素就是电源、晶振、复位电路。为简化电路,本次作品中省去了复位电路。图5 单片机最小系统单片机采用STC89C52,这是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可
5、编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。图6 单片机简洁的引线,省略了烧写接口和复位电路1.3独立按键模块图7 独立按键模块电路图独立按键模块主要是用来设置收音机的频率和音量,存台和读台功能的,这里将按键的一般接单片机的I/O,一边接地。由于单片机I/O口内部具有上拉电阻,因此在按键没有按下的情况下,I/O口检测到的是高电平;只要按键一按下,单片机I/O口就会检测到低电平。SW1
6、 :模式键,用来切换此时是调节频率还是调节音量;SW2 :读台/确定键,可以用来读取已经存储在EEPROM的电台。还可以作为存台时的确定键。SW3 :存台键,用来存储电台到单片机的内部EEPROM中。SW4 :加键,用来增加频率或者音量。SW5 :减键,用来减小频率或音量。图8 按键布局1.4液晶显示模块LCD1602图9 LCD1602液晶显示模块外观1602采用标准的16脚接口和TTL电平,其中:第1脚:GND接电源地。第2脚:VCC接5V电源。第3脚:V0为液晶显示器对比度调整端,根据经验此处用1K接地。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚
7、:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第15脚背光正极。第16脚背光负极。图10 液晶显示模块LCD1602电路接线与引脚图2. PCB图图11 AD09软件中的PCB图 为了节约空间,我们将单片机放到液晶屏底下,而把晶振又放到单片机的底下。电源和收音模块则用排针引出,以方便安装。整机结构紧凑,体现了良好的设计和焊接功底。图12 晶振、单片机和液晶屏的巧妙布局三、 心得体会这次收音机设计,应该说是一波三折。一开始是打算用洞洞板搭焊的,但是用洞洞板搭焊
8、的外观非常差,而且焊盘经常脱落。所以就改为印刷pcb版。对于因为平时自己也有练练手,所以有单片机剩下来,就选择了这块STC89C52。买回模块PL102BA-S后,当然先看资料掌握性能和功能。然而资料全是英文的,我们花了好大的力气,反复查阅词典得知此模块功能非常齐全,具有AM/FM/FM-RDS三种接收功能,有数字/模拟两种音频输出,有I2C/SPI两种控制方式。我们从实际出发,以简单实用为原则,确定只使用其FM接收、模拟音频输出和I2C控制功能。而收音模块的安装也是受到其他同学作品的启发。因为模块的尺寸实在太迷你了,许多同学的作品都用洞洞板和排针把模块的脚印出,效果居然不错,于是我们也依葫芦
9、画瓢。 接下来开始用Altium Designer 09设计PCB,用热转印纸印出来。可能是实验室的腐蚀药水浓度太低,居然浸泡了一天一夜还没有腐蚀好。查阅资料才知道,原来腐蚀的过程需要不断摇晃,以增加腐蚀速度。果然,边摇晃边浸泡,半小时左右就腐蚀好了。可是,凡事都没有两全的,在我们的pcb板快要腐蚀好的时候,我们发现有一些线路因为过分腐蚀而断开了。幸好断开的地方不是很大,焊的时候注意点就行了。制作出来后调试,大部分功能基本没问题,但是当手去触摸电路板的LCD1602管脚时,LCD1602会出现乱码,最终只能在LCD1602的信号脚上加入上拉电阻,防止干扰。 接下来就是程序的优化问题,优化过程中
10、发现,当按下模式键时,如果此时再按下读台或存台键,屏幕就会出现乱码,最后在程序中加入相应的开关变量,最终问题得到解决。部分程序如下:void KeyRead()/读取按键并且执行按键操作 static uchar msflag = 1; /*三行按键程序,很巧妙*/ uchar ReadData=P10xff; /取反 Trg=ReadData & (ReadDataCont);/判断是否点动 Cont=ReadData;/判断是否长按 if(Trg & KEY1) /频率和音量选择键 if(!dutai & !cuntai) /不是读台和存台模式时 msflag = 0; moshi+; m
11、oshiflag = 0; if(moshi=3) moshiflag = 1; moshi = 0; if(Trg & KEY2) /读台/存台确定键 if(msflag | moshiflag) /不在频率和音量选择模式时 if(!cuntai) /非存台模式时 dutai = dutai; dt(); /读台 else /存台模式时 cuntai = 0; moshi = 0; ct(); /存台 if(Trg & KEY3) /存台键 if(msflag | moshiflag) /不在频率和音量选择模式时 if(!dutai) /不在读台模式时 cuntai = cuntai; if
12、(Trg & KEY4) /加键 if(dutai) /读台模式时 no+; if(no=4) no = 4; dt(); /读台 else if(cuntai) /存台模式 no+; if(no=4) no = 4; else /频率和音量选择模式时 switch(moshi) case 1 : /频率模式 FM_FREQ+=10; /0.1MHz if(FM_FREQ = 10800) /108MHz FM_FREQ = 10800; Si47XX_Set_FM_Frequency(FM_FREQ); /设置FM的频率 break; case 2 : /音量模式 Volume+; if(V
13、olume=63) Volume = 63; si47xxFMRX_set_volume(Volume); break; default : break; if(Trg & KEY5) /减键 if(dutai) /读台模式时 no-; if(no=1) no = 1; dt(); /读台 else if(cuntai) /存台模式 no-; if(no=1) no = 1; else /频率和音量选择模式时 switch(moshi) case 1 : /频率模式 FM_FREQ-=10; /0.1MHz if(FM_FREQ = 6400) /64MHz FM_FREQ = 6400; S
14、i47XX_Set_FM_Frequency(FM_FREQ); /设置FM的频率 break; case 2 : /音量模式 Volume-; if(Volume10) /长按多久才进入 cnt_plus2=9; /用来下次快速进入 switch(moshi) case 1 : /频率模式 FM_FREQ+=100; /1MHz if(FM_FREQ = 10800) FM_FREQ = 10800; Si47XX_Set_FM_Frequency(FM_FREQ); /设置FM的频率 break; case 2 : /音量模式 Volume=Volume+1; if(Volume=63)
15、Volume = 63; si47xxFMRX_set_volume(Volume); break; default : break; else cnt_plus2=0;/清零,有毛刺 if(Cont & KEY5) /长按按键5 cnt_plus1+; if(cnt_plus110) /长按多久才进入 cnt_plus1=9; /用来下次快速进入 switch(moshi) case 1 : /频率模式 FM_FREQ-=100; /1MHz if(FM_FREQ = 6400) FM_FREQ = 6400; Si47XX_Set_FM_Frequency(FM_FREQ); /设置FM的
16、频率 break; case 2 : /音量模式 Volume = Volume-1; if(Volume = 0) Volume = 0; si47xxFMRX_set_volume(Volume); break; default : break; else cnt_plus1=0;/清零,有毛刺 /*主函数*/void main (void) T_ERROR_OP a,b; LcdInit(); FM_FREQ=9200; /FM的初始频率(64108MHz),1代表10KHz Delay_1ms(200); si47xx_reset(); /si47xx复位 a=Si47XX_Power
17、_Up(FM_RECEIVER); /si47xx进入上电模式,并选择FM接收模式 if(a=ERROR) while(1); Delay_1ms(250); /这里一定要加延时,否则收音机不能收音 b=Si47XX_Set_FM_Frequency(FM_FREQ); /设置FM的频率 if(b=ERROR) while(1); Volume=Byte_Read(0x2800); /上电读取音量 si47xxFMRX_set_volume(Volume); /设置音量 LcdShowStr(1,0,Welcome to use ); Delay_1ms(200); Delay_1ms(200); DisplayFreq(); /在液晶上显示频率相关的数据 Time0_init(); /定时器0初始化 while(1) void time0(void) interrupt 1 static uchar i=0; TH0=(65536-3721)/256; /4ms TL0=(65536-3721)%256; i+; if(i=12) /48ms i = 0; KeyRead(); /按键处理函数 DisplayFreq(); /在液晶上显示频率相关的数据
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1