自动避障小车课程设计汇本

上传人:馨*** 文档编号:157039146 上传时间:2022-09-28 格式:DOC 页数:30 大小:127.50KB
收藏 版权申诉 举报 下载
自动避障小车课程设计汇本_第1页
第1页 / 共30页
自动避障小车课程设计汇本_第2页
第2页 / 共30页
自动避障小车课程设计汇本_第3页
第3页 / 共30页
资源描述:

《自动避障小车课程设计汇本》由会员分享,可在线阅读,更多相关《自动避障小车课程设计汇本(30页珍藏版)》请在装配图网上搜索。

1、 .wd.单片机系统课程设计成绩评定表设计课题: 自动避障小车学院名称:电气工程学院专业班级:自动1105学生姓名:学号:指导教师:设计地点 :31-630设计时间 :指导教师意见:成绩: 签名: 年 月 日单片机系统课程设计 课程设计名称:自动避障小车专业班级:自动1105学生姓名:学号:指导教师:课程设计地点:31-630课程设计时间: 单片机系统课程设计任务书学生姓名专业班级学号题 目自动避障小车课题性质产品设计课题来源自拟指导教师主要内容参数利用增强版51MCU设计一个自动避障小车,实现以下功能:1、自主判别障碍,自动避开障碍;2、识别出多障碍区和空旷区;3、能在空旷区快速行进,在多障

2、碍区适当速度行进。任务要求进度第1天:熟悉课程设计任务及要求,查阅技术资料,确定设计方案。第2-5天:按照确定的方案设计电路。画出总体电路图,而且选好各个元件的参数、数量类型。然后由原理图生成PCB,用热转印法腐蚀这个电路板。 第6-7天:构建硬件系统,并且测试确认都可以正常工作。之后完成机械局部和硬件局部的搭建。第8-11天:编写程序,设计软件,并且开场撰写课程设计报告。第12-13天:整体调试,逐步完善。第14天:完成课程设计报告。主要参考资料【1】张迎新单片微型计算机原理、应用及接口技术第2版M北京:国防工业出版社,2004【2】单片机程序设计实例清华大学出版社【3】 单片机应用设计20

3、0例【4】单片机程序设计及应用李华军,电子工业出版社审查意见系教研室主任签字: 年 月 日 目录1概述41.1研究背景41.2设计思想及 根本功能42总体方案设计42.1方案论证42.2系统框图52.3总体方案设计63硬件电路设计73.1电源电路83.2晶振电路93.3复位电路103.4键盘电路103.5显示电路113.6超声波测距电路123.7舵机电路133.8电机驱动电路143.9电机转速测量电路133.10设计PCB和腐蚀电路板144系统软件设计164.1分模块程序设计174.2主程序设计205系统调试226总结22参考文献:23附录A硬件电路图24附录B 源程序251概述1.1研究背景

4、科技的开展趋势之一就是让几乎所有的东西具有一定的智能。这样的智能一方面可以防止人的复杂性带来的错误,另一方面,作为人的能力的延伸,快速、便捷地适应环境。本文研究的超声波自动避障小车,就是让小车具有一定的智能,可以作为有人驾驶车辆的一局部,帮助司机及早发现司机还未觉察的危险。另外,可以应用在无人控制系统里,代替人类完成信息接收、处理和判断。那么这样它还有更广阔的应用和开展空间。这个月我国嫦娥三号载着玉兔号月球车踏上了月球,已经开场探索活动。玉兔号月球车可以自动寻找有价值的目标,自动避开障碍物,自动寻找最优路径等等,这些功能在原理上都差不多,只是所用仪器以及控制算法的不同。1.2设计思想及 根本功

