寻线式电脑鼠设计_第1页
寻线式电脑鼠设计_第2页
寻线式电脑鼠设计_第3页
寻线式电脑鼠设计_第4页
寻线式电脑鼠设计_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、 任务和总体设计1、 任务要求要求设计一个寻线型电脑鼠,能够在88的迷宫中搜索路径并且根据所搜寻的路线走出最短路径。其中迷宫由25cm的黑线组成。电脑鼠第一次进入迷宫和返回迷宫时,可以循着黑线走到终点并记录迷宫信息,第二次进入迷宫时,根据第一次所记录的迷宫信息选择最短路径冲刺到终点。2、 总体设计硬件部分主要由传感器,单片机,电机所组成。传感器采用红外传感器,由发射管和接收管组成,可以探测迷宫中黑线。单片机采用STC15W413AS芯片,用于编写程序。电机由单片机产生的PWM以及L9110芯片进行驱动。软件部分主要由产生占空比函数,电脑鼠在迷宫中搜寻路径法则,记录迷宫信息,测速盘计数组成。

2、电脑鼠搜寻迷宫时按照左手法则进行搜寻,根据测速盘的计数得到迷宫坐标,用88的数组对迷宫信息进行储存。第一次搜寻时,对死路和走得通的路进行标定,第二次走时,仍然按照左手法则进行,但不走第一次标定的死路。由此达到在迷宫中走最短路径的目的。二、 硬件设计1、 设计步骤设计原理图后生成PCB板后进行布线。根据PCB板将元件焊上。将轮子,轴,轴承以及电机,齿轮进行组装,调整传感器角度。测试电路。2、主控模块包括STC15W413AS芯片以及连接电脑的下载部分。 原理图: STC15W413AS芯片中包括中央处理器(CPU)、程序存储(Flash)、数据存储器(SRAM)、定时器/计数器、掉电唤醒专用计时

3、器、I/O口、高速A/D转换(30万次/秒)、比较器、看门狗、高速异步串行通信端UART、CCP/PWM/PCA、高速同步串行端口SPI、片内高精度R/C时钟以及高可靠复位等模块。单片机内部结构: 管脚图: 3、电机驱动模块 主要运用L9110芯片和两个74HC00芯片进行电机驱动。 原理图: (1)L9110:L9110 是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片IC 之中,使外围器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过80

4、0mA 的持续电流,峰值电流能力可达1.5A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。应用电路:管脚图: (2)74HC00: 该芯片是输入端四与非门。 4、测速模块 运用测速盘和两个侧向发射接收管。 原理图: 实物图: 5、传感器模块 运用五个LED红外发射管和LM339和LM393芯片。 原理图: 实物图:(1)LM339LM393是四电压比较器集成电路。该电路的特点如下:工作电源电压范围宽,单电源、双电源均可工作,单电源: 236V,双电源:118V;消耗电流小, Icc=1.3mA;输

5、入失调电压小, VIO=2mV;共模输入电压范围宽, Vic=0Vcc-1.5V;输出与TTL,DTL,MOS,CMOS 等兼容;输出可以用开路集电极连接“或”门;采用双列直插14 脚塑料封装(DIP14)和微形的双列14 脚塑料(SOP14)内部结构:(2)LM393 与LM339类似。内部结构:6、元件清单元件名称数量元件名称数量L9110100uF电容0.1uF电容104电容1N914Header5IR_LED红外发射Header2LED红色发光管ST256Header 2HLCD511020K电阻10K电阻2K电阻2316115172215610360R1K电阻5.1K电阻300R51

6、0R2K电位器SW-PBSTC15W413ASTL413BSGPT324BLLM339LM39374HC00干电池盒72111121151122三、 软件设计 程序总流程图:中断返回中断YYYYN结束N结束N结束N结束路口检测路程控制行走控制红外检测,读取传感器的值迷宫检测子程序路径优化子程序冲刺子程序结束是否冲刺到终点?是否检测到终点?是否回到起点?MCU各状态字初始化是否等待出发?开始软件部分主要是由以下三个部分组成。(1)、电机驱动部分PWM产生函数驱动电机,通过调节占空比进行调速,通过控制四个I/O口来控制电机的正反转以及停转。根据芯片以及PCB板控制单片机的CCP_S0,CCP_S1

