51单片机FM收音机课程设计报告Word格式.docx
《51单片机FM收音机课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机FM收音机课程设计报告Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
2.2设计方案
项目采用“电子积木+底板”的形式,通过电子积木拼接,实现项目功能。
主要积木包括:
51单片机核心板、独立按键模块、FM模块、LCD1602液晶模块。
系统框图
51单片机FM收音机实物图
程序框图
3硬件电路
F
M接收模块
该模块采用RDA5802E芯片为核心的,新一代数字调频收音机模块。
具有比传统模拟制式收音机模块更突出的性能表现,音质极佳,噪音极少,功耗更低,集成度高,接收灵敏度高、中频选择性好、通用I2C总线控制、外围应用元件少、噪声系数低。
创新平台底板
该底板采用标准定位孔的设计,并集成有5V直流电源接口及自锁电源开关、3.3V电源、8路LED显示、外接接口拓展等。
在课程设计中,为各模块提供固定、供电和接口转换功能。
51单片机核心模块
51单片机核心板即CORE51-BOARD模块。
该模块为51单片机最小系统板,采用标准定位孔的设计,支持JTAG和串口两种下载方式,四组I/O口全部引出,可广泛用于单片机基础学习和电子创新等电子电路的微控制系统。
LCD1602液晶模块
LCD1602液晶模块,即LCD1602-BOARD板。
该模块以工业液晶LCD1602为核心,采用标准定位孔的设计,在原有液晶的基础上增加了背光控制功能。
该模块能够同时显示2行16列共计32个字符。
8位独立按键模块
本模块共8个独立按键,分别分为“上”、“下”、“左”、“右”键和A、B、C、D四个功能键,每个按键对应一个输出端口。
输出端默认高电平,当对应按键按下时,输出低电平。
4软件程序
4.1程序流程
本项目采用C51语言开发,在集成开发环境KEIL中编写完成。
(1)初始化
开机后,完成的初始化包括:
1、串口初始化。
串口初始化之后,可通过printf语句通过串口打印信息。
可以作为程序调试的方法。
2、液晶初始化。
液晶LCD1602初始化,并显示“开机界面”,然后再清屏。
(2)主循环
1、显示当前频率及音量信息。
调用Lcd_Display(),根据变量frequency及volume显示。
2、根据键值,执行相应程序。
如果4个按键有按下的,分别会执行:
自动搜台加减和音量加减。
4.2主要函数
(1)库函数I2C.h
该文件包括了I2C总线驱动的一些基本函数。
主要包括:
1、I2C启动函数,I2C_start();
2、I2C停止,I2C_stop();
3、写单字节,I2C_write_byte(unsignedcharindata);
4、读单字节,I2C_read_byte(unsignedcharack)。
(2)LCD1602液晶驱动
液晶LCD1602的驱动主要由:
1、测试LCD遇忙检测,BOOLlcd_bz();
2、写入指令数据到LCD,voidlcd_wcmd(BYTEcmd);
3、设定显示位置,voidlcd_pos(BYTEpos);
4、写入字符显示数据到LCD,voidlcd_wdat(BYTEdat);
5、LCD初始化设定,voidlcd_init()。
几个构成,调用时,通过下面例程,实现显示。
lcd_pos(0x00);
//设定显示位置为:
第一行第一个
for(i=0;
i<
16;
i++)
{lcd_wdat(logo1[i]);
}
(3)FM模块相关函数
FM模块与单片机通过I2C总线通信,相关函数有:
1、写数据,RDA5807_write_reg(void);
2、读数据,RDA5807_read_reg(uchar*buff);
3、自动搜台,RDA5807_FM_seek(void);
4.3主程序
/*******************************************************************************
*程序功能:
FM收音机功能,其中,T,D键为频率设置,L,R键为音量设置
*硬件连接:
1.LCD1602,P0接D0-D7,RS-P2.2,RW-P2.1,E-P2.2
2.FM模块,SDA-P3.7,SCL-P3.6
3.按键:
T-P1.3(自动搜索频率加),D-P1.2(自动搜索频率减)
L-P1.1(音量加),R-P1.0(音量减)
*******************************************************************************/
#include<
reg52.h>
stdio.h>
stdlib.h>
string.h>
intrins.h>
#include"
rda5807.h"
delay.h"
lcd1602.h"
#defineucharunsignedchar
#defineuintunsignedint
#defineGPIO_DIGP2
sbitK1=P1^3;
//K1接P1.3口,自动搜索频率加
sbitK2=P1^2;
//K2接P1.2口,自动搜索频率减
sbitK3=P1^1;
//K3接P1.2口,音量加
sbitK4=P1^0;
//K4接P1.0口,音量减
sbitled1=P1^7;
//led灯1
sbitled2=P1^6;
//led灯2
sbitvoice=P1^4;
//蜂鸣器接口
/****************数码管**********************/
charled_mod[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管显示编码
unsignedchardistab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
charled_bit[]={0x07,0x0B,0x0D,0x0E};
/*位选信号编码*/
unsignedintDisplayData[4]={0,0,0,0};
//**************************************************************
//串口初始化
voidUART_init()
{
TMOD=0x20;
//定时器1工作于8位自动重载模式,用于产生波特率
TH1=0xFD;
//波特率9600
TL1=0xFD;
SCON=0x50;
//设定串行口工作方式
PCON&
=0xef;
//波特率不倍增
TR1=1;
//启动定时器1
IE=0x0;
//禁止任何中断
TI=1;
/***********************************************/
voiddelay1ms(unsignedintms)
unsignedchark;
while(ms--)
{
for(k=0;
k<
120;
k++);
}
/*************蜂鸣器************************/
voidring()
{inti;
for(i=0;
100;
i++)
voice=0;
//蜂鸣器开
delay1ms
(1);
voice=1;
//主函数
voidmain(void)
{unsignedlongfrequency=87000;
//设置当前频率为87MHZ
unsignedintvolume=9;
//设置当前音量值为9
UART_init();
printf("
UARTtest!
\n"
);
lcd_init();
displogo();
delayms(10000);
RDA5807_power();
while
(1)
led1=1;
led2=1;
Lcd_Display(frequency,volume);
show(frequency);
if(K1==0)//自动搜索频率加
{
led1=0;
delayms(20);
if(K1==0)
ring();
while(K1==0);
RDA_reg_data[0]|=(1<
<
1);
//SEEKUP
frequency=RDA5807_FM_seek();
frequency:
%ld\n"
frequency);
if(K2==0)//自动搜索频率减
led1=0;
if(K2==0)
while(K2==0);
RDA_reg_data[0]&
=~(1<
//SEEKDOWN
if(K3==0)//音量加
{led2=0;
if(K3==0)
while(K3==0);
if((RDA_reg_data[7]&
0x0f)>
0x00)
RDA_reg_data[0]=0xd0;
RDA_reg_data[1]=0x01;
RDA_reg_data[3]&
4);
RDA_reg_data[7]--;
//音量递减
RDA5807_write_reg();
volume=RDA_reg_data[7]&
0x0f;
volume:
%d\n"
volume);
if(K4==0)//音量减
if(K4==0)
while(K4==0);
0x0f)<
0x0f)
RDA_reg_data[7]++;
//***************************************************************
5拓展功能
在本项目的基础上增加功能,参考FM收音机设计,可用数码管直接显示当前频率。
数码管显示主程序如下:
/********************************************************
数码管显示
*/
voidshow(unsignedlongf)
unsignedinti;
unsignedintj;
DisplayData[0]=f/100000;
//取百位
DisplayData[1]=(f%100000)/10000;
//取十位
DisplayData[2]=((f%100000)%10000)/1000;
//取个位
DisplayData[3]=(((f%100000)%10000)%1000)/100;
//取小数点后一位
i=0;
while(i<
4)
P3=0xFF;
/*关位选,防止显示混乱*/
if(i!
=2)
P2=led_mod[DisplayData[i]];
/*送显示编码*/
else
P2=distab[DisplayData[i]];
P3=led_bit[i];
j=600;
while(j--);
i++;
P2=0xFF;
6系统设计总结
本次课程设计经过一周时间的磕磕碰碰之后终于圆满完成了。
经过本次课设,我将模拟电子电路、单片机、C语言程序设计的知识重新学习了一遍,并运用到实际中。
可以说,这一次的课程设计让我对整个的电子电路设计过程有了一个重新的认识,并且,我学会了怎么去查阅资料,也认识到了之前所学的电路知识只有在运用实际电路中才能对它们有着更深刻的认识。
本次设计的重点是最小系统的制作和对模块程序的消化,在我的原理设计中,各个集成块的外围电路都不是特别复杂,于是整个设计的重点就落在了程序的设计上,所以单片机知识是一定要加强的,尤其是编程能力。
可以说通过本次设计又把电路方面的知识以及汇编语言重复加强了一遍,同时也接触了几种新的器件,了解了它们的用法。
在硬件连接电路和编程调试过程中不可避免地遇到各种问题,这要求保持沉着冷静,联系书本理论知识积极地思考,实在解决不了可以请教同学或指导老师。
虽然在制作过程中不可避免地遇到很多问题,而且基于个人水平,器件质量,制作工艺和条件等,有些指标不是很完美,但是最后还是在老师以及同学的帮助下还是解决了这些问题,实现了系统总调试,基本达到相关指标要求,很好地完成了本次设计任务。