5、能小车设计的 根本思路是:不断扫描前方180左右的水平面内的物体,根据反响的距离和方位信息确定前方的地形是开阔还是多障碍。然后根据这些信息通过路径最优算法选择前进方向。小车的 根本功能是识别空旷区和多障区;自动避开障碍物;能够在空旷区快速行驶。2总体方案设计2.1方案论证首先是测距方案:方案一:激光测距优点:测速快,适应范围广,准确;不过相对于自动避障小车系统,有点大材小用。激光测距是点对点的测距,一般进展远距离测距比拟准确。如是近距离激光测距,必须要涉及到微小时间测量,51MCU无法胜任。因此激光测距方案否认。方案二:超声波测距优点:构造简单,本钱低,便于与MCU联机工作。测量范围从5CM到

6、几百米的距离内精度在毫米级。尽管它测量的是点到面的距离,但是定向性满足本小车系统的要求。而且,数据处理简单。可以考虑。方案三:雷达测距不太现实,受到本人技术水平限制,无法驾驭雷达测距系统,此外,雷达应用于较大范围的测量和监控,如果用于本小车,同样涉及到微小时间测量,以及雷达数据处理,51MCU难以胜任。否认!方案四:红外线测距优点:技术难度低,数据处理简单,但是测量开关信号比拟好,测量连续信号不够准确。测量的精度有点低。因此不是一种较好的测距方法。综合各因素,选用超声波测距。其次是微控制器的选择:可选的微控制器有:系列的STC89C52RC、STC12C5A60S2;公司的MSP430G255

7、3;飞思卡尔的MC9S12XS128MAL;意法的STM32F407-Discovery;这些玩儿过一点,而且最小系统板手边都有根据本系统的需求,需要两路同频率50hz的PWM控制两个舵机、一路PWM频率约几千赫兹控制电机、三个个定时器做脉冲捕捉、至少两个外部中断输入、一个并行6800总线接口。除了系列的两款,其他一片足以胜任。而且对于意法的F407显得大材小用。飞思卡尔的S12比拟适宜;TI的G2553的引脚有点少20个,外围电路设计的会复杂一点,本钱也会高一点。60S2用两片比拟适宜; 用89C52比拟麻烦,两片也不够。根据个人能力,以及时间和进度方面考虑选用60S2,60S2呢,它的资源

8、有:完全兼容51 的两个定时器T0、T1和两个外部中断;两路拥有独立波特率的串行口;一个PCA定时器,可产生两路同频的PWM;八个10位精度的AD 转换通道; 一个硬件SPI接口。2.2系统框图系统框图如图2.2所示图2.2系统框图2.3 总体方案设计两片60S2一个做主机,一个做从机,通过串行口通信,传递数据。主机用到的功能有:()、定时器T1和外部中断INT1,作用是:测脉宽,用到的IO是P33;P20作为超声波测距模块的触发功能引脚;()、定时器T0和PCA产生两路同频率的PWM,作用是:T0的溢出率作为PCA的计数脉冲产生50HZ的PWM控制两路舵机。使用T0作为PCA的时钟源,可以通

9、过改变T0的溢出率改变输出的频率。用到的IO是P13和P14;()、外部中断INT0接一个按键。()、串口一使用独立波特率发生器,与从机通P30和P31;()、并行数据接口:P0口作为6800并行总线的数据总线P27、P26和P25作为控制总线,分别为:EN总使能、RW读写控制、CD命令数据控制;地址总线CS接地,一直处于选通状态。从机用到的功能:()、串行口一使用独立波特率发生器P30和P31与主机通讯;()、PCA产生一路PWM,P12共同控制电机速度。()、定时器T0和T1作为编码器脉冲计数和测脉宽使用,测量电机的转速。3硬件电路设计首先是单片机的最小系统如图3.1、3.2所示图3.1

10、单片机的最小系统图3.2 单片机的最小系统然后是各个模块电路:3.1电源电路本系统由7.5V可充电电池供电,由开关电源LM2596转换成5V电压给单片机和测距模块供电。出于对系统的稳定性、可靠性和本钱的考虑,选用了开关电源模块作为转换电路。电源局部电路如图3.3图3.3电源局部电路图3.4电源模块实物3.2晶振电路虽然60S2内部有RC振荡电路作为时钟电路的输入源,但是外部连接一个无源晶振电路,可以使单片机的时钟频率更稳定,因而工作更可靠。电路参数:四个电容均为22PF,作为石英晶振频率的微调。石英晶振的频率为12MHZ。3.3复位电路复位电路是单片机必不可少的 根本电路,在调试阶段,可以按下

