单片机实训.docx

上传人:b****7 文档编号:9437768 上传时间:2023-02-04 格式:DOCX 页数:29 大小:1.57MB
下载 相关 举报
单片机实训.docx_第1页
第1页 / 共29页
单片机实训.docx_第2页
第2页 / 共29页
单片机实训.docx_第3页
第3页 / 共29页
单片机实训.docx_第4页
第4页 / 共29页
单片机实训.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

单片机实训.docx

《单片机实训.docx》由会员分享,可在线阅读,更多相关《单片机实训.docx(29页珍藏版)》请在冰豆网上搜索。

单片机实训.docx

单片机实训

 

实训(习)报告

 

课程名称:

单片机实训

专业:

轨道交通信号与控制

班级学号:

学生姓名:

指导教师:

成绩:

 

完成日期:

2016年8月25日

目录

 

1智能小车硬件设计1

1.1智能小车整体设计1

1.2智能小车硬件选型2

1.2.1硬件组成结构2

1.2.2硬件清单3

1.3智能小车主控单元4

1.3.1单片机最小系统简介4

1.3.2单片机最小系统电路原理图5

1.4智能小车检测系统5

1.4.1传感器的基本原理5

1.4.2传感器电路原理图5

1.5智能小车执行机构6

1.5.1驱动电路原理图6

1.5.2直流减速电动机的工作原理6

2智能小车软件系统设计7

2.1软件编程环境7

2.2程序下载方法.7

2.3主程序流程图9

2.4循迹功能软件设计10

2.4.1循迹程序设计流程图10

2.4.2循迹主要程序11

2.5避障功能软件设计12

2.5.1避障程序设计流程图12

2.5.2避障主要程序14

2.6功能调试16

2.6.1循迹功能调试16

2.6.2避障功能调试16

3实训心得17

附录A源程序18

附录B实物图28

 

1智能小车硬件设计

1.1智能小车整体结构设计

本车采用STC89C52RC单片机为核心,附加外围接口电路,将光电传感器采集的到的道路信息进行综合判别和处理,并通过速度传感器获得从而控制小车速度,然后发出指令给电机驱动器控制小车,从而控制小车速度,准确根据道路特定路线行驶。

快速准确的光电感应信息采集,快速准确的实时速度控制和单片机进行综合数据处理,是小车能够只能实现小车的加速、减速、左右转向。

通过车模的组装、传感器的选择和安装、系统电路板的设计与安装、控制算法的设计与调试,从而实现小车自动识别行驶道路,并根据线路实现自动加速、减速和左右转向等功能。

本系统采用简单明了的设计方案。

通过高发射功率红外光电二极管和高灵敏度光电晶体管组成的传感器循迹模块判断黑线路经,然后由STC89C52通过IO口控制L298N驱动模块改变两个直流电机的工作状态,最后实现小车循迹。

图1.1智能小车整体结构图

1.2智能小车硬件选型

1.2.1硬件组成结构

智能寻迹小车主要由STC89C52单片机电路、TCRT5000循迹模块、L298N驱动模块、直流电机、小车底板、电源模块等组成。

(1)单片机电路:

采用STC89C52芯片作为控制单元。

STC89C52单片机具有低成本、高性能、抗干扰能力强、超低功耗、低电磁干扰,并且与传统的8051单片机程序兼容,无需改变硬件,支持在系统编程技术。

使用ISP可不用编程器直接在PCB板上烧录程序,修改、调速都很方便。

(2)TCRT5000循迹模块:

采用脉冲调制反射式红外发射接收器作为循迹传感器,调制信号带有交流分量,可减少外界的大量干扰。

信号采集部分就相当于智能循迹小车的眼睛,由它完成黑线识别并生产高、低平信号传送到控制单元,然后单片机生成指令来控制驱动模块来控制两个直流电机的工作状态,来完成自动循迹。

JY043W型光电管和电压比较器LM393为核心部分,再加上必要的外围电路。

(3)L298N驱动模块:

采用L298N作为电机驱动芯片。

