QN8025和QN8027的51应用

更新时间:2024-04-22 12:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程设计

单片机在电力系统中的应用设计

题目: 具有数传功能的FM收发装置 学院: 信息与电气工程学院 专业:电气工程及其自动化 班 级:******* 姓名: *** 学 号:2006011011** 指导老师: ***

2009年7月15日

1 / 25

目录

0.-----------------------------------------------摘要 1.-----------------------------------------------引言 2.---------------------------------------------- 任务 3.-------------------------------------------报告内容 4.-----------------------------------------关键的程序 5.---------------------------------测试方法及结果分析 6.-----------------------------------------心得与体会

2 / 25

摘要

该设计可以实现无线电通信,并且能发射接收文字信息,从而实现声音和文字的同步交流。

该产品适用于家庭及工厂内部交流使用,也可在特殊场合如井下、隧道作为主要的通讯工具。该设计使用了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等周边应用。

3 / 25

二 任务

2.1 设计题目

具有数传功能的FM收发装置 2.2设计目的

能够实现两套装置之间的对讲,传输范围在100m—150m内保证语音的清晰。并具有传输文字的功能,接受者可以显示对方发送的文字信息,实现灵活的对话功能,提供给使用者类似便携式媒体播放机的视觉体验。

具体功能如下图所示:

LCD1062A液晶显示器FRE96.5MHZ VOL 6**RDS显示内容**频道加10k频道减10k声音加1声音减1按钮按钮按钮按钮QN8025接收模块单片机接收RDS

LCD1062A液晶显示器FRE96.5MHZ VOL 6**RDS显示内容**频道加10k频道减10k声音加1声音减1按钮按钮按钮按钮QN8027发射模块单片机发射RDS

4 / 25

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系统方案

调频接收机:在众多的FM接收模块中我们选择使用QN8025芯片为中心的模块。QN8025是一个高度数字化的低中频芯片,允许外部信号进行调整。 接收射频信号首先由一个低噪声放大器,然后向下转换为一个中间频率传给正交混频器。为了改善音质,抑制噪音,正交混频器可被编程在高端或低端注入。每个通道使用滤波器抑制干扰信号。

它还可以接收RDS信息,内容可以通过LCD显示。高功率32Ω负载音频输出,直接耳机驳接,无需外接音频放大。

调频发射机:与QN8025接收机模块配对的是以QN8027芯片为中心的发射模块,可以实现音频和RDS的发射。

单片机我们使用开发板,这样解决了我们编写软件时没有硬件的

5 / 25

D 1问题,并且开发板每个管脚可以用跳线引出,接线方便。 3.2 设计方案框图 硬件电路图: DA2BC键盘单元S1S2复位单元1R1P10P11P12P13VCC1KS5SW-PBR310KC2100pFRSTCS3S4 CB复位单元R12VCCC60.1uFC50.1uFB1KS5SW-PB54174192C2 -T2 OUTC2+T1 OUTR2 OUTR1 OUT时钟电源C2100pFRXDC1 -C1+T2 INT1 INR2 INR1 INMAX232ACPE(16)3110TXD11813串口发送单元U1R3C310KXTAL1RST22pFY112MhzB162738495DB9J3C4XTAL222pFAA3 6 / 25 11Date:File:SizeTitleA423 FM 接收模块J1PHONEJACK STEREOE1ANTENNAC7SDACLKVCC12345DATACLKNCNCVCCANTNCL-OUTR-OUTGND109876QN8025模块J2PHONEJACK STEREOE2ANTENNAFM 发送模块R4SDACLK12345DATACLKNCNCVCCANTNCL-INR-INGND1098763VCC4QN8027模块TitleSizeA4Date:File:3NumberLCD液晶显示单元RevisionJP1LCD1602D1-Jan-2003 Sheet of D:\\EDA\\DESIGN EXPLORER 99 SE\\EXAMPLES\\Drawn PREVIO~1By:1.DDBVSSVCCDEB0DB1DB2DB3DB4DB5DB6DB7BLABLK12345678190VORSR/W4VCCP20P21P22P00P01P02P03P04P05P06P07111213141516VCCR2POT C 7 / 25 23 主控制单元VCCC1+A1P10P11P12P131234567891011121314151617181920P10(T2)P11(T2EX)P12P13P14P15P16P17RSTP30(RXD)P31(TXD)P32(INT0)P33(INT1)P34(T0)P35(T1)P36(WR)P37(RD)XATL2XATL1VSSAT89S520.1uFVCCP00(AD0)P01(AD1)P02(AD2)P03(AD3)P04(AD4)P05(AD5)P06(AD6)P07(AD7)EA/VPPALE/PROGPSENP27(A15)P26(A14)P25(A13)P24(A12)P23(A11)P22(A10)P21(A9)P20(A8)4039383736353433323130292827262524232221P00P01P02P03P04P05P06P07RSTRXDTXDVCCCLKSDAXTAL1XTAL2P22P21P20 3.3系统LCD操作说明 LCD使用1602A,有两行显示信息,第一行显示调频频道和声音大小,第二行显示发射或接收的RDS内容。 初始化过程: 延时15ms------写指令38H------延时5ms--------写指令 8 / 25 23