11、复位按键,使复位引脚保持两个机器周期的低电平,就可以使单片机内部所有电路初始化。电路参数:电容1UF只要保证电容的时间常数大于两个机器周期即可。电阻值为1K欧。3.4键盘电路键盘电路如图3.5所示图3.5键盘电路可以利用外部中断法或查询法检测按键是否按下。这里都采用外部中断的方法检测。3.5显示电路显示电路如图3.6所示图3.6显示电路采用1603液晶屏显示数字和字符。1603与1602的硬件接口完全一样。不同之处在于1603的RAM区的内容可以全部同时显示在屏幕上,没有屏幕内容的位移切换。可以显示四行。状态指示灯如图3.7所示图3.7 状态指示灯这几个LED灯是作为状态指示用的,方便调试。3

12、.6超声波测距电路超声波测距模块如图3.8所示图3.8超声波测距模块这是超声波模块的接口电路。这个超声波的工作原理是:(1)采用 IO 触发测距,给至少 10us 的高电平信号;(2)模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;(3)有信号返回,通过 IO 输出一高电平,高电平持续的时间就是(4)超声波从发射到返回的时间测试距离=(高电平时间*声速(340M/S)/2;超声波模块测距工作时序图:触发信号由单片机产生一个宽度大于10US的高脉冲,触发模块工作一次:_|_|模块内部发出的信号循环发出8个40KHZ的脉冲:_|_|_|_|_|_|_|_|_输出回响信号回响信号的

13、高电平持续时间正比于检测的距离:_|_3.7舵机电路舵机电路如图3.9所示图3.9舵机电路舵机驱动电路。舵机接口是信号线、电源正、地。信号线一般可以直接接到单片机的IO上,但是接多了就不行了,电流太大。这里用了一级三极管驱动。通常用的这种舵机,控制信号是一个周期为20ms占空比在2.5%12.5%之间的PWM信号,分别对应舵机的控制角为0180之间。舵机本身有反响调节,因此,单片机给出一个占空比,舵机就到某一个角度。3.8电机驱动电路电机驱动电路如图3.10所示图3.10电机驱动模块电机的控制采用的是L298N全桥驱动电路。驱动电路如图3.11所示图3.11 驱动电路电机正反转原理:IO: _

14、|电流流向:PWM:|_|_|_|_|_|_|_|_|_|_|_|_ |假设此时电机正转| 该时刻电机反转|3.9电机转速测量电路电机转速测量电路如图3.12所示图3.12电机转速测量电路编码器输出信号:AB两相输出矩形正交脉冲,电路输出为NPN集电极开路输出型,此种输出类型可以和带内部上拉电阻的单片机。接线方式:黄=A相,蓝=B相,红=Vcc正电源,黑=V0地。 编码器输出信号图如图3.13所示图3.13信号图3.10设计PCB和腐蚀电路板这是原始的PCB图和单面的腐蚀电路板,红色的TOPLAYER层作为跳线。PCB如图3.14所示图3.14 PCB图图3.15打印PCB负片图图3.16腐蚀

15、效果图4系统软件设计主程序的流程图如图4.1所示。图4.1主程序流程图主程序流程说明:电路主要分为以下几个局部,分别是电源局部、显示局部、按键局部、步进电机控制局部、超声波检测模块、舵机模块、单片机主控器件局部,各局部具有不同的子程序。系统初始化流程如图4.2所示:图4.2 系统初始化流程图4.1分模块程序设计4.1.1键盘程序小车系统需要的按键不多,有两个,采用中断法。在系统中的作用是启动小车。4.1.2舵机驱动程序和电机驱动程序控制原理局部在表达硬件时已介绍。这里说说具体怎么实现。产生50HZ的PWM控制舵机:时钟频率Fosc=11059200HZ,定时器T0的溢出率Ft0作为PCA定时器

16、的时钟输入。60S2工作在51模式下。设TO的初值为X,自动重装模式,T0、PCA均无中断。计算方法为:X*(12/Fosc)*256=0.02s可以得出X=72,TH0=0xB7。再计算占空比:PCA的中心计数器每72*12/Fosc秒记一个数,记256个数即一个八位计数器溢出再从零开场。比拟存放器的取值是:256*0.025和256*0.125之间,对应的转角在0到180度。在实际情况下,舵机不够精细,最大旋转角没有180度,而且比拟存放器只能比拟写入整数。实际的取值为729,控制方向的舵机取值为1721分级明显,转向不够舒畅啊。电机的频率没有严格的要求,因此,选用简单的处理:对时钟进展2

17、56*12分频,是3.6KHZ。4.1.3超声波测距程序超声波测距实现原理就是测量高电平脉冲持续的时间。用到了51定时器启停由外部控制的功能。GATE=1,TRn=1,定时器由外部中断引脚电平控制,上升沿之后开场计数,下降沿之后停顿计数。同时翻开相应的外部中断,在下降沿到来后进入外部中断服务程序,记录停顿计数时的数值。这里应当注意一个问题是:如果测量的距离较远,定时器可能就溢出了,对这个不处理,结果将是错误的。因此同时开启定时器中断,在溢出时,记下溢出的次数。距离的计算方法是:距离=【Number*(12/Fosc)+N*65536*(12/Fosc)】/2void Int1_Routine(

18、void) interrupt 2T=(TH1*256+TL1);TH1=0;TL1=0;juli=(float)T1_Count)*11141.12+0.1844618*(float)T);LCD_Write_Number(0,2,juli,5);T1_Count=0;T1_F=1;4.2主程序设计主程序里主要是避障程序。我的思路是,把区域三局部:近距离20CM以内,适中区域20CM150CM,远距离150CM以外。得到22组数据后首先是根据区域分类,然后记各区域的角度大小,当远距离的角度范围最大时,判断为空旷区,其他是多障碍区。然后根据角度大小排序,当适中区最大时,走的方向为适中区集中的方

