ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:1.18MB ,
资源ID:7875000      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7875000.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(西南交大电脑鼠课程设计.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

西南交大电脑鼠课程设计.docx

1、西南交大电脑鼠课程设计电子技术课程设计报告学 院:专 业:年 级:姓 名:学 号:指导老师:第一章 课程设计任务和总体设计1.1 课程设计任务该课程设计以两人组队的形式,制作寻线型电脑鼠。要求能够在88的迷宫中搜索路径并计算出最短路径。其中迷宫由25mm宽的黑线组成。电脑鼠第一次进入迷宫和返回迷宫时,可以循着黑线走到终点并记录迷宫信息,第二次进入迷宫时,根据第一次所记录的迷宫信息选择最短路径冲刺到终点。1.2 总体设计思路和步骤寻线型电脑鼠不同于以前的走迷宫,是利用红外传感器进行路线探测并选择前进方向的小型智能机器人。其设计步骤包括:系统设计、利用Altium Designer软件绘制原理图和

2、PCB图,电脑鼠硬件焊接组装、软件代码书写调试和总体调试。硬件部分主要由传感器,单片机,电机驱动组成。传感器采用红外传感器,由发射管和接收管组成,可探测黑线迷宫。单片机采用IAP15W413AS芯片,用于编写和实现程序。电机驱动由单片机产生的PWM以及L9110芯片进行驱动。软件部分主要由产生PWM函数,搜寻路径法则,记录信息,测速盘组成。此课程设计中电脑鼠按照左手法则进行路线搜索,根据测速盘的计数得到迷宫坐标并储存。第一次排除迷宫中的死路,第二次便可沿迷宫中最短路径走出迷宫。第二章 硬件设计2.1 硬件设计步骤硬件设计步骤如图1所示。设计原理图、生成PCB板之后进行手动布线,再根据PCB板将

3、原件、轮子、轴承、电机、齿轮等器件进行组装,调整传感器角度使之能够达到良好的接受效果。最后进行电路测试,测试方式在软件设计部分说明。2.2 主控模块(单片机) 包括单片机(图2)和电脑下载部分(图3)。单片机采用了STC15W4K32S4芯片,其原理图为:图2图1管脚图:图3图42.3 传感器模块传感器模块运用了5对发光二极管(白)+红外光敏三极管(黑)的组合(如图7),成一条直线置于电脑鼠前端用于探测赛道。其中左前与右前的探测器用于纠正电脑鼠直线行走时由于 2 个电机转动不一致导致的轨道偏离。左、前和右方的三个探测器用于探测距离电脑鼠特定距离内的左右和前方有无线路。用于提供红外信号的30kH

4、z 多的信号可以由STC15W4K32S4单片机的时钟输出口输出,占空比固定为 50%。 当发射的光线集中于白色地区时,光线会被反射,黑色的接收管就会将其吸收;反之,发射光线集中的地方是黑色的时候,光线会被吸收而没有反射。 单个的传感器模块如图5图5发光二极管电路图如图6.图6实物图见图7.图72.4 电机驱动模块电脑鼠的前进、拐弯和旋转等动作必须依靠两个电机的转动来控制。具体为:直行:两个电机同方向转动;转弯:两个电机一个转一个不转或者一个正转一个反转。要使电机转动,需要一定的电压,以电压控制电机的运转。而为了获得一个较为合适的电压值,往往需要调节电阻。通过不断重复地开、关操作,实现我们需要

5、的“脉冲宽度调制”(简称pwm调制)。当pwm信号与电机相连时,电机的旋转速度就可以根据我们的 程序设定来工作。电机正、反转以及刹车的控制是通过两个L9110芯片来控制的。图8为L9110的应用电路图。图8图9为 其原理图。图9除L9110之外,该模块还使用了74HC00芯片参与pwm控制。原理图如图10图102.5 测速模块电脑鼠设计使用直流电机,一方面通过对电机的转速加以运算可获得电脑鼠所在方位,记忆当前迷宫情况;一方面在编程时,了解电机转速对电脑鼠行走速度可以进行更好地控制,使其能够在尽量短的时间内遍历迷宫且走到终点。采用红外发射二极管和红外光敏三极管组成一对对射管实现对两个电机转速进行

6、测量,需要分别在两个电机的一端添加码盘。其实物图如图11.图112.6 电源电脑鼠的电源为5号铁锂电池和7号铁锂电池各一节,分别为单片机和电机供电,提供电压约为3.2V左右。电源原理图如图12所示。图12至此,电脑鼠的硬件设计基本完成,完整的原理图、PCB图见附录。焊接PCB板成品图如图13.图13第三章 软件设计3.1 程序流程图(图14)图14第四章 最终结果课程设计结果:电脑鼠可完成寻线并到达终点,有时候也能顺利返回起点。在焊接过程中,因为有光立方比赛的经验,焊接工作比较顺利,除了中途有一次不小心将一个芯片的两个引脚焊在了一起,然后我们及时的用仪器解决了这一问题。而软件部分,虽然用的源代

7、码是同学间分享流传的,但是也是通过自己的调试,修改才完成的。另外,在学长的指导下,也对右手算法程序中左转优先级不高这一缺点进行了完善。第五章 总结及体会这次课程设计让我受益匪浅,无论从知识上还是其他的各个方面。上课的时候的学习从来没有见过真正的单片机,只是从理论的角度去理解枯燥乏味。但在实习中见过甚至使用了单片机及其系统,能够理论联系实际的学习,开阔了眼界,提高了单片机知识的理解和水平。在这次课程设计中又让我体会到了合作与团结的力量,当遇到不会或是设计不出来的地方,我们就会在QQ群里讨论或者是同学之间相互帮助。团结就是力量,无论在现在的学习中还是在以后的工作中,团结都是至关重要的,有了团结会有

8、更多的理念、更多的思维、更多的情感。单片机是很重要的一门课程,蒋老师曾说过,如果学好一门单片机,就凭这个技术这门手艺找一个好工作也不成问题。尽管我们在课堂学到的内容很有限,但在以后的学习中单片机还需要好好的深入研究和学习,学好了单片机也就多了一项生存的本钱。最后感谢老师、学长们对我们的精心指导和帮助,感谢同学们对我的帮助。附录1:原理图附录2:PCB图附录3:程序代码#include stdio.h#include action.h /电机驱动头文件#include bmp_pixel.h#include NOKIA_5110.h#include configuration.hu16 gz1

9、= 0; void Stop_On_Going() Wheel_Control(LEFT,1,255); /1表示正向转,data越大,转速越小 Wheel_Control(RIGHT,1,255); void Turn_Right() /右转的具体实现 do Wheel_Control(LEFT,1,32); Wheel_Control(RIGHT,0,45); while(P1&0xf8=0xd8|P1&0xf8=0x98|P1&0xf8=0xc8); void Go_straight() /直走的具体实现 Wheel_Control(LEFT,1,42); Wheel_Control(R

10、IGHT,1,55); void Turn_Left() do Wheel_Control(LEFT,1,52); Wheel_Control(RIGHT,1,65); while(Left_Detector=1); /在左转之前,先走一段距离, 直到最左边的灯走出黑线(为实现直走左转) if(Middle_Detector=0) Go_straight(); else do Wheel_Control(LEFT,0,32); /左齿轮反转,右齿轮正转 Wheel_Control(RIGHT,1,45); while(P1&0xf8=0xd8|P1&0xf8=0x98|P1&0xf8=0xc8

11、); void Turn_back() /调头的具体实现 xxx. do Wheel_Control(LEFT,0,42); Wheel_Control(RIGHT,1,55); while(P1&0xf8 = 0xd8); void Left_Adjust() /左偏-向右微调的具体实现 do Wheel_Control(LEFT,0,72); /左轮子转速快一点就可以解决左偏问题 Wheel_Control(RIGHT,1,55); while(P1&0xf8=0xd8|P1&0xf8=0xc8|P1&0xf8=0xe8|P1&0xf8=0xf0); void Right_Adjust()

12、 /右偏向-左微调 的具体实现 do Wheel_Control(LEFT,1,62); Wheel_Control(RIGHT,0,75); while(P1&0xf8=0xd8|P1&0xf8=0x98|P1&0xf8=0xb8|P1&0xf8=0x78); void Find_gz();void main() u16 mode = 0; u8 sensor = 0; /功能模块初始化/ GPIO_config(); /STC15W4K32S4 PWM复用口 由高阻初始化为双向口 EXTI_config(); /外部中断 测速 Timer_config(); /定时器 PCA_config

13、(); /PWM UART_config(); /串口 ADC_config(); /AD 电压检测 /液晶屏初始化 LCD_init(); LCD_clear(); LCD_draw_bmp_pixel(15,0,BMP,48,56); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); LCD_clear(); LCD_write_english_string(2,0, Welcome To ); LCD_write_english_string(2,1, S W J T U ); LCD_write_english_st