L298N具有高电压、电流、响应频率高的全桥驱动芯片,一片L298N可以分别控制两个直流电机,并且带有控制使能端。

该电机驱动芯片驱动能力强、操作方便,稳定性好,性能优良。

L298N的使能端可以外接电平控制,也可以利用单片机进行软件控制,满足各种复杂电路的需要。

另外,L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够的问题。

(4)直流电机:

采用双直流电动机。

直流电动机的控制方法比异步电动机简单,只需给电机两条控制线加上适当的电压就能使电机旋转,在正常工作电压范围,电压越高直流电机转速越高。

直流电动机调速方法分为两种:

一种是直接调整电压,另一种通过PWM调速。

PWM调速就是使加在直流电机两端的电压波形为矩形波,改变矩形波的占空比就能实现电压的改变,从而实现电机转速的改变。

(5)电源模块:

由6个串联1.5V干电池作为电源。

通过7805稳压芯片稳压,通过0.1uF和100μF电容进行滤波。

 

1.2.2硬件清单

表1.1元件清单

序号

元件名称

规格

数量

1

单片机

STC89C52RC

1个

2

晶振

12.0598MHz

1个

3

三极管

S8050

4个

4

发光二极管

LED-RED

1个

5

电容

100µF

4个

30PF

2个

6

红外避障模块

TCRT5000

2个

7

红外线接收头

V34838

1个

8

红外寻迹模块

TCRT5000

5个

9

电阻

10KΩ、300Ω、1KΩ

若干

10

直流电机驱动

L293D

1个

11

铜柱

5mm、10mm、20mm

共20根

12

直流减速电机

小型#1017

2个

13

排针

KF332K-3P

若干

14

杜邦线

带针孔

若干

15

数码管

7SEG-MPX4-CC

1个

16

蜂鸣器

HUDZ

1个

17

电源

5V∼6V

1个

18

电解电容

10µF

1个

 

1.3智能小车主控单元

1.3.1单片机最小系统简介

供电电路:

40脚接电源+5V,20脚接地,这样便完成了单片机的供电。

选择使用内部ROM:

我们下载程序的时候是将程序下载的单片机内部的ROM里面存放的,将EA/VPP端接到高电平(+5V),就告诉单片机系统我们选择的是内部的ROM,这样单片机工作的时候就会执行内部ROM里面的代码了。

如果将EA/VPP接地,单片机就会执行扩展的外部ROM,我们没有扩展ROM呀,以后在没有扩展ROM的时候我们都将它接高电平就OK。

复位电路:

复位电路由电阻R1和电容C1组成。

复位电路是用以完成单片机的复位初始化操作的(复位单片机RAM和各个寄存器的值的)。

也就是说,在单片机还没工作之前,我们先把寄存器的值全部复位成初始的默认值然后再开始工作,避免执行程序的时候发生错乱。

那复位电路的工作原理是怎样的呢?

在单片机没上电的时候,电容C1两个极板没有电荷,在单片机上电的瞬间,电容C1两端获得电压开始充电,既然C1要充电那么就必定有电流通过R1,所以在R1两端产生了瞬时电压,这个电压被加到了单片机的RST端,单片机的RST端得到了一个高电平便复位了。

随着时间的推移,C1充满电了,再也没电流通过R1了,R1两端便没有了电压,单片机的RST引脚又由高电平变成了低电平,这时,单片机便开始工作了。

值得注意的是,要引起单片机的复位,加在RST端的高电平必须保持在一定的时间以上(连续2个机器周期以上高电平)。

时钟电路:

时钟电路由C2、C3和晶振Y1组成。

时钟电路的作用是给单片机提供时钟脉冲,只有给单片机提供时钟脉冲单片机才会执行程序。

 

1.3.2单片机最小系统电路原理图

图1.2单片机最小系统原理图

 

1.4智能小车检测系统

1.4.1传感器的基本原理

利用某种转换功能,将物理的、化学的、生物的等外界信号变成可直接测量的信号的器件称为传感器。

