《基于MSP430和普通PC键盘的无线聊天器》由会员分享,可在线阅读,更多相关《基于MSP430和普通PC键盘的无线聊天器(10页珍藏版)》请在金锄头文库上搜索。
1、 摘要(中英文) 本系统包含键盘模块,无线收发模块,显示模块。主控芯片采用MSP430F149,键盘采用PC标准键盘,无线使用的是XL02-232AP1半双工无线传输模块,显示选用诺基亚5110屏幕。利用两组相同的模块进行双向发射、接收、显示,实现文字聊天功能。The system includes a keyboard module, wireless transceiver module, display module. The main control chip is using MSP430F149, inputmodule is using the PC standard keybo
2、ard,wireless transmission module is using XL02-232AP1 half duplex wireless transmission module,display module is using Nokia 5110 display selection screen. Using two groups of identical modules achieve the emission, receiving, display, realizeing the function of text chat. 1. 引言单片机在产品的开发应用中经常使用的键盘为非
3、标准非编码键盘,这类键盘一般需单独设计并制作,因而周期较长,且需要专门为其编写上电复位、按键扫描、通信等程序。PC标准键盘则恰恰相反,不但价格便宜,稳定可靠,而且是编码键盘,可自动扫描键盘并通过键盘用标准5芯或6芯插口发送按键的扫描码。因此,用PC 键盘或对其加以改造而应用于单片机系统是一种很好的选择。本系统目的在于不仅解决了PC键盘与单片机匹配的问题,还增加了远距离通信功能,更适应在工程上的应用。所要解决的问题是:理解PC键盘的工作原理,接口协议,以及单片机与PC键盘的接口问题。2系统方案 1)系统整体框图PC键盘输入,1号单片机读取键盘扫描码,通过1号显示屏输出,无线发送,2号接收,并显示
4、输出。本系统的难点在于键盘的实时响应和消除按键抖动和连击的影响。键盘输人具有随机性,且实时性较强,为提高实时响应性,主机系统可以中断方式支持键符的随机输人。当主机接收到从键盘发来的信号时,即向中断系统发出键盘中断,若CPU响应该中断,则由键盘中断程序读取此扫描码,存到键盘缓冲区,由主程序调用。按键的触点在闭合和断开时均会产生抖动,这时触点的逻辑电平是不稳定的,如不妥善处理,将会引起按键命令的错误执行或重复执行。为了确保CPU 对一次按键动作只确认一次,必须对按键时的抖动进行处理。消除按键抖动常用的有硬件和软件两种方法,本文采用软件延时的方法来避开抖动阶段,在延时开始和结束时读取列扫线状态,如果
5、一致,则判断有键按下,延时时间为10ms。按键连击的处理:连击是指操作者按下某一键,但没有释放该键,则该键对应的功能将反复被执行,好象操作者在连续操作该键一样。由于单片机的运行速度较快,这种情况很容易发生。连击在很多情况下是不允许的,它使操作者很难准确地进行操作。解决连击的关键是一次按键只让它响应一次,该键不释放就不执行第二次。流程图如下。3系统硬件设计1) 选用msp430原因,功耗低 、16位数据 、单片机内模块化多选型。MSP430F149最小系统2) 无线XL02232AP1 模块XL02-232AP1 是UART 接口半双工无线传输模块,可以工作在433MHz 公用频段。 满足无线管
6、制要求,无需申请频率使用许可证。本模块专为用于各种串口设备之间的无线通讯,如电脑,单片机,各种机器设备串口等,可以直接在原来的有线连接上升级为无线链接,无需额外编程,完全兼容有线通讯串口协议,使用简单方便灵活。 3) 键盘与单盘及接口 键盘接收数据是从检测到SIO变低开始的,然后在SCK下降沿读数据的起始位,并在SCK的每个下降沿读取后续数据。键盘在接收完校验位后,如果在下一个时钟周期检测到SIO处于空闲态(高电平),便会接收新数据并开始进行处理。在此期间,键盘将把SIO置成低电平,知道接收数据完成。如果收到校验位后,键盘检测到SIO不是处于空闲态,它将继续发送时钟信号直到SIO空闲。在时钟信
7、号的下降沿,主机接收键盘数据或发送命令至键盘。SCKSIO 4系统软件设计程序流程图:主要函数:子函数包括有串口的初始化函数(中断、波特率等等)、键盘端口初始化函数、液晶屏NOKIA5110初始化函数、键盘检测函数、二进制转换为ASC码函数、接收数据中断处理函数。主函数只要是对外围设备和内部寄存器进行初始化,检测键盘按键,并进行处理,发送信息。下面贴出主函数代码:/*主函数*/void main( void ) rx=0; uchar i=0; WDTCTL = WDTPW + WDTHOLD; / Stop WDT InitUART(); LCD_init(); Init_KB(); /初始
8、化键盘端口 BCSCTL1 &= XT2OFF; / 打开XT2高频晶体振荡器 do IFG1 &= OFIFG; / 清除晶振失败标志 for (i = 0xFF; i 0; i-); / 等待8MHz晶体起振 while (IFG1 & OFIFG); / 晶振失效标志仍然存在? BCSCTL2 |= SELM_2 + SELS; / MCLK和SMCLK选择高频晶振 for(i=0;i 0x1f)&(disptmp 0x1f)&(disptmp 0x7f) else if(disptmp=0x08)/如果收到的是删除或退一格(disptmp=0x7f)| LCD_write_char2(
9、addr%84,addr/84, ); addr-=6; if(addr=0)addr=0; tx_data-tx=0; /数组中数据删除 LCD_write_char2(addr%84,addr/84,_); else if(disptmp=13)/ 发送命令 x=0;y=0; LCD_clear(); /清屏 LCD_clear(); /清屏 if(tx_data0!=0) TXBUF0 = 0xfe; while (!(IFG1 & UTXIFG0); / 等待发送完毕 Delays(); PutString(tx_data); Delays(); TXBUF0 = 0xf4; whil
10、e (!(IFG1 & UTXIFG0); / 等待发送完毕 Delays(); for(i=0;i100;i+)tx_datai=0; tx=0; /指针清零 addr=0; /显示地址清零 else LCD_write_english_string(18,3,word_2); /提示没有数据发送 for(i=0;i40;i+)Delays(); LCD_clear(); /清屏 LCD_clear(); /清屏 for(i=0;i100;i+)tx_datai=0; tx=0;/复位 flag=1; disptmp=0; / LCD_write_char2(x,y,_); /光标 LCD_write_char2(addr%84,addr/84,_); else _NOP(); flag=1; /while(write_flag) /*收到信息显示*/ flag=1; read_flag=1; recieved=1; while(read_flag=1)