19、向。当最大区域为近距离或远距离时,走远距离区,具体方向为最远点方向。速度总是由最近的障碍物距离计算得出。5系统调试首先是分模块调试。把各个模块的功能分开实现。然后是局部的组合到一起使用,如超声波测距和1603显示、两路舵机同时控制。在软件调试的时候,出现了RAM区不够用。原因出在避障算法上。定义的数组多,而且长。用户128RAM不够用。可以有两个解决方法:一是改良代码,使用指针;二是扩展RAM区。考虑到代码优化不是一天两天就弄好的,而且我的C语言编程水平实在浅薄,指针依然是用不好,一用就报错。那只好扩展RAM。查查60S2的数据手册,它取消了外部扩展RAM和ROM的功能,但是内部增加了1的RA

20、M,用法是在定义变量时,加前缀“XDATA,告诉编译器把后面的变量定义在扩展RAM区。此外我还了解到“DATA、“PDATA、“IDATA都是51系统编译器允许的关键字,具体的解释是:dATa: 固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 idATa: 固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全一样,只是因为访问的方式不同。idATa是用类似C中的指针方式 访问的。汇编中的语句为:mox ACC,Rx.(不重要的补充:c中idATa做指针式的访问效果很好) xdATa: 外部扩展RAM,一般指外部0x

21、0000-0xffff空间,用DPTR访问。 pdATa: 外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,Rx读写。硬件方面的调试主要在模块调试方面。因为 根本上都用的现有的模块电路,自己设计的电路 根本没有自己还差的很远唉!,没有什么难的。小车主板:图5.1小车主板整车图片:图5.2 整车鸟瞰图6总结两周的单片机课程设计很快就完毕了,但是在进军单片机领域,这仅仅是个开场。学习单片机最重要的是实践。要投入必要的本钱。一块开发板必不可少,还有一大堆配套的硬件软件。作为有志于今后继续在单片机方面开展的我,学会使用51单片机,远远不够,世界上51系列占的市场份额

