目录
摘要 1
1 、系统方案设计思路 3
2 、方案设计与选择 4
2.1 CPU 的选择 4
2.2 锁相环的选择 4
2.3 光调制中放大器件的选择 4
2.4 显示模块的选择 4
3、系统方案详细设计 5
3.1 可见光通信装置电源模块 5
3.2 可见光通信装置发送端 5
3.2.1 信号调制电路 5
3. 3 可见光通信装置接收端 6
3.3.1 信号解调放大电路 6
4、系统软件设计 8
5、测试结果与分析 8
5.1 仪器设备 8
5.2 各模块测试 9
5.2.1 语音传输模块测试 9
5.2.2 模拟信号传输测试 9
5.2.3 LED 照明模块测试 9
5.2.4 电源模块测试 10
6、总结 10
参考文献 11
1 、系统方案设计思路
本文所设计的可见光通信装置以 MSP430F149 为控制核心,由发送端、接收端两部分组成。 使用 MSP430F149 产生 m 序列并完成对装置的温度检测、电压采集及信号传输记录等功能,
并且实时在 12864 上显示。 发送端由主控芯片组成的最小系统、前置放大电路、音频调制电路、光调制电路、白光
LED 发射灯、显示模块、24V 电源等模块组成。该部分实现了对两路语音信号和 m 序列的调制 并通过可见光发射给接收端的任务。
接收端由放大滤波电路、音频信号功率放大电路、整形电路、音频解调电路、PIIN 光电 二极管等模块组成。该部分实现了来自发送端信号的解调、放大和语音输出,以及完成来自 m 序列发生器的波形输出的任务。
总系统框图如下:
2 、方案设计与选择
2.1 CPU 的选择
方案一:采用 51 系列单片机。采用现在比较通用的 51 系列单片机作为整个系统方案的 主控 CPU。51 系列单片机应用比较广泛,各种技术都比较成熟,但此系列单片机是 8 位机, 处理速度不是很快,I/O 端口较少,资源不够充足。
方案二:采用 MSP430 系列单片机。TI 公司的 MSP430 系列单片机是一种 16 位超低功耗 的混合信号处理器,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7 种源操作数 寻址、4 种目的操作数寻址)、简洁的 27 条内核指令以及大量的模拟指令;大量的寄存器以 及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度;接口 方便开发;而且 MSP430 系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便, 满足当前低碳经济的要求。
综合以上方案,我们采用 TI 公司的 MSP430 系列单片机,选择方案二。
/********************************************************************/#include <msp430x14x.h>#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) #define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long#define KeyPort P1IN //独立键盘接在P24~P27
#define LED P2OUT //LED灯接在P5上
uchar key;//*************************************************************************
// 系统时钟初始化
//*************************************************************************void Clock_Init()
{uchar i;BCSCTL1&=~XT2OFF; //打开XT振荡器BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZdo{IFG1&=~OFIFG; //清除震荡标志for(i=0;i<100;i++)_NOP(); //延时等待}while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待IFG1&=~OFIFG; }void WDT_Init()
{WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
}//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{P1SEL = 0x00; //P2普通IO功能P1DIR = 0xF0; //P24~P27输入模式,外部电路已接上拉电阻P2SEL = 0x00; //P5口普通IO功能P2DIR = 0xFF; //P5口输出模式LED = 0xff;}//**********************************************************************
// 键盘扫描子程序,采用逐键扫描的方式
//**********************************************************************uchar Key_Scan(void)
{uchar key_check;uchar key_checkin;key_checkin=KeyPort; //读取IO口状态,判断是否有键按下key_checkin &= 0x0F; //读取IO口状态,判断是否有键按下if(key_checkin!=0x0F) //IO口值发生变化则表示有键按下{delay_ms(10); //键盘消抖,延时20MSkey_checkin =KeyPort;key_checkin &=0x0f;if(key_checkin!=0x0f){ key_check=KeyPort;switch (key_check & 0x0F){case 0x0e: key=4; break;case 0x0d: key=3; break;case 0x0b: key=2; break;case 0x07: key=1; break;}}}else{key=0xFF; }return key;} //*************************************************************************
// 主程序
//*************************************************************************void main(void)
{ WDT_Init(); //看门狗设置Clock_Init(); //系统时钟设置Port_init(); //系统初始化,设置IO口属性delay_ms(10); //延时100mswhile(1){Key_Scan(); //键盘扫描,看是否有按键按下if(key!=0xff) //如果有按键按下,则显示该按键键值1~4{ switch(key){case 4: LED=0xfe;break; //给不同的键赋键值,键值1,亮1个LED灯D1case 3: LED=0xfd;break; //给不同的键赋键值,键值2,亮1个LED灯D2case 2: LED=0xfb;break; //给不同的键赋键值,键值3,亮2个LED灯D1.D2case 1: LED=0xf7;break; //给不同的键赋键值,键值4,亮0个LED灯default: LED=0x7f;} }else{// LED=key; //没有按键的时候显示上次的键值// LED=0x00; ///}}
///*/}
}