版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于单片机技术的PC无线鼠标附录摘要:本文所描述的无线鼠标由放射和接收两部分组成,通过红外无线鼠标的各掌握键(左右上下移动键、左右键、向下及向上翻页键)进行红外编码,然后通过38KHz红外载波以原码和重发码得形式连续对外发送,以防止数据在传送过程中消灭错误。在接收部分通过红外接收头校正放大之后51单片机芯片解码,然后通过PDIUSBD12芯片,把掌握指令转化成计算机USB口能够接收的信号然后通过USB向计算机发送无线遥控鼠标的各个掌握功能指令,最终达到红外无线鼠标的功能。[关键词]:红外线;PDIUSBD12;单片机PDIUSBDI2的中断服务程序中断服务程序代码处理由PDIUSBD12产生的中断,它将数据从PDIUSBD12的内FIFO取回到CPU存储器,并建立正确的大事标志,以通知相应的子程序进行处理。下面为中断服务程序:if(D12GetIntPin()==0)//如果有中断发生{D12WriteCommand(READ_INTERRUPT_REGISTER);//写读中断寄存器的命令InterruptSource=D12ReadByte();//读回第一字节的中断寄存器if(InterruptSource&0x80)UsbBusSuspend();//总线挂起中断处理if(InterruptSource&0x40)UsbBusReset();//总线复位中断处理if(InterruptSource&0x01)UsbEp0Out();//端点0输出中断处理if(InterruptSource&0x02)UsbEp0In();//端点0输入中断处理if(InterruptSource&0x04)UsbEp1Out();//端点1输出中断处理if(InterruptSource&0x08)UsbEp1In();//端点1输入中断处理if(InterruptSource&0x10)UsbEp2Out();//端点2输出中断处理if(InterruptSource&0x20)UsbEp2In();//端点2输入中断处理}下面是各个子函数的程序:/********************************************************************函数功能:USB断开连接函数。入口参数:无。返回:无。备注:无.********************************************************************/voidUsbDisconnect(void){#ifdefDEBUG0Prints(”断开USB连接.\r\n”);#endifD12WriteCommand(D12_SET_MODE);//写设置模式命令D12WriteByte(0x06);//设置模式的第一字节D12WriteByte(0x47);//设置模式的其次字节DelayXms(1000);//延迟1秒}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:USB连接函数.入口参数:无。返回:无。备注:无.********************************************************************/voidUsbConnect(void){#ifdefDEBUG0Prints("连接USB.\r\n");#endifD12WriteCommand(D12_SET_MODE);//写设置模式命令D12WriteByte(0x16);//设置模式的第一字节D12WriteByte(0x47);//设置模式的其次字节}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:总线挂起中断处理函数。入口参数:无.返回:无.备注:无。********************************************************************/voidUsbBusSuspend(void){#ifdefDEBUG0Prints(”USB总线挂起。\r\n");#endif}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:总线复位中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbBusReset(void){#ifdefDEBUG0Prints("USB总线复位.\r\n”);#endifEp1InIsBusy=0;//复位后端点1输入缓冲区空闲。}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:依据pData和SendLength将数据发送到端点0的函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbEp0SendData(void){//将数据写到端点中去筹备发送//写之前要先推断一下需要发送的数据是否比端点0//最大长度大,如果超过端点大小,则一次只能发送//最大包长的数据。端点0的最大包长在DeviceDescriptor[7]if(SendLength>DeviceDescriptor[7]){//按最大包长度发送D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);//发送后剩余字节数削减最大包长SendLength—=DeviceDescriptor[7];//发送一次后指针位置要调整pSendData+=DeviceDescriptor[7];}else{if(SendLength!=0){//不够最大包长,可以直接发送D12WriteEndpointBuffer(1,SendLength,pSendData);//发送完毕后,SendLength长度变为0SendLength=0;}else//如果要发送的数据包长度为0{if(NeedZeroPacket==1)//如果需要发送0长度数据{D12WriteEndpointBuffer(1,0,pSendData);//发送0长度数据包NeedZeroPacket=0;//清需要发送0长度数据包标志}}}}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:端点0输出中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbEp0Out(void){#ifdefDEBUG0Prints("USB端点0输出中断.\r\n");#endif//读取端点0输出最后传输状态,该操作清除中断标志//并推断第5位是否为1,如果是,则说明是建立包if(D12ReadEndpointLastStatus(0)&0x20){D12ReadEndpointBuffer(0,16,Buffer);//读建立过程数据D12AcknowledgeSetup();//应答建立包D12ClearBuffer();//清缓冲区//将缓冲数据填到设备恳求的各字段中bmRequestType=Buffer[0];bRequest=Buffer[1];wValue=Buffer[2]+(((uint16)Buffer[3])〈<8);wIndex=Buffer[4]+(((uint16)Buffer[5])〈<8);wLength=Buffer[6]+(((uint16)Buffer[7])<<8);//下面的代码推断简略的恳求,并依据不同的恳求进行相关操作//如果D7位为1,则说明是输入恳求if((bmRequestType&0x80)==0x80){//依据bmRequestType的D6~5位散转,D6~5位表示恳求的类型//0为标准恳求,1为类恳求,2为厂商恳求.switch((bmRequestType>>5)&0x03){case0://标准恳求#ifdefDEBUG0Prints("USB标准输入恳求:");#endif//USB协议定义了几个标准输入恳求,我们实现这些标准恳求即可//恳求的代码在bRequest中,对不同的恳求代码进行散转//事实上,我们还需要对接收者进行散转,由于不同的恳求接收者//是不一样的。接收者在bmRequestType的D4~D0位中定义。//我们这里为了简化操作,有些就省略了对接收者的推断。//例如猎取描述符的恳求,只依据描述符的类型来区分。switch(bRequest){caseGET_CONFIGURATION://猎取配置#ifdefDEBUG0Prints("猎取配置.\r\n”);#endifbreak;caseGET_DESCRIPTOR://猎取描述符#ifdefDEBUG0Prints("猎取描述符-—");#endif//对描述符类型进行散转,对于全速设备,//标准恳求只支持发送到设备的设备、配置、字符串三种描述符switch((wValue>〉8)&0xFF){caseDEVICE_DESCRIPTOR://设备描述符#ifdefDEBUG0Prints(”设备描述符。\r\n”);#endifpSendData=DeviceDescriptor;//需要发送的数据//推断恳求的字节数是否比实际需要发送的字节数多//这里恳求的是设备描述符,因此数据长度就是//DeviceDescriptor[0]。如果恳求的比实际的长,//那么只返回实际长度的数据if(wLength>DeviceDescriptor[0]){SendLength=DeviceDescriptor[0];if(SendLength%DeviceDescriptor[7]==0)//并且刚好是整数个数据包时{NeedZeroPacket=1;//需要返回0长度的数据包}}else{SendLength=wLength;}//将数据通过EP0返回UsbEp0SendData();break;caseCONFIGURATION_DESCRIPTOR://配置描述符#ifdefDEBUG0Prints(”配置描述符.\r\n");#endifpSendData=ConfigurationDescriptor;//需要发送的数据为配置描述符//推断恳求的字节数是否比实际需要发送的字节数多//这里恳求的是配置描述符集合,因此数据长度就是//ConfigurationDescriptor[3]*256+ConfigurationDescriptor[2]。//如果恳求的比实际的长,那么只返回实际长度的数据SendLength=ConfigurationDescriptor[3];SendLength=SendLength*256+ConfigurationDescriptor[2];if(wLength>SendLength){if(SendLength%DeviceDescriptor[7]==0)//并且刚好是整数个数据包时{NeedZeroPacket=1;//需要返回0长度的数据包}}else{SendLength=wLength;}//将数据通过EP0返回UsbEp0SendData();break;caseSTRING_DESCRIPTOR://字符串描述符#ifdefDEBUG0Prints("字符串描述符");#endifswitch(wValue&0xFF)//依据wValue的低字节(索引值)散转{case0://猎取语言ID#ifdefDEBUG0Prints("(语言ID)。\r\n”);#endifpSendData=LanguageId;SendLength=LanguageId[0];break;case1://厂商字符串的索引值为1,所以这里为厂商字符串#ifdefDEBUG0Prints(”(厂商描述).\r\n");#endifpSendData=ManufacturerStringDescriptor;SendLength=ManufacturerStringDescriptor[0];break;case2://产品字符串的索引值为2,所以这里为产品字符串#ifdefDEBUG0Prints("(产品描述)。\r\n");#endifpSendData=ProductStringDescriptor;SendLength=ProductStringDescriptor[0];break;case3://产品序列号的索引值为3,所以这里为序列号#ifdefDEBUG0Prints("(产品序列号)。\r\n");#endifpSendData=SerialNumberStringDescriptor;SendLength=SerialNumberStringDescriptor[0];break;default:#ifdefDEBUG0Prints("(未知的索引值).\r\n”);#endif//对于未知索引值的恳求,返回一个0长度的包SendLength=0;NeedZeroPacket=1;break;}//推断恳求的字节数是否比实际需要发送的字节数多//如果恳求的比实际的长,那么只返回实际长度的数据if(wLength>SendLength){if(SendLength%DeviceDescriptor[7]==0)//并且刚好是整数个数据包时{NeedZeroPacket=1;//需要返回0长度的数据包}}else{SendLength=wLength;}//将数据通过EP0返回UsbEp0SendData();break;caseREPORT_DESCRIPTOR://报告描述符#ifdefDEBUG0Prints("报告描述符。\r\n");#endifpSendData=ReportDescriptor;//需要发送的数据为报告描述符SendLength=sizeof(ReportDescriptor);//需要返回的数据长度//推断恳求的字节数是否比实际需要发送的字节数多//如果恳求的比实际的长,那么只返回实际长度的数据if(wLength〉SendLength){if(SendLength%DeviceDescriptor[7]==0)//并且刚好是整数个数据包时{NeedZeroPacket=1;//需要返回0长度的数据包}}else{SendLength=wLength;}//将数据通过EP0返回UsbEp0SendData();break;default://其它描述符#ifdefDEBUG0Prints("其他描述符,描述符代码:");PrintHex((wValue〉>8)&0xFF);Prints("\r\n");#endifbreak;}break;caseGET_INTERFACE://猎取接口#ifdefDEBUG0Prints("猎取接口。\r\n”);#endifbreak;caseGET_STATUS://猎取状态#ifdefDEBUG0Prints("猎取状态。\r\n”);#endifbreak;caseSYNCH_FRAME://同步帧#ifdefDEBUG0Prints("同步帧。\r\n");#endifbreak;default://未定义的标准恳求#ifdefDEBUG0Prints(”错误:未定义的标准输入恳求。\r\n”);#endifbreak;}break;case1://类恳求#ifdefDEBUG0Prints("USB类输入恳求:\r\n");#endifbreak;case2://厂商恳求#ifdefDEBUG0Prints("USB厂商输入恳求:\r\n");#endifbreak;default://未定义的恳求。这里只显示一个报错信息。#ifdefDEBUG0Prints("错误:未定义的输入恳求。\r\n”);#endifbreak;}}//否则说明是输出恳求else//if(bmRequestType&0x80==0x80)之else{//依据bmRequestType的D6~5位散转,D6~5位表示恳求的类型//0为标准恳求,1为类恳求,2为厂商恳求。switch((bmRequestType〉>5)&0x03){case0://标准恳求#ifdefDEBUG0Prints("USB标准输出恳求:");#endif//USB协议定义了几个标准输出恳求,我们实现这些标准恳求即可//恳求的代码在bRequest中,对不同的恳求代码进行散转switch(bRequest){caseCLEAR_FEATURE://清除特性#ifdefDEBUG0Prints("清除特性。\r\n");#endifbreak;caseSET_ADDRESS://设置地址#ifdefDEBUG0Prints(”设置地址.地址为:");PrintHex(wValue&0xFF);//显示所设置的地址Prints("\r\n");#endifD12SetAddress(wValue&0xFF);//wValue中的低字节是设置的地址值//设置地址没有数据过程,直接进入到状态过程,返回一个0长度的数据包SendLength=0;NeedZeroPacket=1;//将数据通过EP0返回UsbEp0SendData();break;caseSET_CONFIGURATION://设置配置#ifdefDEBUG0Prints("设置配置.\r\n");#endif//使能非0端点。非0端点只有在设置为非0的配置后才能使能.//wValue的低字节为配置的值,如果该值为非0,才能使能非0端点.//保存当前配置值ConfigValue=wValue&0xFF;D12SetEndpointEnable(ConfigValue);//返回一个0长度的状态数据包SendLength=0;NeedZeroPacket=1;//将数据通过EP0返回UsbEp0SendData();break;caseSET_DESCRIPTOR://设置描述符#ifdefDEBUG0Prints(”设置描述符。\r\n”);#endifbreak;caseSET_FEATURE://设置特性#ifdefDEBUG0Prints("设置特性.\r\n”);#endifbreak;caseSET_INTERFACE://设置接口#ifdefDEBUG0Prints("设置接口.\r\n”);#endifbreak;default://未定义的标准恳求#ifdefDEBUG0Prints(”错误:未定义的标准输出恳求。\r\n");#endifbreak;}break;case1://类恳求#ifdefDEBUG0Prints("USB类输出恳求:”);#endifswitch(bRequest){caseSET_IDLE:#ifdefDEBUG0Prints("设置空闲。\r\n”);#endif//只需要返回一个0长度的数据包即可SendLength=0;NeedZeroPacket=1;//将数据通过EP0返回UsbEp0SendData();break;default:#ifdefDEBUG0Prints(”未知恳求。\r\n");#endifbreak;}break;case2://厂商恳求#ifdefDEBUG0Prints("USB厂商输出恳求:\r\n");#endifbreak;default://未定义的恳求。这里只显示一个报错信息。#ifdefDEBUG0Prints("错误:未定义的输出恳求.\r\n”);#endifbreak;}}}//一般数据输出else//if(D12ReadEndpointLastStatus(0)&0x20)之else{D12ReadEndpointBuffer(0,16,Buffer);D12ClearBuffer();}}////////////////////////Endoffunction///////////////////////////////********************************************************************函数功能:端点0输入中断处理函数。入口参数:无。返回:无。备注:无。********************************************************************/voidUsbEp0In(void){#ifdefDEBUG0Prints("USB端点0输入中断。\r\n”);#endif//读最后发送状态,这将清除端点0的中断标志位D12ReadEndpointLastStatus(1);//发送剩余的字节数UsbEp0SendData();}////////////////////////Endoffu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 回复样品寄送要求函(4篇范文)
- 重大订单客户确认函(7篇范文)
- 商场商户防火检查标准化手册
- 铁路运营工程师运输调度与维护保养绩效衡量表
- 食品安全事情快速处理预案
- 出版行业数字化出版流程优化研究
- 高级厨师菜品创新与优化绩效考核表
- 关于设备采购预算调整的通知4篇范本
- 智能物流分拣系统智能调度与控制手册
- 医院感染暴发报告2篇
- 血液透析患者皮肤瘙痒的护理
- 《GJB 1032A-2020 电子产品环境应力筛选方法》
- 2026年邮政银行秋招试题及答案
- T/ZSA 256-2024无负极锂金属电池及电池组
- 2026年湖北省教师职称试题(综合实践活动)(附答案)
- 论固定消防设施在扑救高层建筑火灾中的应用培训课件
- 2026新教科版科学六年级上册全套分组演示实验报告(共28个实验可用下料填写实验报告单)
- 2026中国物流行业劳动用工现状及人力资源管理优化报告
- 中小学教师小课题研究申报书模板与填写示例
- 2026年创城知识测试题及答案
- 第49讲带电粒子在组合场中的运动
评论
0/150
提交评论