自动避障小车课程设计_第1页
自动避障小车课程设计_第2页
自动避障小车课程设计_第3页
自动避障小车课程设计_第4页
自动避障小车课程设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

单片机系统

课程设计

成绩评定表

设计课题:自动避障小车

学院名称:电气工程学院

专业班级:自动1105

学生姓名:

学号:

指导教师:

设计地点:31-630

设计时间:

指导教师意见:

成绩:

签名:年月日

签名:年月日

M为3本人,孽

单片机系统

课程设计

课程设计名称:自动避障小车

专业班级:自动1105

学生姓名:

学号:

指导教师:

课程设计地点:31-630

课程设计时间:

单片机系统课程设计任务书

学生姓名专业班级学号

题目自动避障小车

课题性质产品设计课题来源自拟

指导教师

利用增强版51MCU设计一个自动避障小车,实现以下功能:

1、自主判别障碍,自动避开障碍;

主要内容2.识别出多障碍区和空旷区;

(参数)3、能在空旷区快速行进,在多障碍区适当速度行进。

3.能在空旷区快速行进,在多障碍区适当速度行进。

3、能在空旷区快速行进,在多障碍区适当速度行进。

第1天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。

第2-5天:按照确定的方案设计电路c画出总体电路图,而且选好各个元

件的参数、数量类型。然后由原理图生成PCB,用热转印法腐蚀这个电路板。

第6-7天:构建硬件系统,并且测试确认都可以正常工作。之后完成机械

任务要求

部分和硬件部分的搭建。

(进度)

第871天:编写程序,设计软件,并且开始撰写课程设计报告0

第1273天:整体调试,逐步完善。

第14天:完成课程设计报告。

第14天:完成课程设计报告。

【1】张迎新.单片微型计算机原理、应用及接口技术(第2版)[M].北京:

国防工业出版社,2004

主要参考[2]《单片机程序设计实例》清华大学出版社

资料【3】《单片机应用设计200例》

【4】《单片机程序设计及应用》李华军,电子工业出版社

审查意见

系(教研室)主任签字:年月日

系(教研室)主任签字:年月日

目录

1概述----------------------------------------------------------------4

研究背景----------------------------------------------------------4

设计思想及基本功能-------------------------------

2总体方案设计---------------------------------------

方案论证----------------------------------------------------------4

系统框图----------------------------------------------------------5

总体方案设计------------------------------------------------------6

3硬件电路设计--------------------------------------------------------7

电源电路------------------------------------------

晶振电路------------------------------------------

复位电路------------------------------------------

键盘电路------------------------------------------

显示电路------------------------------------------

超声波测距电路-----------------------------------

舵机电路------------------------------------------

电机驱动电路-------------------------------------

电机转速测量电路---------------------------------

设计PCB和腐蚀电路板-----------------------------

4系统软件设计----------------------------------------

分模块程序设计-----------------------------------

主程序设计----------------------------------------

5系统调试-------------------------------------------

6总结-----------------------------------------------

参考文献:............................................

附录A硬件电路图------------------------------------

附录B源程序-----------------------------------------

1概述

研究背景

科技的发展趋势之一就是让几乎所有的东西具有一定的智能。这样的智能一方面

可以避免人的复杂性带来的错误,另一方面,作为人的能力的延伸,快速、便捷

地适应环境。本文研究的超声波自动避障小车,就是让小车具有一定的智能.可

以作为有人驾驶车辆的一部分,帮助司机及早发现司机还未觉察的危险。另外,

可以应用在无人控制系统里,代替人类完成信息接收、处理和判断。那么这样它

还有更广阔的应用和发展空间。这个月我国嫦娥三号载着玉兔号月球车踏上了月

球,已经开始探索活动。玉兔号月球车可以自动寻找有价值的目标,自动避开障

碍物,自动寻找最优路径等等,这些功能在原理上都差不多,只是所用仪器以

及控制算法的不同。

设计思想及基本功能

小车设计的基本思路是:不断扫描前方180。左右的水平面内的物体,根据

反馈的距离和方位信息确定前方的地形是开阔还是多障碍。然后根据这些信息通

过路径最优算法选择前进方向。

小车的基本功能是识别空旷区和多障区;自动避开障碍物;能够在空旷区快