22、并不多。流行的单片机,其功能远远好于51,因此,学习51单片机重点在于利用它简单易学的特点掌握单片机的各种通用性的东西,深刻理解和掌握它的工作原理和使用方式,这样可以快捷的掌握其他单片机的使用。把单片机作为改变生活的万能工具。学习单片机,离不开编程,离不开软件。语言作为一种高级语言,与硬件联系严密。因此在单片机领域, 根本都用的是语言。灵活运用语言,对单片机学习带来极大的便利。今后还得继续深入学习语言。还有一点,非常重要,把软件工程的思想融入到单片机的编程中。比方分层和封装思想。这个课程设计中所有的程序,并不是都在这两周写的,有一些以前玩过类似的模块,当然有可靠地例程,在这里,修改一下硬件接口

23、,修改一下工作方式,就可以用了。由此看出,单片机学习是可以积累的。除了掌握大量的知识,还有个人的单片机例程、软件、电路设计库,这样会越来越容易。参考文献:【1】单片微型计算机原理、应用及接口技术第2版张迎新M北京:国防工业出版社,2004【2】 夏路易 石宗义Protel 99se电路原理图与电路板设计教程北京:北京希望电子出版社,2004【3】单片微型计算机原理、应用及接口技术第2版张迎新M北京:国防工业出版社,2004【4】宏晶STC12单片机技术手册附录A硬件电路图图A.1整车鸟瞰图附录B 源程序 工程文件构造:图B.1整车鸟瞰图STC12C5A60S2增加的特殊功能存放器与地址的映射:

24、#ifndef _REG52_H_#define _REG52_H_/* BYTE Registers */sfr AUXR = 0x8E;/*stc12c5a60s2*/sfr WAKE_CLK0=0x8F;/*stc12c5a60s2*/sfr P1M1 = 0x91;/*stc12c5a60s2*/sfr P1M0 = 0x92;/*stc12c5a60s2*/sfr P0M1 = 0x93;/*stc12c5a60s2*/sfr P0M0 = 0x94;/*stc12c5a60s2*/sfr P2M1 = 0x95;/*stc12c5a60s2*/sfr P2M0 = 0x96;/*s

25、tc12c5a60s2*/sfr CLK_DIV=0x97;/*stc12c5a60s2*/Clock Divdersfr S2CON = 0x9A;/*stc12c5a60s2*/sfr S2BUF = 0x9B;/*stc12c5a60s2*/sfr BRT = 0x9C;/*stc12c5a60s2*/sfr BUS_SPEED=0xA1;/*stc12c5a60s2*/sfr AUXR1 = 0xA2;/*stc12c5a60s2*/sfr IE2 = 0xAF;/*stc12c5a60s2*/sfr P3M1 = 0xB1;/*stc12c5a60s2*/sfr P3M0 = 0xB

26、2;/*stc12c5a60s2*/sfr P4M1 = 0xB3;/*stc12c5a60s2*/sfr P4M0 = 0xB4;/*stc12c5a60s2*/sfr IP2 = 0xB5;/*stc12c5a60s2*/sfr IP2H = 0xB6;/*stc12c5a60s2*/sfr IPH = 0xB7;/*stc12c5a60s2*/Interrupt Priority Highsfr P4SW = 0xBB;/*stc12c5a60s2*/P4 I/O Switchsfr ADC_CONTR=0xBC;/*stc12c5a60s2*/sfr ADC_RES=0xBD;/*st

27、c12c5a60s2*/sfr ADC_RESL=0xBE;/*stc12c5a60s2*/A/D Result Lowsfr P4 = 0xC0;/*stc12c5a60s2*/P4 I/Osfr WDT_CONTR=0xC1;/*stc12c5a60s2*/Watch-Dog-Timer Cotrol Registersfr IAP_DATA=0xC2;/*stc12c5a60s2*/ISP/IAP Flash Data Registersfr IAP_ADDRH=0xC3;/*stc12c5a60s2*/ISP/IAP Flash Address Highsfr IAP_ADDRL=0x