由于电信号易于放大、反馈、滤波、微分、存储和远距离传输,加上计算机只能处理电信号,所以,狭义地说,传感器又可定义为可唯一而重视性好地将外界信号转换成电信号的元器件。

1.4.2传感器电路原理图

图1.3传感器原理图

1.5智能小车执行机构

1.5.1驱动电路原理图

 

图1.4电机驱动模块

 

1.5.2直流减速电动机的工作原理

无刷减速电机是采用半导体开关器件来实现电子换向的,即用电子开关器件代替传统的接触式换向器和电刷。

它具有可靠性高、无换向火花、机械噪声低等优点。

 

2智能小车软件系统设计

2.1软件编程环境

KeiluVision4

在运行STC-ISP-V4.80软件之前,应该先给出ISP的C程序源代码ISP.C要注意的是,此程序是在Keil-C中要建立工程文件,包含

2.2程序下载方法

IAP.C函数,并且在IAP.C和ISP.C中都要保留STC的定义,传入用户代码时,需要与计算机进行通信,一般采用RS232串行通信,数据协议采用简单协议。

具体的使用方法:

先把学习实验板和计算机连接好(接好串口线和电源)

打开STC-ISP-V4.80,在MCUType栏目下选中单片机,如STC89C52RC:

根据您的9针的数据线连接情况选中COM端口,按图示选中各项:

图2.1STC-ISP-V4.80的界面图

先确认硬件连接正确,按下图点击“打开文件”并在对话框内找到您要下载的HEX文件

选中两个条件项,这样可以使您在每次编译KEIL时HEX代码能自动加载到STC-ISP,点击“Download/下载”:

五、手动按下电源开关便即可把可执行文件HEX写入到单片机内,下图是正在写入程序截图:

 

图2.2单片机下载截图

 

2.3主程序流程图

 

图2.3主程序流程图

 

2.4循迹功能软件设计

2.4.1循迹程序设计流程图

 

 

图2.4循迹程序流程图

2.4.2循迹主要程序

voidmain(void)