速行驶。

2总体方案设计

方案论证

首先是测距方案:

方案一:激光测距

优点:测速快,适应范围广,精确;不过相对于自动避障小车系统,有点大

材小用。激光测距是点对点的测距,一般进行远距离测距比较精确。如是近走高

激光测距,必须要涉及到微小时间测量,51MCU无法胜任。因此激光测距方案否

定。

方案二:超声波测距

优点:结构简单,成本低,便于与MCU联机工作。测量范围从5cM到几百米

的距离内精度在毫米级。尽管它测量的是点到面的距离,但是定向性满足本小车

系统的要求。而且,数据处理简单。可以考虑。

方案三:雷达测距

不太现实,受到本人技术水平限制,无法驾驭雷达测距系统,此外,雷达

应用于较大范围的测量和监控,如果用于本小车,同样涉及到微小时间测量,

以及雷达数据处理,51MCU难以胜任。否定!

方案四:红外线测距

优点:技术难度低,数据处理简单,但是测量开关信号比较好,测量连续信

号不够准确。测量的精度有点低。因此不是一种较好的测距方法。

综合各因素,选用超声波测距。

其次是微控制器的选择:

可选的微控制器有:51系列的STC89C52RC.STC12C5A60S2;TI公司的

MSP430G2553;飞思卡尔的MC9s12XS128MAL;意法的STM32F407-Discovery;(这

些玩儿过一点,而且最小系统板手边都有)

根据本系统的需求,需要两路同频率(50hz)的PWM控制两个舵机、一路PWM

频率约几千赫兹控制电机、三个个定时器做脉冲捕捉、至少两个外部中断输入、

一个并行6800总线接口。除了51系列的两款,其他一片足以胜任。而且对于

意法的F407显得大材小用。飞思卡尔的S12比较合适;TI的G2553的引脚有点

少(20个),外围电路设计的会复杂一点,成本也会高一点。60s2用两片比较

合适;用89052比较麻烦,两片也不够。根据个人能力,以及时间和进度方面

考虑选用60s2,60S2呢,它的资源有:完全兼容51的两个定时器TO、T1和两

个外部中断;两路拥有独立波特率的串行口;一个PCA定时器,可产生两路同

频的PWM;八个10位精度的AD转换通道;一个硬件SPI接口。

系统框图

系统框图如图所示

图系统框图

总体方案设计

两片60s2一个做主机,一个做从机,通过串行口通信,传递数据。

主机用到的功能有:

(1)、定时器T1和外部中断INT1,作用是:测脉宽,用到的I0是P3、;

P2^0作为超声波测距模块的触发功能引脚;

(2)、定时器TO和PCA产生两路同频率的PWM,作用是:TO的溢出率作为

PCA的计数脉冲产生50HZ的PWM控制两路舵机。使用T0作为PCA的时钟源,可

以通过改变T0的溢出率改变输出的频率。用到的I0是Pr3和P「4;

(3)、外部中断INTO接一个按键。

(4)、串口一使用独立波特率发生器,与从机通P3co和P31;

(5)、并行数据接口:P0口作为6800并行总线的数据总线P2"、P2%和P2F

作为控制总线,分别为:EN(总使能)、R\W(读写控制)、C\D(命令数据控制);

地址总线CS接地,一直处于选通状态。

从机用到的功能:

(1)、串行口一使用独立波特率发生器P3^0和P31与主机通讯;

(2)、PCA产生一路PWM,P「2共同控制电机速度。

(3)、定时器TO和T1作为编码器脉冲计数和测脉宽使用,测量电机的转速。

3硬件电路设计

首先是单片机的最小系统如图、所示

图单片机的最小系统

图单片机的最小系统

然后是各个模块电路:

电源电路

本系统由可充电电池供电,由开关电源LM2596转换成5V电压给单片机和

测距模块供电°出于对系统的稳定性、可靠性和成本的考虑,选用了开关

电源模块作为转换电路。电源部分电路如图

图电源部分电路

图电源模块实物

晶振电路

虽然60S2内部有RC振荡电路作为时钟电路的输入源,但是外部连接一个无源

晶振电路,可以使单片机的时钟频率更稳定,因而工作更可靠。电路参数:四