7、为0X20和0X10。电脑鼠转弯和直走时用不同速度进行控制。同时在转弯和直线时,采用不同的占空比调速,使得电脑鼠在行走过程中速度能在快的同时达到稳定的效果。/-PWM初始化函数-/void PWM_Init() ACC = P_SW1;ACC &= (CCP_S0|CCP_S1);ACC |= CCP_S0;P_SW1 = ACC; CCON = 0;CL = 0;CH = 0;CMOD = 0x02;CR=1;/-调整速度函数-/void speed(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H =

8、CCAP0L =46; CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =51; CCAPM1 = 0x42;(2)、中断产生部分 中断用于测速盘测速,用两个中断源进行控制,分别用于左轮计数和右轮计数。根据测速盘转过的圈数,中断计数的数字判断电脑鼠是否走过一格,根据走过的格子进行坐标的加减。/-外部中断初始化函数-/void Exti_InterruptInit()/-INT0-/ IT0=1; EX0=1;/-INT1-/ IT1=1; EX1=1; EA=1; /所有中断开放/-外部中断0 左轮计数器-/void Exit0_LeftWheel(

9、) interrupt 0 EX0=0; if(left_count8;/-PWM寄存器定义-/sfr P_SW1 = 0xA2;sfr CCON = 0xD8;sbit CCF0 = CCON0;sbit CCF1 = CCON1;sbit CR = CCON6;sbit CF = CCON7;sfr CMOD = 0xD9;sfr CL = 0xE9;sfr CH = 0xF9;sfr CCAPM0 = 0xDA;sfr CCAP0L = 0xEA;sfr CCAP0H = 0XFA;sfr CCAPM1 = 0xDB;sfr CCAP1L = 0xEB;sfr CCAP1H = 0xFB

10、;sfr CCAPM2 = 0xDC;sfr CCAP2L = 0xEC;sfr CCAP2H = 0xFC;sfr PCA_PWM0 = 0xf2;sfr PCA_PWM1 = 0xf3;sfr PCA_PWM2 = 0xf4;/-PWM初始化函数-/void PWM_Init() ACC = P_SW1;ACC &= (CCP_S0|CCP_S1);ACC |= CCP_S0;P_SW1 = ACC; /CCP_S0,CCP_S10,1P3.5.CCP0_2,P3.6.CCP1_2,P3.7.CCP2_2 /其余I/O口详见芯片手册CCON = 0;CL = 0;CH = 0;CMOD =

11、 0x02;CR=1;/-调整函数-f_pwm=PCA_clk/256-/void speed(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =46; /修改此处数值0255可以调节CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =51; /修改此处数值0255可以调节CCP2_1占空比zuoCCAPM1 = 0x42;void speed2(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I

12、4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =60; /修改此处数值0255可以调节CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 = 0X00;CCAP1H = CCAP1L =65; /修改此处数值0255可以调节CCP2_1占空比CCAPM1 = 0x42; void speed3(bit a,bit b,bit c,bit d) I1=a;I2=b;I3=c;I4=d; PCA_PWM0 = 0X00;CCAP0H = CCAP0L =255; /修改此处数值0255可以调节CCP2_0占空比CCAPM0 = 0x42;PCA_PWM1 =

13、 0X00;CCAP1H = CCAP1L =255; /修改此处数值0255可以调节CCP2_1占空比CCAPM1 = 0x42; /-PWM模式使能函数-/void PWM_Cmd(bit cmd) if(cmd=ENABLE) CR=1; else if(cmd=DISABLE) CR=0;/-延时函数-/void Delay(u16 count) u16 i; for(i=0;icount;i+);/-外部中断初始化函数-/void Exti_InterruptInit()/-INT0-/ IT0=1; EX0=1;/-INT1-/ IT1=1; EX1=1; EA=1; /所有中断开

14、放 void adjust2() if(Left_Front_Detector=0) speed(1,0,0,1); else if(Right_Front_Detector=0) speed(0,1,1,0); else speed(0,1,0,1);void Go() speed(0,1,0,1);/-小车右转函数-/void TurnRight()/ u8 flg=1; speed2(0,1,1,0); /左轮前转,右轮后转/ left_count=right_count=0; /* while(flg=1) if(left_count=12|right_count=12) speed(

15、0,0,0,0); /两轮停转 left_count=0; right_count=0; flg=0; for(flg=0;flg 前 - 左 并且存储即将行走的下一个格子的坐标*/void LeftMethod (void) u8 leftmap,rightmap,frontmap; leftmap=GetNextGridmap(MOUSELEFT); rightmap=GetNextGridmap(MOUSERIGHT); frontmap=GetNextGridmap(MOUSEFRONT);/* if(mouselocate.cX=3&mouselocate.cY=3) /判断当前的坐

16、标是否为目标地点 comeback=1; Stop(); TurnBack(); mouseface=(mouseface+2)%4; Stop(); left_count=35; right_count=35; return;*/ if(Left_Detector=0&(leftmap&0x0f)=0x00) / 未走过的之路 if(mouseface=FACE_NORTH) mouselocate.cY+; led1=!led1; if(mouseface=FACE_SOUTH) mouselocate.cY-; led1=!led1; mouseface=(mouseface+3)%4;

17、 TurnLeft(); left_count=0; right_count=0; return; if(Front_Detector=0&(frontmap&0x0f)=0x00) / 未走过的支路 Go(); return;/直走 什么都不做if(Right_Detector=1&(rightmap&0x0f)=0x00) / 未走过的支路 if(mouseface=FACE_NORTH) mouselocate.cY+; led1=!led1; if(mouseface=FACE_SOUTH) mouselocate.cY-; led1=!led1; mouseface=(mousefa

18、ce+1)%4;/根据转向调整绝对方向 TurnRight(); left_count=0; right_count=0; return; if(Left_Detector=1&Right_Detector=0&Front_Detector=1) TurnBack(); mouseface=(mouseface+2)%4; mapmouselocate.cXmouselocate.cY|=0x0f; /将该支路标志为不通 left_count=0; right_count=0; return; if(Left_Detector=0) TurnLeft(); mouseface=(mousefa

19、ce+3)%4; mapmouselocate.cXmouselocate.cY|=0x0f; left_count=0; right_count=0; return; if(Front_Detector=0) mapmouselocate.cXmouselocate.cY|=0x0f; return; if(Right_Detector=1) TurnRight(); mouseface=(mouseface+1)%4;/根据转向调整绝对方向 mapmouselocate.cXmouselocate.cY|=0x0f; left_count=0; right_count=0; return;

20、void LeftMethod2()unsigned char i; if(Left_Detector=0&Front_Detector=0&Right_Detector=1) Go();for(i=0;i4;i+) Delay(20000); if(Left_Detector=0&Front_Detector=0&Right_Detector=1) speed3(0,0,0,0);led1=0;while(Rstart_Key=1);led1=1; elseTurnLeft(); if(Left_Detector=0) TurnLeft(); else if(Front_Detector=0

21、) Go(); else if(Right_Detector=1) TurnRight(); else if(Left_Detector=1&Front_Detector=1&Right_Detector=0) TurnBack();void LeftMethod3() u8 leftmap,rightmap,frontmap;leftmap=GetNextGridmap(MOUSELEFT);rightmap=GetNextGridmap(MOUSERIGHT);frontmap=GetNextGridmap(MOUSEFRONT);if(mouselocate.cX=0&mouseloca

22、te.cY=0) /判断当前的坐标是否为目标地点 task=OVER; return; if(leftbuf=0& /左边有支路(leftmap&0x0f)=0x0a) / 走得通的支路 TurnLeft(); mouseface=(mouseface+3)%4; return; if(frontbuf=0& / 前方有支路(frontmap&0x0f)=0x0a) / 走得通的支路 Go();return;/直走 什么都不做 if(rightbuf=1& / 右方有支路(rightmap&0x0f)=0x0a) / 走得通的支路 Stop(); TurnRight(); mouseface=

23、(mouseface+1)%4;/根据转向调整绝对方向 return;void LeftMethod4() if(Left_Detector=0) TurnLeft(); else if(Front_Detector=0) Go(); else if(Right_Detector=1) TurnRight(); else if(Left_Detector=1&Front_Detector=1&Right_Detector=0) TurnBack();/*function name :void Dir_Trans()*param :none*return value :none*description :计算下一个到达的格子坐标 */void DirTrans()switch(mouseface) /计算下一个到达的格子坐标 case FACE_NORTH: /如果车的头部是向北的 纵价标加1 mouselocate.cY+; led1=!led1; break; case FACE_SOUTH: / 如果车的头部是向南的纵坐标减1 mouselocate.cY-; led1=!led1; break; case FACE_EAST: /如果车的头部是向东的 横坐标加1 mouselocate.cX+;/ led

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论