目录
摘要 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)) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/.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为8MHZ do{ 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); //键盘消抖,延时20MS key_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); //延时100ms while(1) { Key_Scan(); //键盘扫描,看是否有按键按下 if(key!=0xff) //如果有按键按下,则显示该按键键值1~4 { switch(key) { case 4: LED=0xfe;break; //给不同的键赋键值,键值1,亮1个LED灯D1 case 3: LED=0xfd;break; //给不同的键赋键值,键值2,亮1个LED灯D2 case 2: LED=0xfb;break; //给不同的键赋键值,键值3,亮2个LED灯D1.D2 case 1: LED=0xf7;break; //给不同的键赋键值,键值4,亮0个LED灯 default: LED=0x7f; } } else { // LED=key; //没有按键的时候显示上次的键值 // LED=0x00; ///} } ///*/ } }
讯享网








版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127577.html