个电容均为22PF,作为石英晶振频率的微调。石英晶振的频率为12MHZ。

复位电路

复位电路是单片机必不可少的基本电路,在调试阶段,可以按下复位按键,使

复位引脚保持两个机器周期的低电平,就可以使单片机内部所有电路初始化。

电路参数:电容1UF只要保证电容的时间常数大于两个机器周期即可。电阻值

为1K欧。

键盘电路

键盘电路如图所示

图键盘电路

可以利用外部中断法或查询法检测按键是否按下。这里都采用外部中断的方

法检测。

显示电路

显示电路如图所示

图显示电路

采用1603液晶屏显示数字和字符。1603与1602的硬件接口完全一样。不

同之处在于1603的RAM区的内容可以全部同时显示在屏幕上,没有屏幕内

容的位移切换。可以显示四行。状态指示灯如图所示

图状态指示灯

这几个LED灯是作为状态指示用的,方便调试。

超声波测距电路

超声波测距模块如图所示

图超声波测距模块

这是超声波模块的接口电路。这个超声波的工作原理是:

⑴采用10触发测距,给至少10us的高电平信号;

⑵模块自动发送8个40khz的方波,自动检测是否有信号返回;

⑶有信号返回,通过I0输出一高电平,高电平持续的时间就是

(4)超声波从发射到返回的时间.测试距离二(高电平时间*声速(340M/S))/2:

超声波模块测距工作时序图:

触发信号(由单片机产生一个宽度大于10US的高脉冲,触发模块工作一

次):

模块内部发出的信号(循环发出8个40KHz的脉冲):

输出回响信号(叵响信号的高电平持续时间正比于检测的距离):

舵机电路

舵机电路如图所示

图鸵机电路

舵机驱动电路。舵机接口是信号线、电源正、地。信号线一般可以直接接到单

片机的10上,但是接多了就不行了,电流太大。这里用了一级三极管驱动,通

常用的这种舵机,控制信号是一个周期为20ms占空比在%一%之间的PWM信号,

分别对应舵机的控制角为0°-180°之间。舵机本身有反馈调节,因此,单片

机给出一个占空比,舵机就到某一个角度。

电机驱动电路

电机驱动电路如图所示

图电机驱动模块

电机的控制采用的是L298N全桥驱动电路。

驱动电路如图所示

图驱动电路

电机正反转原理:

10:I---------------------------------

电流流向:;;X;|i;:;i;|i

::1

PWM:I「II-I「II-I「IIII-I「I「IIII-I

I―假设此时电机正转-I--该时刻电机反转-TI

电机转速测量电路

电机转速测量电路如图所示

图电机转速测量电路

编码器输出信号:AB两相输出矩形正交脉冲,电路输出为NPN集电极开路

输出型,此种输出类型可以和带内部上拉电阻的单片机。

接线方式:黄二A相,蓝二B相,红二Vcc正电源,黑二V0地。

编码器输出信号图如图所示

图信号图

设计PCB和腐蚀电路板

这是原始的PCB图和单面的腐蚀电路板,红色的TOPLAYER层作为跳线,PCB

如图所示

图PCB图

图打印PCB负片图

图腐蚀效果图

4系统软件设计

主程序的流程图如图所示。

各个子模块初始化

*MCU停止打描

结束

图主程序流程图

主程序流程说明:

电路主要分为以下几个部分,分别是电源部分、显示部分、按键部分、步进电机

控制部分、超声波检测模块、舵机模块、单片机主控器件部分,各部分具有不同

的子程序。

系统初始化流程如图所示:

I关闭:中断I

1603显示初始化

串口初始化

舵机初始化

一;一

开系统总中断

图系统初始化流程图

分模块程序设计

4.1.1键盘程序

小车系统需要的按键不多,有两个,采用中断法。在系统中的作用是启动小

车。

4.1.2舵机驱动程序和电机驱动程序

控制原理部分在叙述硬件时已介绍。这里说说具体怎么实现。

产生50HZ的PWM控制舵机:时钟频率Fosc二HZ,定时器TO的溢出率FtO作

为PCA定时器的时钟输入。60S2工作在51模式下。设TO的初值为X,自动重装

模式,TO、PCA均无中断。计算方法为:

X*(12/Fosc)*256=

可以得出X=72,TH0=0xB7o