28、C4;/*stc12c5a60s2*/ISP/IAP Flash Address Lowsfr IAP_CMD= 0xC5;/*stc12c5a60s2*/ISP/IAP Flash Command Registersfr IAP_TRIG=0xC6;/*stc12c5a60s2*/ISP/IAP Flash Command Triggersfr IAP_CONTR=0xC7;/*stc12c5a60s2*/ISP/IAP Control Registersfr P5 = 0xC8;/*stc12c5a60s2*/P5 I/Osfr P5M1 = 0xC9;/*stc12c5a60s2*/sf

29、r P5M0 = 0xCA;/*stc12c5a60s2*/sfr TL2 = 0xCC; /*8052*/sfr SPSTAT= 0xCD;/*stc12c5a60s2*/SPI Control Registersfr SPCTL = 0xCE;/*stc12c5a60s2*/SPI Status Registersfr SPDAT = 0xCF;/*stc12c5a60s2*/SPI Data Registersfr CCON = 0xD8;/*stc12c5a60s2*/PCAsfr CMOD = 0xD9;/*stc12c5a60s2*/PCAsfr CCAPM0= 0xDA;/*st

30、c12c5a60s2*/PCAsfr CCAPM1= 0xDB;/*stc12c5a60s2*/PCAsfr CL = 0xE9;/*stc12c5a60s2*/sfrCCAP0L= 0xEA;/*stc12c5a60s2*/sfrCCAP1L= 0xEB;/*stc12c5a60s2*/sfr PAC_PWM0=0xF2;/*stc12c5a60s2*/PCA PWMsfr PAC_PWM1=0xF3;/*stc12c5a60s2*/PCA PWMsfr CH = 0xF9;/*stc12c5a60s2*/sfr CCAP0H= 0xFA;/*stc12c5a60s2*/sfr CCAP1H

31、= 0xFB;/*stc12c5a60s2*/* BIT Registers */*CCON*/sbit CF =CCON7;sbit CR =CCON6;sbit CCF1 =CCON1;sbit CCF0 =CCON0;#endifLCD1603显示程序文件:#includereg52.h#includedefine.h#includedelay.h#include1603.hbit LCD_Check_Busy(void) u8 result;EN=0;DataPort= 0xFF; D_C=0; R_W=1;delay_ms(1); EN=1;result=(DataPort & 0x

32、80);EN=0;return result;void LCD_Write_Comm(u8 comm) while(LCD_Check_Busy();EN=0;D_C=0; R_W=0; EN=1; delay_ms(1);DataPort=comm; EN=0;void LCD_Write_Data(u8 dat) while(LCD_Check_Busy();EN=0;D_C=1; R_W=0; EN=1; delay_ms(1);DataPort=dat; EN=0;void LCD_Write_Char(u8 x,u8 y,u8 Data) switch(y)case 1:LCD_Wr

33、ite_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x90+x); break;case 4:LCD_Write_Comm(0xD0+x); break; LCD_Write_Data(Data); void LCD_Write_String(u8 x,u8 y,u8 *s) switch(y)case 1:LCD_Write_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x

34、90+x); break;case 4:LCD_Write_Comm(0xD0+x); break; while(*s) LCD_Write_Data(*s); s+; void LCD_Write_Number(u8 x,u8 y,u32 number,u8 Nbit) u8 dat,ten,hun,thu,tenthu,hunthu;hunthu=48+(number/100000);tenthu=48+(number%100000/10000);thu=48+(number%10000/1000);hun=48+(number%1000/100);ten=48+(number%100/1

35、0);dat=48+(number%10);switch(y)case 1:LCD_Write_Comm(0x80+x);break;case 2:LCD_Write_Comm(0xC0+x);break;case 3:LCD_Write_Comm(0x90+x); break;case 4:LCD_Write_Comm(0xD0+x); break;switch (Nbit)case 6:LCD_Write_Data(hunthu);LCD_Write_Data(tenthu);LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(te

36、n);LCD_Write_Data(dat);break;case 5:LCD_Write_Data(tenthu);LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 4:LCD_Write_Data(thu);LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 3:LCD_Write_Data(hun);LCD_Write_Data(ten);LCD_Write_Data(

37、dat);break;case 2:LCD_Write_Data(ten);LCD_Write_Data(dat);break;case 1:LCD_Write_Data(dat);break;void LCD_Clear(void) LCD_Write_Comm(0x01); delay_ms(1);void LCD_Init(void) LCD_Write_Comm(0x01); delay_ms(1);LCD_Write_Comm(0x02);delay_ms(1);LCD_Write_Comm(0x38);delay_ms(1); LCD_Write_Comm(0x0C);delay_