{

unsignedchari;

P1=0X00;//关电机

//本实验学习的按键启动知识

B:

for(i=0;i<50;i++)//判断K4是否按下

{

delay

(1);//1ms内判断50次,如果其中有一次被判断到K4没按下,便重新检测

if(P3_7!

=0)//当K4按下时,启动小车前进,如有不明,请看慧净51单片机视频教程

gotoB;//跳转到标号B,重新检测

}

BUZZ=0;

delay(50);

BUZZ=1;//响50ms后关闭蜂鸣器

TMOD=0X01;

TH0=0XFc;//1ms定时

TL0=0X18;

TR0=1;

ET0=1;

EA=1;//开总中断

while

(1)//无限循环

{

if(Left_1_led==0&&Right_1_led==0)

run();

else

{

if(Left_1_led==1&&Right_1_led==0)

{

leftrun();

if(Right_1_led==1&&Left_1_led==0)

{

rightrun();

}

}

}

}

 

2.5避障功能软件设计

现代化的智能小车已经不再只是简单的远程控制了,循迹、自动驾驶才是智能化的象征,利用各种传感器件,从周围的行驶环境中收集信息,做出规避动作,避开前方障碍物。

一般用于智能小车壁障模块的传感器有超声波检测,红外发射接收二极管等,通过设计一些列电路让避障模块与主控模块进行通信,实现壁障功能。

本文为达到简单的壁障功能,需要检测前方是否有障碍物,但由于无论是超声波检测还是红外管,其检测角度有很大的局限性,在转弯时将不能很好的检测到侧面的障碍物,因此在智能小车正前方增加了超声波检测模块,因为需要考虑到小车在最快速行驶时,能够在较远的距离检测到并且快速做出反应,而超声波的检测角度和最远距离都比红外二极管的要更宽、更远,所以选择超声波模块;而当小车检测到障碍物需要转弯时,为了避免小车车速过快难以达到预期效果,降低小车的速度,当检测模块检测不到障碍物时恢复原本行驶速度,所以在智能小车左右两侧增加红外二极管,主要作用是检测小车转弯时和正常行驶时侧面的障碍物,实现壁障功能。

超声波传感器直接安装在小车的正前方,由于超声波的检测角度只有30°左右,所以在小车的左前方安装红外传感器。

当超声波的回波时间小于设定的时间时,说明在检测范围内有障碍物,小车向右转,若检测不到便继续直行,若红外传感器检测到障碍物,小车也向右转,若检测不到便继续直行,两个传感器共同作用,就实现了躲避障碍物的功能。

2.5.1避障程序设计流程图

图2.5避障程序设计流程图

 

2.5.2避障主要程序

voidmain(void)

{

unsignedchari;

P1=0X00;

B:

for(i=0;i<50;i++)

{

delay

(1);

if(P3_7!

=0)

gotoB;

}

BUZZ=0;

delay(50);

BUZZ=1;

TMOD=0X01;

TH0=0XFc;

TL0=0X18;

TR0=1;

ET0=1;

EA=1;

while

(1)

{

if(Left_1_led==1&&Right_1_led==1)

run();

else

{

if(Left_1_led==1&&Right_1_led==0)

{

leftrun();

}

if(Right_1_led==1&&Left_1_led==0)

{

rightrun();

}

if(Right_1_led==0&&Left_1_led==0)

{

backrun();

delay(50);

rightrun();

delay(30);

}

}

}

}

 

2.6功能调试

2.6.1循迹功能调试

打开开关,按下K4键,观察小车是否正常运行,把小车放到黑线上,观察小车是否循着黑线运动,如果没有调试L1,L2传感器的灵敏度,再将程序中的速度进行调节。

如此反复测试,小车终于能循着黑线运动,结果实验成功。

2.6.2避障功能调试

打开开关,按下K4键,观察小车是否正常运行,把小车放到地上,将一障碍物放于车前一点距离,观察小车运动到障碍物前弄否自动后退,如果不能,调试L3,L4的灵敏度,将速度也稍作调整。

反复测试,小车在遇到障碍物时能够自动的后退。

实现避障,结果试验成功。

 

3实训心得

通过这几个月的毕业设计,我查了很多相关智能小车的资料,基本上清楚了当今移动机器人的发展现状,以及未来的发展方向。

刚开始时没有头绪,认为机器人是离我们很遥远的,是和我们生活交集并不大的高科技产物,但是后来才发现,其实机器人在我们的生活中无处不在,各种智能机器人已经活跃在我们的生活中。

本设计采用的是STC89C52单片机制成小车,这主要是因为该单片机的稳定性比较好。

还可以采用其它系列的单片机。

设计出来的移动机器人符合ITS的基本要求,是主流的智能化的信息融合技术设计理念,功能强大,模块化设计,可移植性强,功率较低,有很广泛的应用领域和发展前景。

同时,性格决定命运,气度影响格局,态度决定高度,细节决定成败。

我们应该有正确的认识,只有我们有丰富的知识和经验的积累,才能成功。

知识和经验需要我们在做课题时不断的积累,做课题时一定要合理分工,严格按要求完成。

学会看英文文档,我们用到的芯片资料都是英文的,要学会找重点,找我们需要的东西,别人翻译的文档有可能错误或没说清楚。

编程软件也是英文的,如果是没人教,就得自己看资料学习。

智能小车是移动机器人的一种,从最简单的模型入手,我体会到了运动控制的过程,利用我们熟悉的单片机作为控制芯片,找到了移动机器人与我们所学知识的结合点。

总的来说,此次实习及设计完成了任务书规定的各项要求,进一步学习并实践了程序、调试等多种实用技术,成功设计出一个自动寻迹小车。

既学习了不少新的知识和技术,由亲身体验软件设计、开发的过程,个人觉得收获颇丰。

从网络上找到了很多的资料,其中不少新颖的思路值得一试。

这次设计使我受益终身。

 

附录A源程序

寻黑线

#ifndef_LED_H_

#define_LED_H_

 

//定义小车驱动模块输入IO口

sbitIN1=P1^2;

sbitIN2=P1^3;

sbitIN3=P1^6;

sbitIN4=P1^7;

sbitEN1=P1^4;

sbitEN2=P1^5;

/***蜂鸣器接线定义*****/

sbitBUZZ=P2^3;

#defineLeft_1_ledP3_3//左传感器

#defineRight_1_ledP3_2//右传感器

#defineLeft_moto_pwmP1_5//PWM信号端

#defineRight_moto_pwmP1_4//PWM信号端

 

#defineLeft_moto_go{P1_2=0,P1_3=1;}//左电机向前走

#defineLeft_moto_back{P1_2=1,P1_3=0;}//左边电机向后转

#defineLeft_moto_Stop{P1_5=0;}//左边电机停转

#defineRight_moto_go{P1_6=1,P1_7=0;}//右边电机向前走

#defineRight_moto_back{P1_6=0,P1_7=1;}//右边电机向后走

#defineRight_moto_Stop{P1_4=0;}//右边电机停转

unsignedcharpwm_val_left=0;//变量定义

unsignedcharpush_val_left=0;//左电机占空比N/20

unsignedcharpwm_val_right=0;

unsignedcharpush_val_right=0;//右电机占空比N/20

bitRight_moto_stop=1;

bitLeft_moto_stop=1;

unsignedinttime=0;

/************************************************************************/

//延时函数

voiddelay(unsignedintk)

{

unsignedintx,y;

for(x=0;x

for(y=0;y<2000;y++);

}

/************************************************************************/

//前速前进

voidrun(void)

{

push_val_left=7;//速度调节变量0-20。

0最小,20最大

push_val_right=7;

Left_moto_go;//左电机往前走

Right_moto_go;//右电机往前走

}

 

//左转

voidleftrun(void)

{

push_val_left=6;

push_val_right=6;

Right_moto_go;//右电机往前走

Left_moto_Stop;//左电机停止

}

//右转

voidrightrun(void)

{

push_val_left=6;

push_val_right=6;

Left_moto_go;//左电机往前走

Right_moto_Stop;//右电机往前走

}

 

/************************************************************************/

/*PWM调制电机转速*/

/************************************************************************/

/*左电机调速*/

/*调节push_val_left的值改变电机转速,占空比*/

voidpwm_out_left_moto(void)

{

if(Left_moto_stop)

{

if(pwm_val_left<=push_val_left)

{

Left_moto_pwm=1;

}

else

{

Left_moto_pwm=0;

}

if(pwm_val_left>=20)

pwm_val_left=0;

}

else

{

Left_moto_pwm=0;

}

}

/******************************************************************/

/*右电机调速*/

voidpwm_out_right_moto(void)

{

if(Right_moto_stop)

{

if(pwm_val_right<=push_val_right)

{

Right_moto_pwm=1;

}

else

{

Right_moto_pwm=0;

}

if(pwm_val_right>=20)

pwm_val_right=0;

}

else

{

Right_moto_pwm=0;

}

}

/***************************************************/

///*TIMER0中断服务子函数产生PWM信号*/

voidtimer0()interrupt1using2

{

TH0=0XFc;//1Ms定时

TL0=0X18;

time++;

pwm_val_left++;

pwm_val_right++;

pwm_out_left_moto();

pwm_out_right_moto();

}

/*********************************************************************/

#endif

避障

#ifndef_LED_H_

#define_LED_H_

 

//定义小车驱动模块输入IO口

sbitIN1=P1^2;

sbitIN2=P1^3;

sbitIN3=P1^6;

sbitIN4=P1^7;

sbitEN1=P1^4;

sbitEN2=P1^5;

/***蜂鸣器接线定义*****/

sbitBUZZ=P2^3;

#defineLeft_1_ledP3_5//左传感器

#defineRight_1_ledP3_4//右传感器

#defineLeft_moto_pwmP1_5//PWM信号端

#defineRight_moto_pwmP1_4//PWM信号端

#defineLeft_moto_go{P1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

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

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