再计算占空比:PCA的中心计数器每(72*12/Fosc)秒记一个数,记256个数(即

一个八位计数器)溢出再从零开始。比较寄存器的取值是:256*和256*之间.对

应的转角在0到180度。在实际情况下,舵机不够精密,最大旋转角没有180

度,而且比较寄存器只能比较写入整数。实际的取值为7—29,控制方向的舵机

取值为17——21(分级明显,转向不够舒畅啊)。

电机的频率没有严格的要求,因此,选用简单的处理:对时钟进行

256*12分频,是。

4.1.3超声波测距程序

超声波测距实现原理就是测量高电平脉冲持续的时间。用到了51定时器启

停由外部控制的功能。GATE=1,TRn=1,定时器由外部中断引脚电平控制,上升沿

之后开始计数,下降沿之后停止计数。同时打开相应的外部中断,在下降沿到来

后进入外部中断服务程序,记录停止计数时的数值。

这里应当注意一个问题是:如果测量的距离较远,定时器可能就溢出了.对

这个不处理,结果将是错误的。因此同时开启定时器中断,在溢出时,记下溢出

的次数。距离的计算方法是:

距离二[Number*(12/Fosc)+N*65536*(12/Fosc)]/2

voidlnt1_Routine(void)iinterrupt2

(

T=(TH1*256+TL1);

TH1=0;

TL1二0;

juIi=((fIoat)T1_Count)*+*((fIoat)T);

LCD_Write_Number(0,2,juIi,5);

T1_Count=0;

T1_F=1;

)

主程序设计

主程序里主要是避障程序。我的思路是,把区域三部分:近距离20cM以内.适

中区域(20CM—150CM),远距离(150CM以外)。得到22组数据后首先是根据

区域分类,然后记各区域的角度大小,当远距离的角度范围最大时,判断为空

旷区,其他是多障碍区。然后根据角度大小排序,当适中区最大时,走的方向为

适中区集中的方向。当最大区域为近距离或远距离时,走远距离区,具体方向为

最远点方向。

速度总是由最近的障碍物距离计算得出。

5系统调试

首先是分模块调试。把各个模块的功能分开实现。然后是部分的组合到一起

使用,如超声波测距和1603显示、两路舵机同时控制。

在软件调试的时候,出现了RAM区不够用。原因出在避障算法上。定义的数

组多,而且长。用户128RAM不够用。可以有两个解决办法:一是改进代码.使

用指针;二是扩展RAM区。考虑到代码优化不是一天两天就弄好的,而且我的C

语言编程水平实在浅懑,指针依然是用不好,一用就报错。那只好扩展RAM。查

查60S2的数据手册,它取消了外部扩展RAM和ROM的功能,但是内部增加了1

KB的RAM,用法是在定义变量时,加前缀“XDATA”,告诉编译器把后面的变

量定义在扩展RAM区。此外我还了解到“DATA”、“PDATA"、“IDATA”都是51系

统编译器允许的关键字,具体的解释是:

dATa:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最

快,生成的代码也最小。idATa:固定指前面OxOO-Oxff的256个RAM,其中前

128和dATa的128完全相同,只是因为访问的方式不同。idATa是用类似C中的

指针方式访问的。汇编中的语句为:rnoxACC,@Rx.(不重要的补充:c中idATa

做指针式的访问效果很好)xdATa:外部扩展RAM.一般指外部0x0000-0xffff空

间,用DPTR访问°pdATa:外部扩展RAM的低256个字节,地址出现在A0-A7的

上时读写,用movxACC,@Rx读写。

硬件方面的调试主要在模块调试方面。因为基本上都用的现有的模块电路,

自己设计的电路基本没有(自己还差的很远唉!),没有什么难的。

小车主板:

图小车主板

整车图片:

图整车鸟瞰图

两周的单片机课程设计很快就结束了,但是在进军单片机领域,这仅仅是

个开始。学习单片机最重要的是实践。要投入必要的成本。一块开发板必不可少,

还有一大堆配套的硬件软件。

作为有志于今后继续在单片机方面发展的我,学会使用51单片机,远远不

够,世界上51系列占的市场份额并不多。流行的单片机,其功能远远好于51,

