课程设计单片机控制的收音机.docx

上传人:b****6 文档编号:7782610 上传时间:2023-01-26 格式:DOCX 页数:17 大小:1,002.97KB
下载 相关 举报
课程设计单片机控制的收音机.docx_第1页
第1页 / 共17页
课程设计单片机控制的收音机.docx_第2页
第2页 / 共17页
课程设计单片机控制的收音机.docx_第3页
第3页 / 共17页
课程设计单片机控制的收音机.docx_第4页
第4页 / 共17页
课程设计单片机控制的收音机.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

课程设计单片机控制的收音机.docx

《课程设计单片机控制的收音机.docx》由会员分享,可在线阅读,更多相关《课程设计单片机控制的收音机.docx(17页珍藏版)》请在冰豆网上搜索。

课程设计单片机控制的收音机.docx

课程设计单片机控制的收音机

 

五邑大学

单片机课程设计

题目:

基于单片机的收音机设计

 

院系信息工程学院

专业电子信息工程(职教师资)

学号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();//在液晶上显示频率相关的数据

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1