单片机.docx
- 文档编号:27742552
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:18
- 大小:385.36KB
单片机.docx
《单片机.docx》由会员分享,可在线阅读,更多相关《单片机.docx(18页珍藏版)》请在冰豆网上搜索。
单片机
武汉理工大学华夏学院
课程设计
课程名称硬件综合课程设计
题目小车循迹控制系统设计(路线9)
专业计算机科学与技术
班级计算机1111
学号10210411126
姓名
成绩__________________
指导教师夏婷万振武
2014年12月31日
课程设计任务书
学生姓名:
专业班级:
计算机1111
指导教师:
夏婷万振武工作单位:
信息工程系
设计题目:
小车循迹控制系统设计(路线9)
初始条件:
1、硬件设备:
MCS-51单片机最小系统板、四个QTI传感器、两个舵机、
两个车轮、锂电池、ISP下载线、面包板;
2、软件环境:
KeilC51、progisp下载器。
设计任务:
(在规定的时间内完成下列任务)
1.完成硬件设计并连线,以MCS-51单片机为控制核心,根据4个QTI传感器采集到的数据控制舵机的运转,进而控制车轮的速度和方向,并画出硬件原理图和实验连线图;
2.用C语言编程实现以下小车行驶线路(地图见下页):
起始点→中心点→E点,旋转360度→蓝色点→起始点。
要求:
小车前行时慢速行驶,小车返回时速度加快。
时间安排:
各时间段的任务可以交替进行
时间
阶段内容
第一周星期一
介绍题目,分组、选题、查找相关资料
第一周星期二
确定小组成员任务,一人一项任务,做需求分析
第一周星期三
小组成员一起进行硬件总体设计、软件总体设计,确定硬件原理图、实验连线图和软件流程图
第一周星期四~星期五
组员各自绘制自己负责模块的详细流程图,并编写、调试、修改程序
第二周星期一~星期三
各模块程序汇总,小组成员一起联调
第二周星期四
撰写设计报告
第二周星期五
检查、答辩后修改设计报告
设计报告撰写格式要求:
(按提供的设计报告统一格式撰写)
设计报告应包含以下内容:
①设计任务与要求②总体方案与说明
③硬件原理图与说明④实验接线图与说明
⑤软件主要模块流程图⑥源程序清单与注释
⑦系统调式、问题分析与解决方案;⑧小结与体会
附录:
①源程序(必须有简单注释)②使用说明③参考资料
指导教师签名:
2014年12月22日
教研室主任(或责任教师)签名:
2014年12月22日
注:
任务书根据你确定的选题下载,装订在封面的下一页
目录
目录
第1章需求分析1
1.1设计题目1
1.2设计任务及要求1
1.2.1设计任务1
1.2.2设计要求1
1.3软硬件运行环境及开发工具1
第2章概要设计2
2.1设计原理2
2.1.1硬件设计原理2
2.1.2软件设计原理2
2.1.3总体功能实现2
2.2实现方法2
2.2.1小车前进功能实现2
2.2.2小车旋转功能实现3
2.2.3小车偏移修正功能设计3
第3章详细设计5
3.1硬件设计与实现5
3.2程序流程图6
3.2.1主程序流程图6
3.3功能模块详细设计7
3.3.1起始点到中心点直行修正模块设计7
3.3.2中心点旋转90度模块设计7
3.3.3E点旋转360度模块设计8
3.3.4蓝点旋转135度模块设计8
3.3.5从蓝点返回至起始点8
第4章系统调试与操作说明9
4.1系统调试9
4.1.1硬件调试9
4.1.2软件调试9
4.2问题分析与解决9
4.3操作说明9
第5章总结和体会10
参考文献:
10
附录:
11
第1章需求分析
1.1设计题目
小车循迹控制系统设计(路线9)
1.2设计任务及要求
1.2.1设计任务
小组总体任务:
完成硬件设计并连线,以MCS-51单片机为控制核心,根据4个QTI传感器采集到的数据控制舵机的运转,进而控制车轮的速度和方向,并画出硬件原理图和实验连线图;用C语言编程实现以下小车行驶线路:
起始点→中心点→E点,旋转360度→蓝色点→起始点。
(要求:
小车前行时慢速行驶,小车返回时速度加快。
)
个人分配任务:
中心点旋转90度
1.2.2设计要求
小组内分工协作,每个组员负责一个模块,并须配合其他组员一起设计、联调,掌握整个系统设计。
用c语言完成编程,提交一个满足要求的小车循迹控制系统设计。
巩固课堂和书本上所学知识,综合这些基础知识,就具体问题做出软、硬件解决方案并付诸实施,以培养解决实际问题的能力和综合设计能力。
1.3软硬件运行环境及开发工具
1、硬件设备:
MCS-51单片机最小系统板、四个QTI传感器、两个舵机、两个车轮、锂电池、ISP下载线、面包板;
2、软件环境:
KeilC51、progisp下载器。
第2章概要设计
2.1设计原理
2.1.1硬件设计原理
硬件上,在MCS-51单片机的最小模式下,根据4个QTI传感器采集到的数据控制舵机的运转,当探测为黑线的时候,返回值为1,当探测为白线的时候,返回值是0,只有当中间两个qti返回值全为1的时候,才走在黑线上,qti感应器来随时采集数据,通过对感应器返回数据的判断,根据返回的状态来控制小车舵机的速度和方向。
2.1.2软件设计原理
软件上,通过c语言实现小车的控制语言,用KeilC51编写main.c,编译至无错并生成“.HEX”文件,使用progisp下载器先擦除单片机中原有代码,再将生成的“.HEX”文件烧写到单片机中。
在运动过程中还需要设计旋转90度、360度和135度的旋转子模块,当小车偏离轨道后,需设计修正子模块。
最后为了使小车停到制定区域,还需编写停止子模块。
2.1.3总体功能实现
实验中用到了四个头文件,分别是global.h:
定义用到的数据类型、变量;delay.h:
延时程序;motion.h:
控制两个舵机运转;qti.h:
获取4个QTI传感器采集的信号。
通过不停的检测与判断来控制小车,,当四个QTI传感器信号状态为0110时,则表明小车为正确为正确行驶路线,继续直线运动;如果四个QTI传感器信号状态为0100或1000时判定小车右偏时,对小车路线进行作左修正;如果四个QTI传感器信号状态为0010或0001时判定小车位左偏,对小车前进路线进行做修正,这样经过不断修正来实现小车的循迹前进,当到达指定点时,通过对左右轮子速度的变化实现小车的旋转。
2.2实现方法
2.2.1小车前进功能实现
此模块原理是向伺服电机输出若干个PWM波,波形的占空比可控制小车移动,通过
时间宽度和延时产生信号,作用于电机,从而控制其运动。
在本次设计中,向伺服电机PWM波过程已经被模块化在头文件中,即motion()函数中,通过对motion()函数的三个参数进行设置来实现控制电机转动从而控制小车前进。
motor_motion(uint16_tleft_val,uint16_tright_val,uint8_tcount)例:
其中参数left_val:
左边电机的高电平时间宽度;
right_val:
右边电机的高电平时间宽度;count:
脉冲数目
2.2.2小车旋转功能实现
小车旋转的原理是调整两轮的移动方式、速度及移动步数。
当需旋转90度时,将
左轮设置为快速前进状态,右轮为静止状态,多次调试测出旋转所需的步数100,最终得出的结果为:
motor_motion(2000,1530,100);
2.2.3小车偏移修正功能设计
小车偏移修正功能即对小车传感器信号状态进行检测并作出相应的处理的过程,在修正过程中偏移情况及其信号状态如下:
(1)机器人右偏时左转修正
当传感器采集的信号为:
图1右偏图
if((P22_state()&&(!
P23_state()))||(P21_state()&&(!
P22_state())&&(!
P23_state())&&(!
P24_state())))
{
motor_motion(1580,1400,1);//左转修正
}
判断小车是否向右偏移,若发生偏移通过调节左右轮的速度,即调用语句调用motor_motion(1580,1400,1);来实现修正。
(2)机器人左偏时右转修正
当传感器采集的信号为:
图2左偏图
if(((!
P22_state())&&P23_state())||((!
P21_state())&&(!
P22_state())&&(!
P23_state())&&P24_state()))
{
motor_motion(1800,1500,1);//右转修正
}
判断小车是否向左偏移,若发生偏移通过调节左右轮的速度,即调用语句调用motor_motion(1800,1500,1);来实现修正。
第3章详细设计
3.1硬件设计与实现
小车是由多个硬件零件组装而成,每个零件负责不同的功能,根据设计任务和要实现的主要功能,来进行硬件设计。
硬件设计原理图如下:
图3硬件原理图
根据硬件原理图,来进行硬件间的连线,系统接线图如下:
图4硬件接线图
3.2程序流程图
3.2.1主程序流程图
图5主程序流程图
3.2.2个人任务详细流程图
个人分配任务:
E点旋转90度
图6个人任务详细流程图
3.3功能模块详细设计
3.3.1起始点到中心点直行修正模块设计
起点到中心点,主要是从开始就前进,在前进过程中不停检测传感器传过来的信号,通过判断小车是否偏离路线后决定是否修正。
当小车小车右偏时左转修正,左偏时右转修正程序
3.3.2中心点旋转90度模块设计
当小车前进至中心点时,若传感器检测到都为黑色,即1111,实行右转90度的功能。
代码如下:
while
(1)
{
chego();//调用chego()子程序是小车直行并且修正
if(P21_state()&&P22_state()&&P23_state()&&P24_state())//:
当传感器都检测到为黑色时,P21_state(),P22_state(),P23_state(),P24_state()的返回值都为1,然后进入if内部
{
motor_motion(2000,1530,100);//90度右转
break;
}
}
3.3.3E点旋转360度模块设计
直行时检测传感器传过来的信号,判断小车是否偏离如果检测到0000信号,则执行旋转360度程序。
3.3.4蓝点旋转135度模块设计
直行时检测传感器传过来的信号,判断小车是否偏离如果检测到0111信号,则执行旋转360度程序。
3.3.5从蓝点返回至起始点
小车旋转135度后,直行一段距离,当发现1111信号时,小车终止。
第4章系统调试与操作说明
4.1系统调试
4.1.1硬件调试
由于在实验之前舵机已经调零,所以还需对qti传感器进行测试,装入测试程序及头文件,按步骤进行烧写,在串口调试小助手中查看测试结果,黑为1、白为0,否则需调传感器的位置和高度。
4.1.2软件调试
直线调试:
只保留motor_motion()函数,烧写到小车上,把小车放在直行黑线上,看他是否能一直在黑线上保持直线前进,如果不能直线行走,就说明小车两边的速度不对称,可能是轮子硬件问题,也可能是两个轮子速度不对称,调试至可以直线行走。
旋转90度调试:
把小车放地图上,看它能否旋转90度,若不能,则修改脉冲数,知道能够旋转90度为止。
4.2问题分析与解决
在系统调试过程中,我们遇到了许多的问题。
通过不断分析这些问题和不断重复调试最终都得到了很好的解决。
下面列举几个突出的问题:
问题一:
硬件调试时,无论怎么变换小车位置qti信号全为1
解决方案:
安装有qti感应器的金属板太高,感应器感应不到地面的信号,导致全为1,把感应器的高度适当调低后问题解决。
问题二:
小车90度转时,没有转到90度就直线行驶了
解决方案:
小车旋转90度的时候,第三个参数脉冲的步数没有达到,加大脉冲步数,直至刚好能够旋转90度。
4.3操作说明
1.在KeilC51中写好的程序进行编译生成.hex文件
2.通过ISP下载线和progisp软件将已生成的.hex文件烧写到单片机中
3.当烧写成功后,拔掉下载线,然后在已设定好的路线上,摆正小车位置。
4打开小车上的开关,观察小车是否按照预定的路径行驶。
第5章总结和体会
通过这次为期两周的软硬件综合课程设计,让我对计算机软硬件知识有了更系统性的理解。
这次课程设计我们小组做的是小车循迹控制系统设计,由于在硬件测试阶段,没有对qti进行测试,在后来的试验中出现了很大的困难。
很多事情可能因为一个小的差错要花费巨大的时间才能挽回,所以从一开始我们就要谨慎小心,不能一味的求快,否则反而适得其反,遇到问题不要灰心,冷静分析,仔细检查就能发现问题。
我相信条宝贵的教训在我今后的学习工作中一定会起到很大的用处。
当运行出最后的结果时我十分高兴,因为这是我们自己动手的结果。
课程设计让我发现学习计算机知识是一件很有趣的事情。
小车循迹控制系统功能实现并非难事,难点在于小组成员的相互配合。
我的经验就是要先小组一起总体规划,再局部整理,一步一步不能急。
以前对C语言,只能按书上按部就班的写,写C语句是会了,但逻辑和方法方面,一点都不够到位,没有对以前的知识进行系统的了解,没有把各个部分知识整合在一起,通过这次课程设计,体会到把知识应用于实践是不容易的,同时也学到课本所没有的东西,一些问题也只有真正做设计的时候才会出现。
因此通过此次课程设计我明显感觉到自身的不足,并希望以后能更加用心地运用所学知识和学习新的知识。
通过这次课设,我深刻明白了自己的动手能力的不足,平时太局限于课本的内容,没有加强动手能力,实践的时候就容易出错。
我们马上要走上工作岗位,在激烈的社会竞争中,动手能力显得十分重要,我们要锻炼自己的动手能力才能保证不被求职的大流所埋没。
平时遇到问题的时候也要多问多思考,不相信通过自身遗留问题,不然到需要的时候才发现知识点有空缺要补起来也十分困难。
两周的时间虽然短暂,但是我却学习到了这么多东西,真觉得受益匪浅,感谢同学的帮助,感谢老师的指导。
参考文献:
[1]詹春华,杨沙主编《C语言程序设计教程》.—北京科学出版社,2011.8
[2]王恩荣,MCS-51单片机应用技术,北京:
化学工业出版社,2001
[3]冯建华、赵亮,单片机应用系统设计与产品开发,北京:
人民邮电出版社,2004
设计者:
钱婷婷
日期:
2014年12月31日
附录:
#include"reg52.h"
#include"global.h"
#include"delay.h"
#include"qti.h"
#include"motion.h"
voidchego()
{
if((P22_state()&&(!
P23_state()))||(P21_state()&&(!
P22_state())&&(!
P23_state())&&(!
P24_state())))
{
motor_motion(1580,1400,1);//左转修正
}
if(((!
P22_state())&&P23_state())||((!
P21_state())&&(!
P22_state())&&(!
P23_state())&&P24_state()))
{
motor_motion(1800,1500,1);//右转修正
}
motor_motion(1750,1320,1);//直走
}
intmain()
{
/*while
(1)
{
chego();
if(P21_state()&&P22_state()&&P23_state()&&P24_state())
{
motor_motion(2000,1530,100);//90度右转
break;
}
}
while
(1)
{
chego();
if(!
P21_state()&&!
P22_state()&&!
P23_state()&&!
P24_state())
{
motor_motion(2000,1060,20);
motor_motion(1030,1030,200);//转360
break;
}
}*/
while
(1)
{
chego();
if((!
P21_state())&&(P22_state())&&(P23_state())&&(P24_state()))
{
motor_motion(2000,1540,120);//135度
break;
}
}
while
(1)
{
chego();
if((P21_state())&&(P22_state())&&(P23_state())&&(P24_state()))
{
while
(1)
{
motor_motion(1530,1530,30);//停止
}
}
}
}
设计过程中质疑(或答辩)记载:
1、小车是怎么旋转90度的?
答:
小车旋转的原理是调整两轮的移动方式、速度及移动步数。
当需旋转90度时,将左轮设置为快速前进状态,右轮为静止状态,多次调试测出在左轮的速度为2000,右轮静止的情况下,旋转所需的步数100。
2、小车旋转90度时使用了哪个函数,里面的参数各有什么意义?
答:
调用了motor_motion(2000,1530,100);函数,第一个参数2000代表左轮的速度,此时左轮快速前进,1530代表右轮的速度,此时右轮静止,100代表脉冲的数目,代表走100步。
指导教师评语:
评分:
签名:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机