因此,学习51单片机重点在于利用它简单易学的特点掌握单片机的各种通用性

的东西,深刻理解和掌握它的工作原理和使用方式,这样可以快捷的掌握其他

单片机的使用。把单片机作为改变生活的万能工具。

学习单片机,离不开编程,离不开软件。C语言作为一种高级语言,与硬件

联系紧密。因此在单片机领域,基本都用的是C语言。灵活运用C语言,对单片

机学习带来极大的便利。今后还得继续深入学习C语言。还有一点,非常重要,

把软件工程的思想融入到单片机的编程中。比如分层和封装思想。这个课程设计

中所有的程序,并不是都在这两周写的,有一些以前玩过类似的模块,当然有

可靠地例程,在这里,修改一下硬件接口,修改一下工作方式,就可以用了。由

此看出,单片机学习是可以积累的。除了掌握大量的知识,还有个人的单片机例

程、软件、电路设计库,这样会越来越容易。

参考文献:

【1】《单片微型计算机原理、应用及接口技术》(第2版)张迎新.[M].北京:

国防工业出版社,2004

[2]夏路易石宗义.Protel99se电路原理图与电路板设计教程.北京:北

京希望电子出版社,2004

【3】《单片微型计算机原理、应用及接口技术》(第2版)张迎新,[M].北京:

国防工业出版社,2004

[4]宏晶STC12单片机技术手册

附录A硬件电路图

图整车鸟瞰图

附录B源程序

工程文件结构:

图整车鸟瞰图

STC12c5A60s2增加的特殊功能寄存器与地址的映射:

#ifndef_REG52_H_

#define_REG52_H_

/*BYTERegisters*/

sfrAUXR=0x8E;/*stc12c5a60s2*/

sfrWAKE_CLK0=0x8F;/*std2c5a60s2*/

sfrP1M1=0x91;/*stc12c5a60s2*/

sfrP1M0=0x92;/*stcl2c5a60s2*/

sfrP0M1=0x93;/*stc12c5a60s2*/

sfrP0M0=0x94;/*std2c5a60s2*/

sfrP2M1=0x95;/*stcl2c5a60s2*/

sfrP2M0=0x96;/*stc12c5a60s2*/

sfrCLK_DIV=0x97;/*std2c5a60s2*///CIockDivder

sfrS2C0N=0x9A;/*stc12c5a60s2*/

sfrS2BUF=0x9B;/*stc12c5a60s2*/

sfrBRT=0x9C;/*stc12c5a60s2*/

sfrBUS_SPEED=0xA1;/*stc12c5a60s2*/

sfrAUXR1=0xA2;/*stc12c5a60s2*/

sfrIE2=OxAF;/*std2c5a60s2*/

sfrP3M1=0xB1;/*stc12c5a60s2*/

sfrP3M0=0xB2;/*stc12c5a60s2*/

sfrP4M1=0xB3;/*stc12c5a60s2*/

sfrP4M0=0xB4;/*stc12c5a60s2*/

sfrIP2=0xB5;/*stc12c5a60s2*/

sfrIP2H=0xB6;/*stc12c5a60s2*/

sfrIPH=0xB7;/*stc12c5a60s2*///1nterruptPriorityHigh

sfrP4SW=OxBB:/*stc12c5a60s2*///P4I/OSwitch

sfrADC_CONTR=OxBC:/*std2c5a60s2*/

sfrADC_RES=0xBD;/*std2c5a60s2*/

sfrADC_RESL=0xBE;/*stc12c5a60s2*///A/DResultLow

sfrP4=OxCO;/*std2c5a60s2*///P4I/O

sfrWDT_C0NTR=0xC1;/*stc12c5a60s2*///Watch-Dog-TimerCotrolRegister

sfrIAP_DATA=0xC2;/*stc12c5a60s2*///ISP/IAPFlashDataRegister

sfrIAP_ADDRH=0xC3;/*stc12c5a60s2*///ISP/IAPFlashAddressHigh

sfrIAP_ADDRL=0xC4;/*stc12c5a60s2*///1SP/1APFIashAddressLow

sfrIAP_CMD=0x05;/*stc12c5a60s2*///ISP/IAPFlashCommandRegister

sfrIAP_TRIG=0xC6;/*stc12c5a60s2*///1SP/1APFlashCommandTrigger

