C语言实训报告.docx
- 文档编号:23163324
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:11
- 大小:2.82MB
C语言实训报告.docx
《C语言实训报告.docx》由会员分享,可在线阅读,更多相关《C语言实训报告.docx(11页珍藏版)》请在冰豆网上搜索。
C语言实训报告
C语言程序设计
实训报告
题目:
红外避障机器人
院(系):
信息工程系
专业:
通信工程
学生姓名:
韦嘉宝
学号:
1551100424
指导教师:
朱震周斌王旬全刘辉
2016年10月8日
摘要……………………………………………………1
设计要求……………………………………………2
设计步骤……………………………………………3
代码编写……………………………………………4
心得体会……………………………………………5
参考文献·…………………………………………6
许多机器人使用雷达(RADAR)或者声纳(SONAR)来探测物体而不需要同物体接触。
本文的方法是使用红外光来照射机器人前进的路线,然后确定何时有光线从被探测目标反射回来,通过检测反射回来的红外光就可以确定前方是否有物体。
由于红外遥控技术的发展,现在红外线发射器和接收器已经很普及并且价格很便宜。
随着微电子技术的不断发展,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CPU、存储器、定时器、并行和串行接口、看门狗、前置放大器、A/D转换器、D/A转换器等多种电路,这就很容易将计算机技术与测量控制技术结合,组成智能化测量控制系统。
这种技术促使机器人技术也有了突飞猛进的发展,目前人们已经完全可以设计并制造出具有某些特殊功能的简易智能小车。
机器人使用红外线二极管LED作为前灯,如图6-1所示。
红外线二极管发射红外光线,如果机器人前面有障碍物,红外线从物体反射回来,相当于机器人眼睛的红外检测(接收)器,检测到反射回的红外光线,并发出信号来表明检测到从物体反射回红外线。
机器人的大脑——单片机AT89S52基于这个传感器的输入控制伺服电机。
红外线(IR)接收/检测器有内置的光滤波器,除了需要检测的980nm波长的红外线外,它几乎不允许其他光通过。
红外检测器还有一个电子滤波器,它只允许大约38.5kHz的电信号通过。
换句话说,检测器只寻找每秒闪烁38500次的红外光。
这就防止了普通光源像太阳光和室内光对IR的干涉。
太阳光是直流干涉(0Hz)源,而室内光依赖于所在区域的主电源,闪烁频率接近100Hz或120Hz。
由于120Hz在电子滤波器的38.5kHz通带频率之外,它完全被IR探测器忽略。
本任务将搭建并测试红外线发射和检测器对。
本讲需要用到的新部件如下:
元件清单
(1)红外检测器,2个。
(2)IRLED(带套筒),2个。
(3)470Ω电阻,2个。
(4)连接线,若干。
二、设计要求
(1)小车能够完成前进、后退、左转、右转等动作。
(2)机器人能够读出传感器电平变化,并作相应的动作变化。
(3)利用机器人所装配的两个探测器,探测和避开障碍物。
三、设计步骤
1.测试红外发射探测器
下面要用P1_3发送持续1ms的38.5kHz的红外光,如果红外光被机器人路径上的物体反射回来,红外检测器将给微控制器发送一个信号,让它知道已经检测到反射回的红外光。
让每个IRLED探测器组工作的关键是发送1ms频率为38.5kHz的红外信号,然后立刻将IR探测器的输出存储到一个变量中。
下面是一个例子,它发送38.5kHz信号给连接到P1_3的IR发射器,然后用整型变量irDetectLeft存储连接到P1_2的IR探测器的输出上。
for(counter=0;counter<38;counter++)
{
P1_3=1;
delay_nus(13);
P1_3=0;
delay_nus(13);
}
irDetectLeft=P1_2state();
上述代码给P1_3输出的信号高电平13μs,低电平为13μs,总周期为26μs,即频率约为38.5kHz。
总共输出38个周期的信号,即持续时间约为1ms(38×26≈1000μs)。
当没有红外信号返回时,探测器的输出状态为高电平。
当它探测到被物体反射的38.5kHz红外信号时,它的输出为低电平。
因红外信号发送的持续时间为1ms,因此IR探测器的输出如果处于低电平,其持续状态也不会超过1ms,因此发送完信号后必须立即将IR探测器的输出存储到变量中。
这些存储的值会显示在调试终端或被机器人用来导航。
保持机器人与串口电缆的连接,因为需用调试终端来测试IR组。
放一个物体,比如手或一张纸,距离左侧IR组大约2~3cm处,调试终端会显示“irDetecfLeft=0”;将物体移开时,它显示“irDetectLeft=1”。
再次修改程序,使其适用于右方红外。
3、探测和避开障碍物
有关IR检测器的趣事是它们的输出与触须的输出非常相像。
没有检测到物体时,输出为高电平;检测到物体时,输出为低电平。
本任务是更改程序RoamingWithWhiskers.c,使它适用于IR检测器。
进行IR探测时要使用AT89S52的4个引脚:
P1_2、P1_3、P3_5和P3_6。
#defineLeftIRP1_3//左边红外接收连接到P1_3#defineRightIRP1_2//右边红外接收连接到P1_2#defineLeftLaunchP3_6//左边红外发射连接到P3_6#defineRightLaunchP3_5//右边红外发射连接到P3_5
这里用到了宏定义命令:
#define,它的作用是在后面的程序文件中可以用LeftIR等来代替P1_3这个字符串等。
程序在编译预处理时,会自动将后面程序中出现的所有LeftIR等都用P1_3代替。
这种方法是用一个简单的名字代替一个长的字符串,或者用一个有意义的名字代替一些无规则、无意义的字符串,方便程序阅读、理解和修改。
4、改变触须程序使其适用于IR检测和躲避
设计一个函数voidIRLaunch(unsignedcharIR)来进行红外线发射。
voidIRLaunch(unsignedcharIR)
{
intcounter;
if(IR=='L')//左边发射
for(counter=0;counter<38;counter++)//发射时间比胡须长
{
LeftLaunch=1;
nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
LeftLaunch=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
if(IR=='R')//右边发射
for(counter=0;counter<38;counter++)
{
RightLaunch=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
RightLaunch=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
这个函数的形参是一个无符号的字符型变量,用到了修饰符unsigned。
对于字符型变量而言,在第2讲介绍过,如果没有指定修饰符unsigned,它也可以作为一个有符号的8位整型变量,取值范围为-128~127。
如果是无符号型,则取值范围为0~255。
无论是有符号还是无符号,其数值作为编码时代表的字符都是一样的。
修改if…else语句存储IR检测信息的变量。
if((irDetectLeft==0)&&(irDetectRight==0))//两边同时接收到红外线
{
Left_Turn();
Left_Turn();
}
elseif(irDetectLeft==0)//只有左边接收到红外线
Right_Turn();
elseif(irDetectRight==0)//只有右边接收到红外线
Left_Turn();
else
Forward();
2.本程序由如下模块组成:
(1)小车左右两个轮子的控制模块,完成小车不同状态下的行进方式。
(2)小车的后退控制程序模块,通过接受到指定信号完成小车的后退指令。
(3)小车的接收器接收信号模块,完成不同信号状态的传递和选择状态开关。
3.完成运动流程
(1)当左接收器检测到信号右接收器没有检测到信号时小车向左转弯
(2)当右接收器检测到信号左接收器没有检测到信号时小车向右转弯
(3)当左右探头都检测到信号时小车后退。
(4)当小车左右接收器均未检测到信号时直行。
4.函数的定义
5.运动控制程序
四、代码编写
#include
#include
voidForward(void)//向前行走子程序
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
voidLeft_Turn(void)//左转子程序
{
inti;
for(i=1;i<=16;i++)
{
P1_1=1;
delay_nus(1500);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
voidRight_Turn(void)//右转子程序
{
inti;
for(i=1;i<=26;i++)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
voidBackward(void)//向后行走子程序
{
inti;
for(i=1;i<=30;i++)
{
P1_1=1;
delay_nus(1500);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
voidmain()
{
if((P1_2==0)&&(P1_3==0))//两边同时接收到红外线
{
Backward();
Right_Turn();Right_Turn();Right_Turn();
}
elseif(P1_3==0)//只有左边接收到红外线
{
Backward();
Right_Turn();
}
elseif(P1_2==0)//只有右边接收到红外线
{
Backward();
Left_Turn();
}
else
Forward();
}
五、心得体会
(1)在对模块化机器人的组装调整中,我们熟悉了各种结构件的使用技巧,为设计更复杂的构型打好了基础;使我了解了机器人小车执行各种功能的原理和利用的器件,了解了小车最基本的前进后退转弯的工作原理,了解了小车如何寻线行驶,了解小车如何避障和寻找目标。
(2)让我亲身感受到传感器在机器人工作中的运用,可以说,机器人每做一个任务都离不开传感器,从避障,找目标物等等任务中完全体现出来。
(3)熟悉了用电脑c语言的应用及其部分传感器的使用,此次实验是培养我们综合运用所学知识发现提出分析和解决实际问题锻炼实践能力的重要环节随着科学技术发展的日新日异,现在机器人的应用在我们生活中日益增加,使我了解了一些关于机器人的知识。
此次实验也使我加深了对本课程的学习兴趣。
(4)通过这次实训使我对C语言有了更深刻的理解,对程序的算法,数据的定义,程序的改错等方面的能力有了很大的提高。
(5)体验到实际操作与理论的差别,例如,理论上只要调好程序,就可以完全做到精确地寻线行驶,但是实际中会出现外部因素的改变,周围物体对小车判断的各种影响红外避障小车,经过多次反复的验证,再经过多次的整体软硬件结合的调试,不断地对程序进行优化,小车完成了各项功能。
管脚的设定尤为重要。
六、参考文献
《c程序设计》《单片机实验设计》Z05.pdf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)