20##年全国大学生电子设计竞赛
【本科组】
F题:红外光通信装置
参赛学校:北京联合大学
参赛学生:张鹏鹏、吴凯亮、陈泳宇
参赛时间:9月4日~9月7日
赛前指导教师:钮文良 路铭 陈景霞
目录
摘 要........................................................................................................................ 2
1.系统方案设计.............................................................................................................. 3
1.1 控制模块的论证与设计.................................................................................... 3
1.2发送模块论证与设计.......................................................................................... 4
1.3中继模块论证与设计.......................................................................................... 4
1.3接收模块论证与设计.......................................................................................... 4
1.4 显示模块的论证与选择...................................................................................... 4
2.系统理论分析与计算.................................................................................................... 4
3.电路与程序设计........................................................................................................... 5
3.1电路的设计........................................................................................................ 5
3.1.1系统总体框图........................................................................................... 5
3.1.2 单片机最小系统及发送模块电路电路....................................................... 6
3.1.4 中继模块电路图..................................................................................... 7
3.1.5 接收模块................................................................................................. 8
3.2程序的设计........................................................................................................ 8
3.2.1程序功能描述与设计思路......................................................................... 8
4.测试方案与测试结果.................................................................................................... 9
4.1测试方案............................................................................................................ 9
4.2 测试条件与仪器................................................................................................ 9
4.3 测试结果及分析................................................................................................ 9
4.3.1测试结果及分析....................................................................................... 9
5 结束语.................................................................................................................... 10
附录:主要程序代码................................................................................................... 10
摘 要
语音和音乐等低频电信号一般不适合直接远距离传输,而是通过调制加载到光或者高频信号上传输出去。本设计的内容,就是设计一个合适的红外收发电路,实现多种信号的传输。红外通信系统的设计是光通信系统的一个重要分支,采用红外通信系统的设计方法来进行和目前世界上所采用的骨干通信网的光纤通信系统是有相同之处的,唯一重要的差别就是它们二者所采用的传输媒质不用,一个是大气,一个则是光纤。
本题红外通信装置是用单片机采用C8051F410的AD模块进行对语音和温度的信号采样,把所要采集的外部信号,把数字信号采用CVSD编码方式进行编码,将编码后的信号经过FSK方式进行调制,输送到红外模块发送出去,经过中继节对信号重新进行还原发送。单片机采用C8051F410的DA模块进行对语音和温度的信号还原,语音和温度信号经过解码后输出,对于语音信号解码并还原后经功放电路输出到耳机,对于温度信号则通过LCD1602屏显示,整个设计采用模块化设计,提高了设计效率,基本完成了题目要求。
关键字: C8051F410 CVSD编码 A/D和 D/A模块 LCD1602
Abstract
Speech and music signals are generally not suitable for low frequency directlong-distance transmission, but through the modulation is loaded into the light or high frequency signal output to upload. The design of the content, is to design a suitable infrared transceiver circuit, realize the transmission of multiple signals. Design of infrared communication system is an important branch of optical communication system, the design method of infrared communication system to carry out and backbone communication network using the world's optical fiber communication system is similar, the only difference is an important transmission medium, they used two no, one is the atmosphere, one is the optical fiber.
本题红外通信装置是用单片机采用C8051F410的AD模块进行对语音和温度的信号采样,把所要采集的外部信号,把数字信号采用CVSD编码方式进行编码,将编码后的信号经过FSK方式进行调制,输送到红外模块发送出去,经过中继节对信号重新进行还原发送。单片机采用C8051F410的DA模块进行对语音和温度的信号还原,语音和温度信号经过解码后输出,对于语音信号解码并还原后经功放电路输出到耳机,对于温度信号则通过LCD1602屏显示,整个设计采用模块化设计,提高了设计效率,基本完成了题目要求。
The infrared communication device is used to signal to the voice and the temperature of the sample by using single-chip AD module of C8051F410, the external signal to collect, the digital signal is encoded using CVSD, the encoded signal through FSK modulation, transmission to send out red outside the module, after the signal to relay node reducing transmission. Using single-chip DA module of C8051F410 signal for speech and temperature reduction, voice and temperature signals after decoding output, for voice signal decoding and restored after power amplifier circuit to the earphone, the temperature signal through the LCD1602 screen display, the design uses the modular design, improve the design efficiency, the basic completion of the requirements of title.
清空内容
Keywords: C8051F410 CVSD encode A/D and D/A module LCD1602
1.系统方案设计
本系统主要由控制模块(A/D模块、A/D模块等)、语音采集模块、发送模块、中继模块、接收模块等组成,下面分别论证这几个模块的选择。
1.1 控制模块的论证与设计
方案一:AT89C51是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,片内含4Kbytes的可反复擦写的只读程序(EEPROM)和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度,非易失性存储技术生产兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU),功能强大,可灵活应用于各种控制领域,需外接A/D模块与A/D模块,工作频率为12MHz。
方案二:C8051F410内部包含有1个12位的A/D模块,还有片内含32/16Kbytes的可编程的Flash Memery和2304bytes的随机存取数据存储器(RAM),开发环境为silicon laboratories,指令执行速度为50 MIPS,工作频率为50MH。
比较以上两种方案,选择方案二。
1.2发送模块论证与设计
发送模块中,由于电路中采用了FSK调制方式,载波选择为150KHz和200KHz,并且采用了红外光发射方式,对于发送模块的功率应至少满足2米的传输距离,因此应选择功率较大的红外发射管。
1.3中继模块论证与设计
中继模块的设计可以有两种方案,一是进行普通的放大再发射,但是这样做的结果会导致噪声较大,因此我们采用还原并且重新发送的方式来进行设计。
1.3接收模块论证与设计
接收模块我们采用了LM567CN-D芯片,因为载波中包含有两种频率,所以进行解调是采用这种芯片的频率敏感特性,分别将两路信号进行解调,再合并为一路信号。
1.4 显示模块的论证与选择
显示电路采用液晶显示模块,模块体积小,功耗低,操作方便。使用液晶显示模块,可以对模式选择为写入命令,从而调节LCD的工作模式,分时进行命令和数据写入。
2.系统理论分析与计算
我们采用C8051F410芯片内部AD转换器,对于单极性信号,我们直接对信号进行放大,然后送到内部12位的AD转换器进行转换。AD转换器只能进行0~3.3V模拟信号转换,参考电平为1.5V。
根据采样定理,语音的频率最高在4000HHz,在保持信号不失真的前提下,采集的频率至少为所采集信号的2倍。所采集的方波信号频率至少为10kHz, C8051F410芯片内部AD转换器为12位,所采集的正弦波信号频率范围为16KHz,在保证不失真的前提下,每个周期应尽可能多的采样点,保证了转换精度。
3.电路与程序设计
3.1电路的设计
3.1.1系统总体框图
经过以上方案的比较和论证,最终确定的系统组成框图如下图1所示。
图1 系统总体框图
3.1.2 单片机最小系统及发送模块电路电路
图2 单片机最小系统和发送模块电路
如图2所示,本题采用的是单片机C8051F410, C8051F410内部包含有1个12位的A/D模块,还有片内含32/16Kbytes的可编程的Flash Memery和2304bytes的随机存取数据存储器(RAM),开发环境为silicon laboratories,指令执行速度为50 MIPS,工作频率为50MH。
3.1.4 中继模块电路图
图4 中继模块
3.1.5 接收模块
图5 接收模块电路
3.2程序的设计
3.2.1程序功能描述与设计思路
1、程序功能描述
根据题目要求发送模块软件部分主要实现CVSK编码、产生两路载波150KHz和200KHz、读取采集的温度信号,接收模块主要进行CVSK解码,温度显示功能。
4.测试方案与测试结果
4.1测试方案
1、硬件测试
使用数字万用表,对所连接的电路进行测试,测试各节点的连通性,各个引脚间是否有短路,断路,结点连接是否有错误。
2、硬件软件联调
使用silicon laboratories 编程软件进行编程,通过silicon laboratories软件下载到8051F410芯片中,进行硬件软件联调,实现CVSK编码、产生两路载波150KHz和200KHz、读取采集的温度信号等功能。对各个参数进行合理设置,以达到题目要求。
4.2 测试条件与仪器
1、测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。
2、调试与测试所用仪器:
信号发生器TFG1010 DDS;
数字示波器RIGOL DS1102D;
数字万用表VC8045-2。
4.3 测试结果及分析
4.3.1测试结果及分析
该电路设计制作成功后,经测试,能够接收简单的语音信号,能够将环境中的温度进行正确采集并进行显示。但是该电路中对语音信号的处理功能较差,初步分析是滤波功能较差,设计一个七阶的巴特沃斯电路将会改进电路对语音信号的处理能力。
5 结束语
经过为期四天的设计,感触颇深的是解决问题的方法、技巧。在这四天中,我们遇到许许多多问题,对待问题要多方法处理,多角度思考。通过这几天的设计竞赛,我们不但增强了实践能力和协作精神,而且懂得了联系实际的重要性,这对我们以后的学习和工作不无裨益。当然,我们的设计还存在着一些缺陷,有待于在将来设计中进一步提高,在此恳请各位老师批评指正。
参考文献
【1】 全国大学生电子设计竞赛组委会 编《全国大学生电子设计竞赛获奖作品汇编》北京理工大学出版社
【2】吴少军、刘光斌 编著《单片机实用低功耗设计》 人民邮电出版社
【3】周航慈 编著 《单片机应用程序设计》 北京航空航天大学出版社
【4】唐胜安、刘晔 编著《电路与电子学基础》 高等教育出版社
【5】胡宴如、耿苏燕 编著《模拟电子技术》 高等教育出版社
附录:主要程序代码
1、初始化程序代码
#include <C8051F410.h>
#include "User_GlobalVars.h"
#include "User_GlobalFunctions.h"
//-----------------------------------------------------------------------------
// External Oscillator Crystal Frequency Selection
//-----------------------------------------------------------------------------
//
// Please initialize the following constant to the crystal frequency
//
#define CRYSTAL_FREQUENCY 12000000 // Crystal Frequency in Hz
#define SYSCLK (48000000)
#define BAUDRATE 3500 // Baud rate of UART in bps
// XFCN Setting Macro
#if (CRYSTAL_FREQUENCY <= 20000)
#define XFCN 0
#elif(CRYSTAL_FREQUENCY <= 58000)
#define XFCN 1
#elif(CRYSTAL_FREQUENCY <= 155000)
#define XFCN 2
#elif(CRYSTAL_FREQUENCY <= 415000)
#define XFCN 3
#elif(CRYSTAL_FREQUENCY <= 1100000)
#define XFCN 4
#elif(CRYSTAL_FREQUENCY <= 3100000)
#define XFCN 5
#elif(CRYSTAL_FREQUENCY <= 8200000)
#define XFCN 6
#elif(CRYSTAL_FREQUENCY <= 25000000)
#define XFCN 7
#else
#error "Crystal Frequency must be less than 25MHz"
#endif
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function initializes the system clock to use the external oscillator
// in crystal mode.
//
//-----------------------------------------------------------------------------
void OSCILLATOR_Init (void)
{
int i; // delay counter
OSCXCN = (0x60 | XFCN); // start external oscillator with
// the appropriate XFCN setting
// based on crystal frequency
for (i=0; i < 256; i++); // Wait for crystal osc. to start
while (!(OSCXCN & 0x80)); // Wait for crystal osc. to settle
RSTSRC = 0x06; // Enable missing clock detector and
// VDD Monitor reset
CLKSEL = 0x01; // Select external oscillator as system
// clock source. /SYSCLK on the port
// pin is equal to the system clock.
OSCICN = 0x00; // Disable the internal oscillator.
}
//时钟倍频 12~48MHZ
void CLKMUL_Init (void)
{
char i;
CLKMUL = 0x00; // Reset the Multiplier by writing 0x00
// to register CLKMUL.
CLKMUL |= 0x01;
CLKMUL |= 0x00;
CLKMUL |= 0x80; // Enable the Multiplier with the MULEN
// bit (CLKMUL | = 0x80).
for (i = 250; i > 0; i--);
CLKMUL |= 0xC0; // Initialize the Multiplier with the
// MULINIT bit (CLKMUL | = 0xC0).
while ((CLKMUL & 0x20) != 0x20); // Poll for MULRDY => ??
CLKSEL = 0x02; //选择时钟乘法器输出时钟 48M
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// This function configures the crossbar and ports pins.
//
// The oscillator pins should be configured as analog inputs when using the
// external oscillator in crystal mode.
//
// P0.0 digital push-pull /SYSCLK
// P1.0 analog don't care XTAL1
// P1.1 analog don't care XTAL2
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
// Oscillator Pins
P1MDIN &= ~0x03; // P1.0, P1.1 are analog
P1SKIP |= 0x03; // P1.0, P1.1 skipped in the Crossbar
P1 |= 0x03; // P1.0, P1.1 port latches set to '1'
P0MDOUT |= 0x10; // P0.4 P0.5 UART
P0MDOUT |= 0x06; // Set CEX0 (P0.1,P0.2) to push-pull PWM
P0MDIN &= ~0x01; // Configure P0.0 to analog DAC
P0SKIP |= 0x01; //跳过DAC0
P1MDIN |= 0x80; //18B20
P2MDOUT |= 0xFF; //LCD1602 DATA
P2MDIN |= 0xFF;
P0MDOUT |= 0xC8; //LCD1602
P0MDIN |= 0xC8;
P1MDIN &= 0xEF; // set P1.4 as an analog input ADC
P1SKIP |= 0x10; // skip P1.4 pin
// Crossbar Initialization
XBR0 = 0x01; // Route /SYSCLK to first available pin
XBR1 = 0x42; // Enable Crossbar and CEX0、CEX1
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x90; // SCON0: 9-bit variable bit rate
// level of STOP bit is ignored
// RX enabled
// ninth bits are zeros
// clear RI0 and TI0 bits
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x08; // T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else if (SYSCLK/BAUDRATE/2/256 < 48) {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
} else {
while (1); // Error. Unsupported baud rate
}
TL1 = TH1; // init Timer1
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;
TR1 = 1; // START Timer1
TI0 = 1; // Indicate TX0 ready
IP |= 0x10; // Make UART high priority
TI0=0;
RI0=0;
ES0 = 1; // Enable UART0 interrupts
}
//-----------------------------------------------------------------------------
void PWM_Init(void)
{
// Configure PCA time base; overflow interrupt disabled
PCA0CN = 0x00; // Stop counter; clear all flags
PCA0MD = 0x02; // Use SYSCLK/4 as time base
PCA0CPM0 = 0x46; // Module 0 = Frequency Output mode
PCA0CPH0 = 30; //200K
PCA0CPM1 = 0x46; // Module 0 = Frequency Output mode
PCA0CPH1 = 40; //150K
// Start PCA counter
CR = 1;
}
//-----------------------------------------------------------------------------
// DAC0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure DAC0 to update on Timer3 overflows and enable VDD as VREF
//
//-----------------------------------------------------------------------------
void DAC0_Init(void)
{
REF0CN = 0x0E; // Enable VDD as VREF
IDA0CN = 0xF7; //写IDA0H触发DAC输出更新,DAC0使能,右对齐,20mA电流
}
//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configures ADC0 to make single-ended analog measurements on pin P1.4
//
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
ADC0CN = 0x03; // ADC0 disabled, normal tracking,
// conversion triggered on TMR2 overflow
//REF0CN = 0x13; // Enable on-chip VREF = 2.2v and buffer
ADC0MX = 0x0C; // Set P1.4 as positive input
ADC0CF = ((SYSCLK/3000000)-1)<<3; // set SAR clock to 3MHz
ADC0CF |= 0x00; // right-justify results
EIE1 |= 0x08; // enable ADC0 conversion complete int.
AD0EN = 1; // enable ADC0
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters : None
//
// Configure Timer2 to 16-bit auto-reload and generate an interrupt at 100uS
// intervals. Timer 2 overflow automatically triggers ADC0 conversion.
//
//-----------------------------------------------------------------------------
void Timer2_Init (void)
{
TMR2CN = 0x00; // Stop Timer2; Clear TF2;
// use SYSCLK as timebase, 16-bit
// auto-reload
CKCON |= 0x30; // select SYSCLK for timer 2 source
TMR2RL = - (SYSCLK / 2400); // init reload value for 2K
TMR2 = 0xffff; // set to reload immediately
TR2 = 1; // start Timer2
}
void Timer0_Init(void)
{
TH0 = 0; // Init Timer0 High register
TL0 = 0 ; // Init Timer0 Low register
CKCON |= 0x04; // 使用系统时钟
TMOD &= ~0x0f; // Timer0 in 16-bit mode
TMOD |= 0x01;
TR0 = 1; // START Timer0
ET0 = 1; // Timer0 interrupt enabled
}
2、发送主程序代码
#include <C8051F410.h>
#include <math.h>
#include "User_GlobalVars.h"
#include "User_GlobalFunctions.h"
void main(void)
{
int count;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
PORT_Init();
OSCILLATOR_Init();
CLKMUL_Init();
PWM_Init(); //发送端需要
DAC0_Init(); //接收端需要
Timer0_Init(); //发送端需要
Timer2_Init(); //发送端需要
ADC0_Init(); //发送端需要
UART0_Init();
Set_DAC0(0);
CVSD_EncoderInit();
CVSD_DecoderInit();
EA=1;
while(1)
{
ReadTemp();
}
}
3、接收端主程序代码
#include <C8051F410.h>
#include <math.h>
#include "User_GlobalVars.h"
#include "User_GlobalFunctions.h"
void main(void)
{
int count;
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
PORT_Init();
OSCILLATOR_Init();
CLKMUL_Init();
//PWM_Init(); //发送端需要
DAC0_Init(); //接收端需要
//Timer0_Init(); //发送端需要
Timer2_Init(); //发送端需要
//ADC0_Init(); //发送端需要
UART0_Init();
Set_DAC0(0);
CVSD_EncoderInit();
CVSD_DecoderInit();
EA=1;
LCD_init();
Lcd1602WriteStr(0x81,"IrDataControl");
Lcd1602WriteStr(0x40,"TEMP:");
while(1)
{
//ReadTemp();
if(GetTempFlag)
{
LcdDisTemp();
GetTempFlag=0;
}
}
}