14、ring(2,2, DNS VER 2.1 ); LCD_write_english_string(2,3,Nokia5110 LCD ); LCD_write_chinese_string(1,4,12,6,0,2); /wait for the start key down/ while(Start_Key); / 延时启动(start按键按下,等待n秒后启动) delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250); delay_ms(250);/ delay_ms(250);/ delay_ms(250);/ delay_m

15、s(250);/ delay_ms(250);/ delay_ms(250);/ delay_ms(250);/ LCD_clear(); /开总中断 SET_EA(); /* add your program here !.*/ while(1) P1=0xff; sensor = P1&0xf8; if(gz1=0) switch(sensor) case 0x10 : /00010000 case 0x08 : /00001000 case 0x18 : mode = 1; break; /00011000 左转 /算法体现,先从左遍历图 case 0xa0 : /10100000 ca

16、se 0xd0 : /11010000 case 0x88 : /10001000 case 0xd8 : mode = 2; break; /11011000 直走 case 0x80 : /10000000 case 0x00 : /00000000 case 0xc0 : mode = 3; break; /11000000 右转 case 0xf8 : mode = 4; break; /11111000 掉头 case 0xe0 : /01001000 case 0x78 : /01111000 case 0x38 : /00111000 case 0xb8 : /10111000

17、case 0x98 : mode = 10; break; /10011000 头右偏,后续调整 case 0x90 : you zhuan yi chang chu li case 0xe8 : /11101000 case 0xc8 : /11001000 case 0xf0 : mode = 11; break; /11110000 头偏左,后续调整 default : mode = 5; break; /其他情况,执行右转 switch(mode) case 1 : Turn_Left(); break; case 2 : Go_straight(); break; case 3 :