sfrIAP_C0NTR=0xC7;/*std2c5a60s2*///1SP/1APControlRegister

sfrP5=0xC8;/*std2c5a60s2*///P5I/O

sfrP5M1=0xC9;/*std2c5a60s2*/

sfrP5M0=0xCA;/*stc12c5a60s2*/

sfrTL2=OxCC;/*8052*/

sfrSPSTAT=OxCD;/*std2c5a60s2*///SPIControlRegister

sfrSPCTL=OxCE;/*std2c5a60s2*///SPIStatusRegister

sfrSPDAT=OxCF;/*std2c5a60s2*///SPIDataRegister

sfrCCON=0xD8;/*std2c5a60s2*///PCA

sfrCMOD=0xD9;/*std2c5a60s2*///PCA

sfrCCAPMO=OxDA;/*std2c5a60s2*///PCA

sfrCCAPM1=OxDB;/*stc12c5a60s2*///PCA

sfrCL=0xE9;/*stc12c5a60s2*/

sfrCCAPOL=0xEA;/*stc12c5a60s2*/

sfrCCAP1L=0xEB:/*stc12c5a60s2*/

sfrPAC_PWM0=0xF2;/*stc12c5a60s2*///PCAPWM

sfrPAC_PV/M1=0xF3;/*stc12c5a60s2*///PCAPWM

sfrCH=0xF9;/*stc12c5a60s2*/

sfrCCAPOH=0xFA;/*stc12c5a60s2*/

sfrCCAP1H=0xFB;/*stc12c5a60s2*/

/*BITRegisters*/

/*CCON*/

sbitCF二CCON'7;

sbitCR二CCON%;

sbitCCF1二CCONF;

sbitCCFO=CCON"O;

#endif

LCD1603显示程序文件:

#include""

#include""

#incIude""

#incIude""

bitLCD_Check_Busy(void)

u8result;

EN=O;

DataPort=OxFF;

D_C=O;

R_W=1;

deIay_ms(1);

EN=1;

result=(DataPort&0x80);

EN=O;

returnresuIt;

)

voidLCD_Write_Comm(u8comm)

