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