38、ms(1); LCD_Write_Comm(0x06); delay_ms(1);LCD_Write_Comm(0x80); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1);LCD_Write_Comm(0x8E); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1);LCD_Write_Data(0xFF); delay_ms(1); #ifndef _1603_H_#define _1603_H_sbit buzz=P23;sbit D_C

39、= P10;sbit R_W= P11;sbit EN = P25;#define DataPort P0bit LCD_Check_Busy(void);void LCD_Write_Comm(u8 comm);void LCD_Write_Data(u8 dat);void LCD_Write_Char(u8 x,u8 y,u8 Data);void LCD_Write_String(u8 x,u8 y,u8 *s);void LCD_Write_Number(u8 x,u8 y,u32 number,u8 Nbit);void LCD_Clear(void);void LCD_Init(

40、void);串行口程序文件:#endif#includereg52.h#includedefine.h#includedelay.hu8 receive;u16 n;u8 flagR;u8 stopF;void COMInit(u16 bps)u8 s;EA=0;if(bps=19200)PCON|=0x80;s=1;elsePCON&=0x7F;s=0;SCON=0x50; TMOD=0x20; TH1=256-(28800*(s+1)/bps; TL1=256-(28800*(s+1)/bps;REN=1;ES=1;EA=1;TR1=1; void serial() interrupt 4

41、 if(TI!=0)TI=0;flagR=1;elseif(RI!=0)receive=SBUF;P1=receive;if(receive=0xFF)stopF=1;elseif(receive=0x5A)stopF=0;RI=0; #ifndef _COM_H_#define _COM_H_void COMInit(u16 bps);#endif自定义变量类型文件:#ifndef _DEFINE_H_#define _DEFINE_H_#define u8 unsigned char#define u16 unsigned int#define u32 unsigned long#endi

42、f各种延时函数文件:#includedefine.h#includedelay.hvoid delay_us(u16 xus)xus=2*xus;while(xus-);void delay_ms(u16 xms)int i,j;for(i=xms;i0;i-)for(j=110;j0;j-);#ifndef _DELAY_H_#define _DELAY_H_void delay_us(u16 xus);void delay_ms(u16 xms)各个外设中断服务函数文件:#ifndef _IRQ_H_#define _IRQ_H_#includedefine.h#include1603.h

43、u8 key_flag=0;u8 receive=0;float juli;u16 T;u8 T1_Count=0;bit T1_F=0;void Int0_Routine(void) interrupt 0if(IE0)delay_ms(800);if(IE0)key_flag+;void Int1_Routine(void) interrupt 2T=(TH1*256+TL1);TH1=0;TL1=0;juli=(float)T1_Count)*11141.12+0.1844618*(float)T);LCD_Write_Number(0,2,juli,5);T1_Count=0;T1_F

44、=1;void Timer1_Routine(void) interrupt 3T=(TH1*256+TL1);TH1=0;TL1=0;T1_Count+;void UART_Routine(void) interrupt 4 if(TI)TI=0;elseif(RI)receive=SBUF;RI=0; #endif脉宽测量初始化文件:#include#includedefine.h#includedelay.h#include1603.h#includecapture.hvoid capture_init(void)TMOD|=0x90;TH1=0;TL1=0;/TR1=1;EX1=1;I