(

while(LCD_Check_Busy());

EN=O;

D_C=O;

R_W=O;

EN=1;

deIay_ms(1);

DataPort=comm;

EN=O;

I

voidLCD_Write_Data(u8dat)

{

while(LCDCheckBusy());

EN=O;

D_C=1;

R_W=0;

EN=1;

deIay_ms(1);

DataPort=dat;

EN=O;

)

voidLCD_Write_Char(u8x,u8y,u8Data)

(

switch(y)

(

case1:LCD_Write_Comm(0x80+x);

break;

case2:LCDWrite_Comm(OxCO+x);

break;

case3:LCD_Write_Comm(0x90+x);

break;

case4:LCD_Write_Comm(OxDO+x);

break;

)

LCD_Write_Data(Data);

)

voidLCD_Write_String(u8x,u8y,u8*s)

(

switch(y)

(

case1:LCD_Write_Comm(0x80+x);

break;

case2:LCD_Write_Comm(OxCO+x);

break;

case3:LCD_Write_Comm(0x90+x);

break;

case4:LCDWrite_Comm(OxDO+x);

break;

)

while(*s)

(

LCD_Write_Data(*s);

s++;

1

)

voidLCD_Write_Number(u8x,u8y,u32number,u8Nbit)

(

u8dat,ten,hun,thutenthu,hunthu;

hunthu=48+(number/100000);

tenthu=48+(number%100000/10000);

thu=48+(number%10000/1000);

hun=48+(number%1000/100);

ten=48+(number%100/10);

dat=48+(number%10);

switch(y)

(

case1:LCD_Write_Comm(0x80+x);

break;

case2:LCD_Write_Comm(OxCO+x);

break;

case3:LCDWrite_Comm(0x90+x);

break;

case4:LCD_Write_Comm(OxDO+x);

break;

1

J

switch(Nbit)

(

case6:

LCD_Write_Data(hunthu);

LCD_Write_Data(tenthu);

LCD_Write_Data(thu);

LCD_Write_Data(hun);

LCDWrite_Data(ten);

LCDWriteData(dat);

break;

case5:

LCD_Write_Data(tenthu);

LCD_Write_Data(thu);

LCD_Write_Data(hun);

LCD_Write_Data(ten);

LCD_Write_Data(dat);

break;

case4:

LCD_Write_Data(thu);

LCD_Write_Data(hun);

LCDWrite_Data(ten);

LCDWrite_Data(dat);

break;

case3:

LCDWriteData(hun);

LCD_Write_Data(ten);

LCD_Write_Data(dat);

break;

case2:

LCD_Write_Data(ten);

LCD_Write_Data(dat);

break;

case1:

LCDWriteData(dat);

break;

)

)

voidLCD_CIear(void)

LCD_Write_Comm(0x01);

deIay_ms⑴;

voidLCD_lnit(void)

(

LCD_Write_Comm(0x01);

deIay_ms(1);

LCD_Write_Comm(0x02);

deIay_ms(1);

LCD_Write_Comm(0x38);

delay_ms(1);

LCDWriteComm(0x00);

deIay_ms(1);

LCDWriteComm(0x06);

deIay_ms(1);

LCD_Write_Comm(0x80);

deIay_ms(1);

LCD_Write_Data(OxFF);

deIay_ms(1);

LCD_Write_Data(OxFF);

deIay_ms⑴;

LCD_Write_Comm(0x8E);

deIay_ms(1);

LCD_Write_Data(OxFF);

delay_ms(1);

LCD_Write_Data(OxFF);

delay_ms(1);

)

#ifndef_1603_H_

#define_1603_H_

sbitbuzz=P2-3;

sbitD_C=pro;

sbitR_W=pri;

sbitEN=P2-5;

#defineDataPortPO

bitLCD_Check_Busy(void);

voidLCD_V/rite_Comm(u8comm);

voidLCD_V/rite_Data(u8dat);

voidLCD_V/rite_Char(u8x,u8y.u8Data);

voidLCD_Write_String(u8x,u8y,u8*s);

voidLCD_Write_Number(u8x,u8y,u32number,u8Nbit);

voidLCD_Clear(void);

voidLCD_lnit(void);

串行口程序文件:

#endif

#include""

#incIude""

#incIude""

u8receive;

u16n;

u8flagR;

u8stopF;

voidCOMInit(u16bps)

(

u8s;

EA=0;

if(bps>=19200)

(

PC0N|=0x80;

s=1;

)

eIse

(

PC0N&=0x7F;

s=0;

}

SC0N=0x50;

TM0D=0x20;

TH1=256-(28800*(s+1))/bps;

TL1=256-(28800*(s+D)/bps;

REN=1;

ES=1;

EA=1;

TR1=1;

)

voidserial()interrupt4

(

if(Tl!=0)

(

TI=0;

flagR=1;

)

else

(

if(RI!=0)

(

receive=SBUF;

P1=receive;

if(receive==OxFF)

stopF=1;

1

eIse

(

if(receive==0x5A)

(

stopF=0;

)

)

RI=O;

)

)

1

#ifndef_COM_H_

#define_COM_H_

voidCOMInit(u16bps);

#endif

自定义变量类型文件:

#ifndef_DEFINE_H_

#define_DEFINE_H_

#defineu8unsignedchar

#defineu16unsignedint

#defineu32unsignedlong

#endif

各种延时函数文件:

#include""

#incIude""

voiddelay_us(u16xus)

(

xus=2*xus;

whiIe(xus―);

)

voiddelay_ms(u16xms)

(

inti,j;

for(i=xms;i>0;i-)

(

for(j=110;j>0;j—);

)

)

#ifndefDELAYH

#define_DELAY_H_

voiddelay_us(u16xus);

voiddelay_ms(u16xms)

各个外设中断服务函数文件:

#ifndef_IRQ_H_

#define_IRQ_H_

#incIude""

#include""

u8key_flag=0;

u8receive=0;

floatjuli;

u16T;

u8T1_Count=0;

bitT1_F=0;

voidIntO_Routine(void)interrupt0

(

if(IE0)

(

deIay_ms(800);

if(IE0)

(

key_flag++;

I

voidInt1Routine(void)interrupt2

(

T=(TH1*256+TL1);

TH1=0;

TL1=0;

juli=((fIoat)T1_Count)*+*((float)T);

LCD_Write_Number(02,juli,5);

T1_Count=0;

T1_F=1;

)

voidTimer1_Routine(void)interrupt3

{

T=(TH1*256+TL1);

TH1=0;

TL1=0;

T1_Count++;

)

voidUART_Routine(void)interrupt4

if(TI)

TI=O;

)

eIse

(

if(RI)

(

receive=SBUF;

RI=O;

)

)

1

#endif

脉宽测量初始化文件:

#include<>

#incIude""

#incIude""

#include""

#include""

voidcapture_init(void)

(

TM0D|=0x90;

TH1=0;

TL1=0;//

TR1=1;

EX1=1;

IT1=1;

)

#ifndef_CAPTURE_H_

#define_CAPTURE_h_

sbitchufa=P2'1;

voidcapture.init(void);

#endif

舵机控制文件:

#incIude""

#include"

#include"

#include""

voidInit_SteerPWM(void)

TM0D|=0x02;

TH0=0xB7;

TL0=0xB7;

TR0=1;

CM0D=0x04;

CL=OxOO;

CH=OxOO;

CCAPM0=0x42;

CCAPM1=0x42;

CCAPOH=home;

CCAPOL=home:

CCAP1H=home;

CCAP1L=home;

CR=1;//ZEd』-PCA

)

voidsteer(u8Mod,u8Num,intdegree)

(

doubleduty;

if(Mod)//%C』E

(

duty=+*((doubIe)degree);

if(duty>29)

(

duty=29;

I

else

(

if(duty<7)

(

duty=7;

)

)

if(Num-1)

(

CCAP0H=(int)duty;

CCAP0L=(int)duty;

LCDWriteNumber(0,3,duty,3);

)

if(Num==2)

CCAP1H=(int)duty;

CCAP1L=(int)duty;

LCD_Write_Number(4,3,duty,3);

}

else

(

if(degree>29)

(

degree=29;

)

else

(

if(degree<7)

1

degree=7;

)

)

if(Num==1)

(

CCAPOH=deg<ee;

CCAPOL=deg<ee;

LCD_Write_Number(0,3,duty,3);

)

if(Num=2)

(

CCAP1H二degree;

CCAP1L=deg-ee;

LCD_Write_Number(4,3,duty,3);

)

)

1

#ifndef_STEER_H_

#define_STEER_H_

#incIude""

#defineCryOsc

#defineSteerCycle50

#definehome0x13

voidInit_SteerPWM(void);

voidsteer(u8Mod,u8Num,intdegree);

#endif

电机控制文件:

#include""

#include""

#incIude""

#incIude""

sbitmotorIO=P1"2;

voidInit_PWM(void)

(

CM0D=0x08;

CL=0x00;

CH=0x00;

CCAPM0=0x42;

CCAPM1=0x42;

CR=1;

)

voidforward(u8duty)

{

CCAPOH=duty;

motor10=0;

1

voidstop(void)

(

CCAP0H=0;

motor10=0;

)

voidback(u8duty)

{

CCAP0H=256-duty;

motor10=1;

)

#ifndef

力define

voidInit_PWM(void);

voidforward(u8duty);

voidstop(void);

voidback(u8duty);

#endif

主机的主函数文件:

#incIude""

#include""

#incIude""

#incIude""

#incIude""

#include""

#include""

#include""

#incIude""

voidsystem_init(void)

EA=O;

LCD_lnit();

COMInitO;

IRQ_lnit();

capture_init();

lnit_SteerPWM();

EA=1;

)

voidmain(void)

(

u8i,cIoseN=0,fitN=O,remoteN=0;

floatxdatatern[5];

u32_lxdatadistance[22];

u8xdataclose[22]xdatafit[22],xdataremote[22];

systeminit();

whiIe(1)

(

if(key_fIag)

(

buzz=0;

deIay_ms(500);

buzz=1;

deIay_ms(500);

buzz=0;

deIay_ms(500);

buz2=1;

deIay_ms(500);

buzz=0;

deIay_ms(500);

buzz=1;

deIay_ms(500);

buzz=0;

deIay_ms(500);

buzz=1;

deIay_ms(500);

break;

)

)

while(1)

clos

温馨提示

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

最新文档

评论

0/150

提交评论