18、Turn_Right(); break; case 4 : Turn_back(); break; case 5 : Find_gz();break; case 10 : Left_Adjust(); break; case 11 : Right_Adjust(); break; default : Go_straight(); break; void Find_gz() gz1 = 1 ; do if(Left_Detector & Left_middle_Detector =0) Wheel_Control(LEFT,0,72); Wheel_Control(RIGHT,1,85); el

19、se if(Right_middle_Detector & Right_Detector = 0) Wheel_Control(LEFT,1,62); Wheel_Control(RIGHT,0,75); while(P1&0xf8=0xd8); gz1 = 0 ;/* 功能说明 *本文件为电机控制程序*/#include Action.h/*function name :void Wheel_Control(bit side , u8 data_CCAPnH)*param :side = LEFT or RIGHT dir = WHEEL_FRONT or WHEEL_BACK data_C

20、CAPnH 为输入CCAPnH的8bit数据 *return value :none*description :control the left or right wheels running*/void Wheel_Control(bit side , bit dir , u8 data_CCAPnH) if(dir=WHEEL_FRONT) /选择的轮子前进 if(side=RIGHT) Motor_Right_Control = 1; PWMn_Update(PCA0,data_CCAPnH); else if(side=LEFT) Motor_Left_Control = 1; PWM

21、n_Update(PCA1,data_CCAPnH); else if(dir=WHEEL_BACK) if(side=RIGHT) Motor_Right_Control = 0; PWMn_Update(PCA0,data_CCAPnH); else if(side=LEFT) Motor_Left_Control = 0; PWMn_Update(PCA1,data_CCAPnH); /*function name :void TurnRight()*param :none*return value :none*description :控制电脑鼠向右转*/#if IN_PLACEvoi

22、d TurnRight() u8 flg=1; TX1_write2buff(0xDD); left_count=right_count=0; Wheel_Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); while(flg=1) if(right_count=60|left_count=60) Wheel_Control(LEFT, WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(RIGHT,WHEEL_BACK,

23、 SPEED_INIT_LEFT); if(left_count=125|right_count=125) Wheel_Control(LEFT,WHEEL_FRONT,0Xff); /左轮停止 Wheel_Control(RIGHT,WHEEL_BACK,0Xff); left_count=0; right_count=0; flg=0; #elsevoid TurnRight() u8 flg=1; left_count=right_count=0; Wheel_Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); Wheel_Control(RIGHT,W

24、HEEL_FRONT,0XFF); while(flg=1) if(left_count=90|right_count=90) Wheel_Control(LEFT,WHEEL_FRONT,0Xff); /左轮停止 left_count=0; right_count=0; flg=0; #endif/*function name :void TurnRight()*param :none*return value :none*description :控制电脑鼠向左转*/#if IN_PLACE void TurnLeft() u8 flg=1; TX1_write2buff(0xEE); l

25、eft_count=right_count=0; Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(LEFT,WHEEL_FRONT,SPEED_INIT_LEFT); while(flg=1) if(right_count=60|left_count=60) Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(LEFT,WHEEL_BACK,SPEED_INIT_LEFT); if(right_count=125|left_count=125) Wheel_Control(RIGHT,WHEEL_FRONT,0Xff); /右轮停止 Wheel_Control(LEFT,WHEEL_BACK,0Xff); left_count=0; right_count=0; flg=0; #elsevoid TurnLeft() u8 flg=1; left_count=right_count=0; Wheel_Control(RIGHT,WHEEL_FRONT,SPEED_INIT_RIGHT); Wheel_Control(LEFT,WHEEL_FRONT,0xff); while(flg=

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1