45、T1=1;#ifndef _CAPTURE_H_#define _CAPTURE_h_sbit chufa=P21;void capture_init(void);#endif舵机控制文件:#includedelay.h#include1603.h#includeexternIRQ.h#includesteer.hvoid Init_SteerPWM(void)TMOD|=0x02;TH0=0xB7;TL0=0xB7;TR0=1;CMOD=0x04;CL=0x00;CH=0x00;CCAPM0=0x42;CCAPM1=0x42;CCAP0H=home;CCAP0L=home;CCAP1H=ho

46、me;CCAP1L=home;CR=1;/PCAvoid steer(u8 Mod,u8 Num,int degree)double duty;if(Mod)/duty=19.2+0.14222*(double)degree);if(duty29)duty=29;elseif(duty29)degree=29;elseif(degree7)degree=7;if(Num=1)CCAP0H=degree;CCAP0L=degree;LCD_Write_Number(0,3,duty,3);if(Num=2)CCAP1H=degree;CCAP1L=degree;LCD_Write_Number(

47、4,3,duty,3);#ifndef _STEER_H_#define _STEER_H_#includedefine.h#define CryOsc 11059200#define SteerCycle 50#define home 0x13 void Init_SteerPWM(void);void steer(u8 Mod,u8 Num,int degree);#endif电机控制文件:#includeREG52.h#includedefine.h#includedelay.h#includePWM.hsbit motorIO=P12;void Init_PWM(void)CMOD=0

48、x08;CL=0x00;CH=0x00;CCAPM0=0x42;CCAPM1=0x42;CR=1;void forward(u8 duty)CCAP0H=duty;motorIO=0;void stop(void)CCAP0H=0;motorIO=0;void back(u8 duty)CCAP0H=256-duty;motorIO=1;#ifndef _PWM_H_#define _PWM_H_void Init_PWM(void);void forward(u8 duty);void stop(void);void back(u8 duty);#endif主机的主函数文件:#include

49、reg52.h#includedefine.h#includedelay.h#include1603.h#includecom.h#includeexternIRQ.h#includecapture.h#includesteer.h#includeIRQ.hvoid system_init(void)EA=0;LCD_Init();COMInit();IRQ_Init();capture_init();Init_SteerPWM();EA=1;void main(void)u8 i,closeN=0,fitN=0,remoteN=0;float xdata tem5;u32_l xdata d

50、istance22;u8 xdata close22,xdata fit22,xdata remote22;system_init();while(1)if(key_flag)buzz=0;delay_ms(500);buzz=1;delay_ms(500);buzz=0;delay_ms(500);buzz=1;delay_ms(500);buzz=0;delay_ms(500);buzz=1;delay_ms(500);buzz=0;delay_ms(500);buzz=1;delay_ms(500);break; while(1)closeN=0;fitN=0;remoteN=0;for

51、(i=7;i30;i+)steer(0,1,i);chufa=1;while(!T1_F);tem0=juli;chufa=1;while(!T1_F);tem1=juli;chufa=1;while(!T1_F);tem2=juli;chufa=1;while(!T1_F);tem3=juli;chufa=1;while(!T1_F);tem4=juli;distancei-7=(tem0+tem1+tem2+tem3+tem4)/5;for(i=0;i22;i+)if(distancei1500)remoteremoteN=i;remoteN+;elsefitfitN=i;fitN+;if

52、(remoteN=closeN)LCD_Write_String(0,4,open area!);for(i=1;iremotei)remote0=remotei;steer(0,2,(remote0*5/22+17);send_UART(0xFF);elseif(remoteNfitN)LCD_Write_String(0,4,barrier area!);for(i=1;iremotei)remote0=remotei;steer(0,2,(remote0*5/22+17);send_UART(0x88);elseLCD_Write_String(0,4,barrier area!);for(i=1;ifiti)fit0=fiti;steer(0,2,(fit0*5/22+17);send_UART(0x00);从机的主函数:#includeIRQ.h#includePWM.h#includecom.h#includecapture.hvoid system_init(void)EA=0;COMInit();cap

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!