课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
单片机在电力系统中的应用设计
题目: 具有数传功能的FM收发装置
学院: 信息与电气工程学院
专业:电气工程及其自动化 班 级:*******
姓名: *** 学 号:2006011011**
指导老师: ***
2009年7月15日
目录
0.-----------------------------------------------摘要
1.-----------------------------------------------引言
2.---------------------------------------------- 任务
3.-------------------------------------------报告内容
4.-----------------------------------------关键的程序
5.---------------------------------测试方法及结果分析
6.-----------------------------------------心得与体会
摘要
该设计可以实现无线电通信,并且能发射接收文字信息,从而实现声音和文字的同步交流。
该产品适用于家庭及工厂内部交流使用,也可在特殊场合如井下、隧道作为主要的通讯工具。该设计使用了89S52单片机开发板和QN8025、QN8027接收和发射模块,两个LCD液晶显示屏。
接收装置可以选择接收频道,即作收音机使用。发射模块可以设定发射频道,作发射台用。当两套装置选择同一频道时可以实现声音传送接收和RDS传送接收并在LCD上显示。
关键字: FM QN8025 QN8027 RDS
一 引言
家庭中的不同成员的房间里,可以通过简单的对讲机实现方便的联系;在医院中,可以实现在病房中的人与医生护士之间的联系;也可实现工厂不同厂房作业人员的交流。具体有可应用于以下几种场合:
1. 移动DVD、TV、MP3、MP4等内置式FM全频段无线接收模组。
2. 工矿、企业、校园、小区、等公共场所立体声调频广播系统。
3. 无线音响及无线立体声耳机功能。
4. GPS导航、电视播音系统等无线调频收音。
5. 高档游戏机及无线音频电子玩具。
6. 移动电话、手机、对讲系统、移动收音装置等立体声收音。
7. PDAS及Notebook PC等周边应用。
二 任务
2.1 设计题目
具有数传功能的FM收发装置
2.2设计目的
能够实现两套装置之间的对讲,传输范围在100m—150m内保证语音的清晰。并具有传输文字的功能,接受者可以显示对方发送的文字信息,实现灵活的对话功能,提供给使用者类似便携式媒体播放机的视觉体验。
具体功能如下图所示:
2.3 具体要求
1、使用FM(76-108MHz)频段
2、噪声小、灵敏度高(2.2uV)、抗干扰能力强
3.、低电压、低功耗,宽电压使用范围(2.7-5.5VDC)。
2.4功能特点
1. 灵敏度高、噪声小、抗干扰能力强、外接元件极少、体积小
2. 76-108MHz全球FM频段兼容(包括日本76-91MHz和欧美87.5-108MHz)。
3. I2C串行数据总线接口通讯,支持外部基准时钟输入方式。
4. 完全整合的COMS工艺单晶片集成电路,功耗极小。
5. 内置高精度A/D(模数转换器)及数字频率合成器。
6. 内置LDO调整、低功耗、超宽电压使用范围(2.7-5.0VDC)。
7. 内置噪声消除、软静音、低音增强电路设计。
8. 高功率32Ω负载音频输出,直接耳机驳接,无需外接音频放大。
9. 应用简便、成本低,性价比高。
三 报告内容
3.1系统
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
调频接收机:在众多的FM接收模块中我们选择使用QN8025芯片为中心的模块。QN8025是一个高度数字化的低中频芯片,允许外部信号进行调整。 接收射频信号首先由一个低噪声放大器,然后向下转换为一个中间频率传给正交混频器。为了改善音质,抑制噪音,正交混频器可被编程在高端或低端注入。每个通道使用滤波器抑制干扰信号。
它还可以接收RDS信息,内容可以通过LCD显示。高功率32Ω负载音频输出,直接耳机驳接,无需外接音频放大。
调频发射机:与QN8025接收机模块配对的是以QN8027芯片为中心的发射模块,可以实现音频和RDS的发射。
单片机我们使用开发板,这样解决了我们编写软件时没有硬件的问题,并且开发板每个管脚可以用跳线引出,接线方便。
3.2
设计方案
关于薪酬设计方案通用技术作品设计方案停车场设计方案多媒体教室设计方案农贸市场设计方案
框图
硬件电路图:
3.3系统LCD操作
说明
关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书
LCD使用1602A,有两行显示信息,第一行显示调频频道和声音大小,第二行显示发射或接收的RDS内容。
初始化过程:
延时15ms------写指令38H------延时5ms--------写指令38H------延时5ms-----写指令38h------忙信号
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
-------写指令38h:显示模式设置--------写指令08h:显示关闭------写指令01h:显示清屏------写指令06h:显示光标移动设置-------写指令0ch:显示开及光标设置。
3.4调频接收机调频发射机键盘操作说明
K1-----声音增大1; K2-------声音减小1;
K3----调频增大10k; K4------调频减小10k。
四 关键的程序
调频接收机程序:
*********************主程序*****************************
#include
#include
#include"USART.h"
#include"I2C.h"
#include"QN8025.h"
#include"key.h"
#include"LCD1602.h"
#define start_fre 9260
//unsigned char QN8025_read_data[0x19];//,
unsigned char code table[]={"I like it!"};
//在接收模式下,设置RDSEN(Reg00h [3])位高,将启用RDS功能
void main()
{
unsigned int i,j;
unsigned char temp;
EA=1;
//USART_SET();
//USART_SEND_BYTE(0xdd);USART_SEND_BYTE(0xdd);USART_SEND_BYTE(0xdd);
//USART_SEND_BYTE()
//USART_SEND_BYTE()
QN8025_fre=start_fre;//初始频率
QN8025_sound_vol=6;
QN8025_init();
//QN8025_set_fre(9150);
LCD_Init();
for(i=0;i<10;i++)
{
//LCD_write_data(table[i]);
}
LCD_show_fre(QN8025_fre);
LCD_show_sound_vol(QN8025_sound_vol);
//while(1);
while(1)
{
temp=key_pro();
//if(temp!=0)
{
//USART_CTRL(temp);
}
}
}
*******************QN8025.h初始化***********************
#include
#include
#include"QN8025.h"
#include"I2C.h"
#include"USART.h"
#include"LCD1602.h"
unsigned int QN8025_fre;//全局频率变量
unsigned char QN8025_sound_vol;
unsigned char QN8025_read_data[0x19];//,
void delay_ms(unsigned int i) //us延时函数
{
unsigned int j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void QN8025_set_reg(unsigned char add,unsigned char vol)
{
iic_start();
iic_write8bit(0x20); //QN8025写地址
//iic_ack();//*******************************************
if(!iic_testack())
{
iic_write8bit(add);
iic_ack();
//if(!iic_testack())
{
iic_write8bit(vol);
iic_ack();
}
}
iic_stop();
}
void QN8025_read()//读25个寄存器
{
unsigned char i;
iic_start();
iic_write8bit(0x20); //QN8025写地址
if(!iic_testack())
{
iic_write8bit(0x00);
iic_ack();
}
iic_start();
iic_write8bit(0x21);
//iic_ack();
if(!iic_testack())
{
for(i=0;i<0x19;i++)
{
QN8025_read_data[i]=iic_read8bit();
iic_ack();
}
}
iic_stop();
for(i=0;i<0x19;i++)
{
USART_SEND_BYTE(QN8025_read_data[i]);
}
}
unsigned char QN8025_read_reg(unsigned char add)//不大好用
{
unsigned char temp;
iic_start();
iic_write8bit(0x20); //QN8025写地址
if(!iic_testack())
{
iic_write8bit(add);
iic_ack();
}
iic_start();
iic_write8bit(0x21);
//iic_ack();
if(!iic_testack())
{
temp=iic_read8bit();
iic_ack();
}
iic_stop();
return temp;
}
void QN8025_set_fre(unsigned int fre)//Channel index = (106.9-61.75)/0.05
{
unsigned int temp;
temp=(fre-6175)/5;
QN8025_set_reg(0x07,(temp&0xff));
QN8025_set_reg(0x0a,(temp>>=8));
}
void QN8025_fre_do(unsigned char ud)//0向上+1MHZ 1向下-1MHZ
{
if(ud==1)
{
if(QN8025_fre>8750)
{
QN8025_fre-=10;
QN8025_set_fre(QN8025_fre);
}
}
else
{
if(QN8025_fre<10800)
{
QN8025_fre+=10;
QN8025_set_fre(QN8025_fre);
}
}
LCD_show_fre(QN8025_fre);//显示频率
}
void QN8025_vol_set(unsigned char ud)//音量调整 0+ 1-
{
if(ud==1)
{
if(QN8025_sound_vol>0)
{
QN8025_sound_vol-=1;
QN8025_set_reg(0x14,QN8025_sound_vol);//音量
}
else;
}
else //if(ud==0)
{
}
//USART_SEND_BYTE(QN8025_sound_vol);
}
void QN8025_vol_up()//音量调整 +
{
if(QN8025_sound_vol<0x07)
{
QN8025_sound_vol+=1;
QN8025_set_reg(0x14,QN8025_sound_vol);//音量
LCD_show_sound_vol(QN8025_sound_vol);
}
//else;
}
void QN8025_vol_down()//音量调整-
{
if(QN8025_sound_vol>0)
{
QN8025_sound_vol-=1;
QN8025_set_reg(0x14,QN8025_sound_vol);//音量
LCD_show_sound_vol(QN8025_sound_vol);
}
//else;
}
void QN8025_init()
{
QN8025_set_reg(0x00,0x81);//
/*QN8025_set_reg(0x2f,0x90);
QN8025_set_reg(0x40,0x01);
QN8025_set_reg(0x46,0x05);
QN8025_set_reg(0x47,0xd0);
QN8025_set_reg(0x48,0xa8);*/
QN8025_set_reg(0x18,0x10);//时钟设置 不设置也行
//QN8025_set_reg(0x14,0x46);//Write 0x46 to Reg0x14 for audio unmute
QN8025_set_reg(0x14,QN8025_sound_vol);
//QN8025_set_reg(0x14,0x01);//音量
//if write 0x46 to reg0x14,QN8025 audio output normal
QN8025_set_reg(0x15,0x6c); //不设置也行
QN8025_set_reg(0x16,0xdc);
QN8025_set_reg(0x17,0x22);
QN8025_set_reg(0x00,0x51);
delay_ms(300);
QN8025_set_reg(0x00,0x01);
QN8025_set_reg(0x00,0x11);//Write 0x11 to register 0x00 to enter FM receiving mode
QN8025_set_reg(0x01,0x49);
//QN8025_set_reg(0x07,0x53);//设置频率
//QN8025_set_reg(0x0a,0x02);
QN8025_set_fre(QN8025_fre);
QN8025_set_reg(0x01,0x42);
}
**********************LCD1062.H****************************
#include
#include"LCD1602.h"
void LCD_delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void LCD_write_com(unsigned char com) //写命令函数
{
lcd_RS=0;
LCD_data_port=com;
LCD_delay(10);
lcd_E=1;
LCD_delay(10);
lcd_E=0;
}
void LCD_write_data(unsigned char Data) //写数据函数
{
lcd_RS=1;
LCD_data_port=Data;
LCD_delay(10);
lcd_E=1;
LCD_delay(10);
lcd_E=0;
}
void LCD_Init()
{
lcd_RS=1;
lcd_RW=0; //RW为低电平 为写控制端(一直为0 即可)
lcd_E=0;
LCD_write_com(0x38); //显示模式设置
LCD_write_com(0x0c); //显示开关设置 (光标闪烁)
LCD_write_com(0x06); //显示光标设置
LCD_write_com(0x01); //清屏
LCD_write_com(0x80); //数据指针初始化 开头部分
}
void LCD_show_fre(unsigned int f)//显示频率
{
unsigned int qian,bai,shi,ge;
f=(f/10);
qian=f/1000;
bai=(f%1000)/100;
shi=(f%100)/10;
ge=f%10;
LCD_write_com(0x80);//第一行第一个字符位置开始
LCD_write_data('F');
LCD_write_data('M');
LCD_write_data(qian+48);
LCD_write_data(bai+48);
LCD_write_data(shi+48);
LCD_write_data('.');
LCD_write_data(ge+48);
LCD_write_data('M');
LCD_write_data('H');
LCD_write_data('z');
}
void LCD_show_sound_vol(unsigned char m)
{
LCD_write_com(0x80+11);//第一行第一个字符位置开始
LCD_write_data('V');
LCD_write_data('O');
LCD_write_data('L');
LCD_write_data(':');
LCD_write_data(m+48);
}
**********************I2C.c***************************
#include
#include
#include"I2C.h"
//unsigned char qnd_i2c_timeout;
//unsigned char qnd_i2c;
void Delayus(unsigned int number)
{
while (number--);
number = 10;
while (number--);
}
void DelayMs(unsigned int number)
{
unsigned char temp;
for (;number != 0;number--)
{
for (temp = 112;temp != 0;temp--);
{}}
}
void iic_start()
{
Delayus(4);
SCL = 1;
Delayus(4);
SDA = 1;
Delayus(4);
SDA = 0;
Delayus(4);
SCL = 0;
Delayus(4);
}
void iic_stop()
{
//SCL=0;
Delayus(4);
SDA = 0;
Delayus(4);
SCL = 1;
Delayus(4);
SDA = 1;
Delayus(2);
}
void iic_ack()
{
SDA = 0;
Delayus(4);
SCL = 1;
Delayus(4);
SCL = 0;
Delayus(4);
SDA = 1;
Delayus(4);
}
void iic_NoAck()
{
SDA = 1;
Delayus(4);
SCL = 1;
Delayus(4);
SCL = 0;
Delayus(4);
SDA = 0;
}
void iic_send_ask()
{
SDA = 0;
Delayus(4);
SCL = 1;
Delayus(4);
SCL = 0;
Delayus(4);
SDA = 1;
}
bit iic_testack()
{
bit ErrorBit;
SDA = 1;
Delayus(4);
SCL = 1;
Delayus(4);
ErrorBit = SDA;
Delayus(4);
SCL = 0;
return ErrorBit;
}
void Set_SDA(unsigned char i)
{
if (i)
{
SDA = 1;
}
else
{
SDA = 0;
}
}
void iic_write8bit(unsigned char input)
{
unsigned char temp, i;
for (temp = 8;temp != 0;temp--)
{
SDA = (bit)(input & 0x80);
Delayus(4);
SCL = 1;
Delayus(4);
SCL = 0;
Delayus(4);
input = input << 1;
}
}
unsigned char iic_read8bit()
{
unsigned char j, temp, rbyte = 0;
unsigned char Data1 = 0x00;
for (temp = 8;temp != 0;temp--)
{
SCL = 1;
Delayus(4);
rbyte = rbyte << 1;
rbyte = rbyte | ((unsigned char)SDA);
SCL = 0;
}
return rbyte;
}
//在接收模式下,设置RDSEN(Reg00h [3])位高,将启用RDS功能
其他程序由于版面问题不再列举
调频发射机程序:与接收部分流程类似,由于版面问题不再列举。
五 测试方法及结果分析
接收机可以实现频道的选择,声音的调节,并把这些信息反映在LCD上。通过键盘改变频道可以检测完成情况。
发射机能发出音频信号和RDS信号,通过收音机或接收机可以测试发出信息。
实验结果:
调试过程中可以接收:
青岛人民广播电台交通频道 调频89.7MHZ
青岛广播新闻频道 调频107.6 MHZ
青岛人民广播电台文艺频道 调频96.4 MHZ
青岛人民广播电台经济频道 调频FM102.9 MHZ
青岛人民广播电台交通频道 调频FM89.7 MHZ
六 心得与体会
回顾起此次单片机课程设计,我仍感慨颇多,在两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。
在公茂法老师的辛勤的指导下,以及吕常智老师的帮助下,最后我们顺利地完成了这次的课程设计.看见到课本所学知识得以应用心中满是欢喜满是激动.这次课程设计让我的实际动手能力得到了大大的锻炼让我解决实际问题的能力得到了大大的提高并对本专业的课程布满了浓厚的兴趣及对以后的学习充满了信心决定在以后的学习生活中加强练习端正心态迎接新的挑战。