38H------延时5ms-----写指令38h------忙信号检测-------写指令38h:显示模式设置--------写指令08h:显示关闭------写指令01h:显示清屏------写指令06h:显示光标移动设置-------写指令0ch:显示开及光标设置。

3.4调频接收机调频发射机键盘操作说明

K1-----声音增大1; K2-------声音减小1; K3----调频增大10k; K4------调频减小10k。

四 关键的程序

调频接收机程序:

*********************主程序***************************** #include #include #include\#include\#include\#include\#include\#define start_fre 9260

//unsigned char QN8025_read_data[0x19];//, unsigned char code table[]={\

//在接收模式下,设置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_BY

9 / 25

TE(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_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

10 / 25

//LCD_write_data(table[i]);

#include\#include\#include\#include\

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();

11 / 25

}

}

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++) {

12 / 25

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 (106.9-61.75)/0.05

写地址 int fre)//Channel index 13 / 25

=

{

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);//显示频率 }

14 / 25

向下

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()//音量调整- {

15 / 25

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);

16 / 25

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\

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)

//写数据函数

17 / 25

//写命令函数

{ 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; 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=(f00)/100; shi=(f0)/10; ge=f;

LCD_write_com(0x80);//第一行第一个字符位置开始

18 / 25

//RW为低电平 为写控制端(一直为0 即可)

//显示模式设置

//显示开关设置 (光标闪烁) //显示光标设置

//清屏

//数据指针初始化 开头部分

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\

//unsigned char qnd_i2c_timeout; //unsigned char qnd_i2c;

void Delayus(unsigned int number) {

while (number--);

19 / 25

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() {

20 / 25

//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);

21 / 25

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)

22 / 25

{ 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() {

23 / 25

unsigned char j, temp, rbyte = 0; unsigned char Data1 = 0x00; for (temp = 8;temp != 0;temp--) { }

return rbyte; }

//在接收模式下,设置RDSEN(Reg00h [3])位高,将启用RDS功能 其他程序由于版面问题不再列举

调频发射机程序:与接收部分流程类似,由于版面问题不再列举。

五 测试方法及结果分析

接收机可以实现频道的选择,声音的调节,并把这些信息反映在LCD上。通过键盘改变频道可以检测完成情况。

发射机能发出音频信号和RDS信号,通过收音机或接收机可以测试发出信息。

实验结果:

调试过程中可以接收:

青岛人民广播电台交通频道 调频89.7MHZ 青岛广播新闻频道 调频107.6 MHZ 青岛人民广播电台文艺频道 调频96.4 MHZ 青岛人民广播电台经济频道 调频FM102.9 MHZ 青岛人民广播电台交通频道 调频FM89.7 MHZ

24 / 25

SCL = 1; Delayus(4); rbyte = rbyte << 1;

rbyte = rbyte | ((unsigned char)SDA); SCL = 0;

六 心得与体会

回顾起此次单片机课程设计,我仍感慨颇多,在两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。

在公茂法老师的辛勤的指导下,以及吕常智老师的帮助下,最后我们顺利地完成了这次的课程设计.看见到课本所学知识得以应用心中满是欢喜满是激动.这次课程设计让我的实际动手能力得到了大大的锻炼让我解决实际问题的能力得到了大大的提高并对本专业的课程布满了浓厚的兴趣及对以后的学习充满了信心决定在以后的学习生活中加强练习端正心态迎接新的挑战。

25 / 25

本文来源:https://www.bwwdw.com/article/eawp.html

Top