基于单片机的键盘无线数据通信系统毕业设计(编辑修改稿)内容摘要:

一个串行输入、输出的移位寄存器。 在本设计 中 MAX232 与单片机的串口 通信原理图 如下所示: 上图为本设计应用的 RS232 串行通信原理图 PS/2 接口的键盘与无线发射模块的数据传送 应用技术 在本设计中 PS/2 键盘与单片机的连接方式如图 9 所示。 口接 PS/2 数据线 ;(INT0)接 PS/2 时钟线 ,即采用外部中断 0 的方式来接受 PS/2 接口键盘的传输数据。 第 14 页 共 34 页 ① 从设备到主设备的通信 当从设备向主设备发送数据时,首先检查时钟线,以确认时钟线是否为高电平。 如果是高电平,从设备就可以开始传输数据;反之,从设备要等待获得总线的控制权,才能开始传输 数据。 传输的每一帧由 11 位组成 , 发送时序及每一位的含义如图 7 所示。 图 7 从设备到主设备的通信 每一帧数据中开始位总是为 0,数据校验采用奇校验方式 , 停止位始终为 1。 从设备到主设备通信时,从设备总是在时钟线为高时改变数据线状态 , 主设备在时钟下降沿读人数据线状态。 ② 主设备到从设备的通信 主设备与从设备进行通信时,主设备首先将时钟线和数据线设置为 “ 请求发送 ” 状态,具体方式为:首先下拉时钟线至少 100us 抑制通信 ,然后下拉数据线 “ 请求发送 ” 最后释放时钟线。 在此过程中,从设备在不超过 10us 的间隔内必须 检查这个状态,当设备检测到这个状态时,它将开始产生时钟信号。 此时数据传输的每一帧由 12 位构成,其时序和每一位含义如图 8 所示。 图 8 主设备到从设备的通信 与从设备到主设备通信相比 , 其每帧数据多了一个 ACK 位。 这是从设备应答接收到字节的应答位 , 由从设备通过拉低数据线产生 , 应答位 ACK 总是为 0。 主设备到从设备通信过程中 , 主设备总是在时钟线为低电平时改变数据线的状态 , 从设备在时钟上升沿读人数据线状态。 第 15 页 共 34 页 图 9 硬件连接电路 单片机接收完数据后 便要进入 nRF24L01 的发射模块。 在本设计中 nRF24L01 选择ShockBurstTM 收发 工作 模式。 在 ShockBurstTM 发射流程中,接口引脚为 CE, CLK1, DATA,当微控制器有数据要发送时,其把 CE 置高,使 nRF24L01 工作。 当 nRF24L01 工作后,才把接收机的地址和要发送的数据按时序送入 nRF24L01,随后微控制器把 CE 置低,激发 nRF24L01 进行 ShockBurstTM 发射。 无线接收 应用技术 在 nRF24L01 工作在 ShockBurstTM 接收流程中,接口 引脚 CE、 DR CLK1 和DATA(接收通道 1),首先要配置本机地址和要接收的数据包大小。 一但进入接收状态,便把 CE 置高, 200us 后, nRF2401 进入监视状态,等待数据包的到来。 当接收到正确的数据包 (正确的地址和 CRC 校验码 ), nRF2401 自动把字头、地址和 CRC 校验位移去,nRF2401 通过把 DR1(这个引脚一般引起微控制器中断 )置高通知微控制器,之后微控制器把数据从 nRF2401 移出,所有数据移完, nRF2401 把 DR1 置低,此时,如果 CE 为高,则等待下一个数据包,如果 CE为低,开始其 它工作流程。 六 、 PCB 电路板 制作的关键技术材料 PCB 电路图 STC89S52 PS/2键盘 GND GND +5V VCC CLK DATA 3 第 16 页 共 34 页 图 基于 PS/2 接口的 无线数据传送系统 的 PCB 图 装配图 元件清单 第 17 页 共 34 页 元件标号 封装 参数 C1 104 C2 104 C3 104 C4 104 C5 104 C6 104 C7 104 C8 104 C9 104 C10 220U C11 10U C12 10U C13 C14 20 C15 20 C16 20 C17 20 C18 100U C19 100U C20 100U C21 100U D1 led LED D2 led J1 sip4 ISP J2 USB1 USB J3 DB9RA/ M DB9 JP1 IDC10 24L01 LED1 led LED R1 1K R2 1K R3 1K R4 1K R5 10K R6 22 R7 22 RP1 SIP9 10K S1 BUT1 TEST U1 SOJ28 PDIUSBD12 U2 DIP40 8051 U3 DIP16 MAX232 U4 AS1117a AMS1117 Y1 XTAL1 6M Y2 XTAL1 第 18 页 共 34 页 七 、 软件 设 计 流程图 主程序 流程图 主程序先对系统初始化, 接收机初始化后等待进入中断接收数据,转换数据传给芯片转换。 发送机初始化后,等待 PS/2 的数据信号,采集转换给射频模块,无线送出数据。 主程序流程图如 下 图所示。 图 发送机 主程序流程图 接收机主程序流程图 子程序 流程图 在有外部中断发生时,表示 PS/2 接口的键盘将向单片机发送数据,待数据发送完成后,单片机保存数据并由无线发射模块发射出去。 其程序流程图如图 12 所示。 开始 系统初始化 外部中断 N 接收数据 传给电脑 Y 开始 系统初始化 外部中断 N 发送数据 Y 第 19 页 共 34 页 图 发送端 外部中断子程序流程图 nRF24L01接收数据 数据移位完毕。 外部中断 Y 返回 送 USB转换 N 外部中断 产生键值数据 ? 数据采集完 ? nRF24L01发射数据 Y 转换 N Y 返回 N 第 20 页 共 34 页 接收端外部中断子程序流程图 发射主程序 include include include define uchar unsigned char define uint unsigned int sbit KB_CLK=P3^3。 sbit KB_DATA=P3^2。 uint n=0。 void Delay_NS(uint x) { for(。 x0。 x)。 } void delay_nms(unsigned int t) { unsigned int i,j。 for(i=0。 it。 i++) for(j=0。 j120。 j++)。 } void Send_Key(uchar dat) { uint i。 KB_CLK=0。 Delay_NS(10)。 KB_DATA=0。 KB_CLK=1。 while(KB_CLK)。 KB_DATA=0。 while(!KB_CLK)。 for(i=0。 i 8。 i++) { while(KB_CLK) _nop_()。 KB_DATA = datamp。 0x01。 if(KB_DATA) n++。 while(!KB_CLK) _nop_()。 dat=1。 } switch(n){ case 0: case 2: 第 21 页 共 34 页 case 4: case 6:KB_DATA =1。 break。 case 1: case 3: case 5: case 7:KB_DATA =0。 break。 default: break。 } while(KB_CLK) _nop_()。 while(KB_CLK) _nop_()。 KB_DATA =1。 while(!KB_CLK) _nop_()。 while(KB_CLK) _nop_()。 while(!KB_CLK) _nop_()。 } uchar Key_Scan(void) { uchar i,key_temp。 KB_CLK=1。 KB_DATA=1。 key_temp=0。 while(KB_CLK)。 for(i=0。 i8。 i++) { key_temp=1。 while(!KB_CLK)。 while(KB_CLK)。 _nop_()。 if(KB_DATA) { key_temp|=0x80。 } } while(KB_CLK)。 return key_temp。 } unsigned char key2asc(unsigned char Key) { unsigned char temp=0xff,i。 第 22 页 共 34 页 for(i=0。 i49。 i++) { if(Key==kbdasciicode[i][0]) { temp= kbdasciicode[i][1]。 break。 } } if(temp==0xff) { for(i=0。 i37。 i++) { if(Key==kbdcontrolcode[i][0]) { temp= kbdcontrolcode[i][1]。 break。 } } } if(temp==0xff) { for(i=0。 i18。 i++) { if(Key==E0startedcode[i][0]) { temp= E0startedcode[i][1]。 break。 } } } return temp。 } uchar Get_Key(void) { uchar Key_Code[3],temp=0xff。 Key_Code[0]=Key_Scan()。 Key_Code[1]=Key_Scan()。 Key_Code[2]=Key_Scan()。 temp=key2asc(Key_Code[0])。 if(temp!=0xff)nRF24L01_TxPacket(amp。 temp)。 putchar(temp)。 Delay_NS(20xx)。 return Key_Code[0]。 } void LED_Indication() 第 23 页 共 34 页 { Send_Key(0xED)。 Delay_NS(10)。 Send_Key(0x07)。 Delay_NS(10)。 } int main() { uchar Key_Code。 LED_Indication()。 UsartInt()。 Init_NRF24L01()。 for(。 ) {。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。