电子设计大赛运水机器人(论文+电路图+程序)_第1页
电子设计大赛运水机器人(论文+电路图+程序)_第2页
电子设计大赛运水机器人(论文+电路图+程序)_第3页
电子设计大赛运水机器人(论文+电路图+程序)_第4页
电子设计大赛运水机器人(论文+电路图+程序)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、目 录 1 设计任务分析.1 2 方案设计与论证.1 2.1 三套可行方案选择.1 2.2 最佳方案论证.2 2.2.1 电机选择.2 2.2.2 运水量测量.2 2.2.3 自动给水装置与机器人的通讯.3 2.2.4 路面黑线检测.3 2.2.5 其他方案论证.3 2.3 最终系统方案.3 3 系统电路分析与软件说明.4 3.1 电路分析.4 3.1.1 黑线检测电路.4 3.1.2 分布导线水量测量法.4 3.1.3 机器人与自动装水装置通讯模块.5 3.2 软件说明.5 4 数据测试.6 5 创新总结.6 5.1 系统设计创新点.6 5.2 心得体会.7 附页.8 摘要:本运水机器人从实

2、际应用出发,充分融入机电一体化的思想,使机器人具备自动装水、 按照设定路线进行运水、并在目的地准确卸水的基本功能。此外,运水量的测量、工作过程 的自动计时、运水温度的测量、工作状态的语音适时播报、相关信息液晶屏显示等附加功能 的实现,使本机器人具备良好的人机交互界面。控制系统采用主从机的结构框架进行设计。 此外根据水的导电特性,创造性的设计出了一套由导线和比较器构成的液位测量系统。 关键词:自动运水;水量测量;语音播报 1 设计任务分析 设计一套运水机器人系统,使此机器人能够将装水区域的水运输到指定区域,并能进行 自动卸水。装水区域 a 与卸水区域 c 之间由一根宽度不大于 20mm 的引导黑

3、线相连;引导 线所在的区域为运输区 b,三个区域由起始边线和返回边线隔离,边线同样为不大于 20mm 的黑线。如图 1 所示,运水机器人的运水线路图。 图 1 机器人运水线路 该系统包括 a 区的自动(或手动)给水装置,装置形状大小及摆放方式自定;往返于 a、c 区之间的机器人(包含运水容器,其总垂直高度不得超过 300mm,储水装置容量不超 过 600ml,口径不大于 100mm) ,机器人任意部分不得超出其边缘 50mm;c 区存水装置, 口径不得大 100mm,高度不得低于 250mm,固定底板。起初机器人置于黑色启车线的右侧, 巡着黑色引导线运行至返回边线右侧,轮子均不得压线。按照单位

4、时间运水量评价机器人性 能;此外机器人还需具备同步显示运行时间,显示两次测量所得运水量及总运水量的功能。 反复琢磨任务要求,可得出如下结论: (1)机器人能够沿着引导线进行巡迹,并能通过检测起始边线和返回边线进行准确定位; (2)机器人如果采用自动给水方式,a 区给水装置应具有电路控制系统,并能和机器人 控制系统进行信息交换; (3)自动给水装置的给水方式和机器人的卸水方式,可以有多种方案予以实现,但应是 在保证转移方式可靠的前提下,追求转移速度; (4)运水量不应按机器人上容器的每次运水总量进行测量,而应按由机器人装卸到 c 区 容器中的水量进行测量; (5)完成发挥部分需要显示运行时间以及

5、运水量,显示界面应具备显示多个字符的功能; (6)容器尺寸以及机器人相关尺寸有严格要求,均应满足。 2 方案设计与论证 随着计算机技术的迅猛发展和广泛应用,机电一体化技术正获得前所未有的发展,而机 器人是机电一体化技术的最佳诠释。本运水机器人赛题从实际应用出发,机电一体化思想的 充分融入是本赛题的最大特色,而成本低廉、性能可靠、结构合理是进行方案设计的出发点。 2.1 三套可行方案选择 根据系统设计任务所得出的结论,结合机械电子学、电子技术、微控技术等相关的学科 知识,以及电子元器件市场器件的销售情况,现对本运水机器人系统涉及的相关项目进行逐 项设计,每个设计项目分别给出三套可行方案,并作出最

6、终选择。如表 1 所示,三套可行顶 层方案的设计与选择。 表 1 三套顶层方案的设计与选择 2.2 最佳方案论证 2.2.1 电机选择 直流电机具有良好的调速特性、较大的启动转矩,以及功率大响应快速等优点,特别是 其调速范围广,调速时的能量损耗小,且易于平滑调节。步进电机虽然具有机械振动小、噪 声低、易于数字精确控制等一系列的优点,但是其输出力矩随转速升高而下降、在较高转速 时会急剧下降,且一般不具有过载能力的特点,使其无法满足本运水机器人对力矩和速度的 要求。而采用舵机转向直流电机驱动的方案,无疑曾加了软件控制的复杂程度。 直流减速电机其大力矩,平滑调速的特性很好的满足了本运水载重机器人的要

7、求。 2.2.2 运水量测量 利用称重传感器测出容器储水总重,减去放水后剩量换算得出运水量。然而称重传感器 输出的模拟信号为微弱的毫伏级电压信号,需要经运算放大器放大后送给 ad 转换芯片进行 模数转换,最后再给 cpu 进行相应处理,这样不但增加了硬件设计成本,而且软件编写较 为复杂,不符合运水机器人高性价比的设计初衷。而根据容器尺寸,抽水流量和时间计算得 出运水量的设计方案,属于开环测试,很难控制测量的精确度,无法满足 5%以内的测量误 差。 设计项目方案一方案二方案三最佳方案 电机选择直流减速电机混合式步进电机转向舵机加后轮驱动 电机 方案一 运水量测量称重传感器测水重, 从而换算出运水

8、量 根据容器尺寸和抽水 时间计算运水量 根据水的导电特性, 利用分布导线测出液 位换算出运水量 方案三 自动给水装置与 机器人通讯 无线发射接受红外编码解码光电式接近开关方案二 路面黑线检测主动式红外探测器直 流驱动方式 红外探测器脉冲调制 方式 发光二极管与光敏电 阻加 ad 转换方式 方案一 自动装水方式直流微型隔膜水泵电磁阀舵机连同水龙头加以 改装 方案一 c 区卸水方式着重结构设计,采用 倾倒方式 微型离心水泵抽水合理设计储水容器, 改装水龙头 方案二 显示方式led 数码管显示lcd1602 液晶显示lcd12864 液晶显示方案二 控制中心一片 51 单片机,加译 码器锁存器扩展

9、io 口 两片 51 单片机,主从 机控制结构 fpga方案二 这里利用水液的微弱导电性,采用自创的分布导线法进行液位测量,不但测量稳定精度 较高,而且成本低廉。其详细测量方法将在后文进行述说。 2.2.3 自动给水装置与机器人的通讯 无线发射接受方式信号可传输距离远,但是其自身抗干扰能力差,由于涉及到高频电路 的制作与调试,制作较为复杂,而且成本较红外编解码方式高。而采用光电接近开关方案, 主要靠检测机器人位置来输出信号,是一种被动式的信号交换形式,可控性能相对较差。 2.2.4 路面黑线检测 路面黑线检测采用主动式红外探测器直流驱动方式。虽然其较脉冲调制方式检测距离近, 易受干扰,但通过合

10、理设计电路元器件参数同样能达到满意效果,鉴于价格考虑这里采用前 者。发光二极管与光敏电阻加 ad 转换组成的巡线方案,适于在环境光线基本不变的情况下 使用,适应性较差,而且硬件成本高昂。 2.2.5 其他方案论证 自动装水方式采用直流隔膜水泵。电磁阀多数为 220v 交流供电,而且价格昂贵流速较 慢。将自来水龙头改装后,用舵机控制它的拧开和关闭。这种方案简便可靠,颇具创意,考 虑到机械加工工作量较大,我们舍弃了此种方案。 lcd1602 液晶显示器价格便宜,功耗低、显示清晰。而数码管显示字符少,功耗太大。 至于 lcd12864 显示屏幕太大,用于此系统不大协调。 2.3 最终系统方案 根据上

11、文分析和论述,现将系统方案确定。如图 2 所示,为最终的系统方案方框图。除 了上面谈及的内容外,另外还将水温测量并显示、语音适时播报融入系统作为本机器人发挥 部分的特色与创新。 水温测量 cpu 上位主机上位主机 控制中心控制中心 cpu 下位从机 lcd 液晶显示液位测量 h 桥双路电机驱动直流电机 继电器驱动模块车上卸水泵水满检测 红外编码发射 红外解码接收a 区装水 cpu 继电器驱动模块 a 区装水泵 语音适时播报 黑线检测 指示电珠 图 2 系统方案方框图 3 系统电路分析与软件说明 3.1 电路分析 3.1.1 黑线检测电路 采用 rpr220 反射型红外对管采集路面信号。红外发射

12、管发出红外光线,经反射物体反 射到接收管上,使接收管的集电极和发射极间电阻变小,输入电位变小,接收管输出端输出 高电平,通过 pnp 三极管放大输入比较器(lm393ad)的反相端。当红外光线照射到黑色 条纹时,反射至接收管中的光强变弱,输出低电压经三极管放大,再经比较器处理,输出高 电平。 由于 lm339 是开源输出,需在输出端接一个 10k 的上拉电阻。在比较器的同相输入端 接电位器用来调节阀值,以适应不同光线环境的要求;在红外发光管串接一个 1k 电位器, 调节发光强度,以消除红外管的出厂误差。如图 3 所示,为黑线检测电路原理图。本运水机 器人系统,共用到 12 路此检测电路。前后各

13、六个,其中五个检测引导线,一个检测边线。 1k r3 220 r1 rpr220 9012 vccvcc 200k r4 102 r2 2 4 5 lm339ad 104 r6 33k r5 vcc 10k r7 vcc out 图 3 路面黑线检测电路 3.1.2 分布导线水量测量法 纯水是一种极弱的电解质,故而具有微弱的导电特性,自来水较纯净水的导电性强。利 用水的这一特性,我们独创了一套运水量测量方法-分布导线水量测量法。 如图 4 所示,为分布导线测水量的示意图。在容器口附近布置 1-8 号八根导线,导线成 梯度等距分布,导线分布越多、之间距离越短测量精度越高。根据设计任务要求,运水量

14、应 为从机器人储水容器注入 c 区容器中的水量;在容器近底面处安放 0 号放水完毕检测导线。 运水量即为液面高度所拥有的水量 vi减去检测导线处所拥有的水量 vo。0 号导线高度 ho固 定,1-8 号导线测出液面高度 hi。运水量的计算公式如下: v=vi-vo =a(hi -ho) ml a 容器底面积; vi 液面高度所拥有的水量; v 检测导线处所拥有的水量; hi 第 i 号(1-8 号)导线所在的液面高度; ho 放水完毕检测导线所在的液面高度 2 4 5 lm339ad 100k r1 10k r4 vccvcc out in 10k r3 104 r2 图 4 分布导线测水量示

15、意图 图 5 测水量比较器电平处理电路 水的导电性能十分微弱,虽然给容器中的水液上拉了 12v 的电压,但从检测导线输出 的信号只有 0.4v-0.8v,在 ttl 中依然为低电平,无法为单片机所采集。这里设计以比较器 为中心的电平处理电路,能将 0.4v-0.8v 的弱电平转换为稳定的 ttl 电平,如图 5 所示。 r3 为输入端的下拉电阻,保证无信号输入时比较器同相输入端为低电平;r4 为输出端上拉 电阻,以解决比较器开源输出的问题。比较器反相输入端参考电压调节至 0.2v。 3.1.3 机器人与自动装水装置通讯模块 本模块通讯方式为红外编解码,模块由三态编解芯片mc145026 和mc

16、145027 组成,此 组芯片是摩托罗拉公司生产的用于通信配对使用的最新芯片。编码芯片mc145026 可对9 位 输入信息(地址位a1a5,数据位d6d9)进行编码,编码后每个数据位用两个脉冲表示: “1”编码为两个宽脉冲;“0”编码为两个窄脉冲;“开路”编码为一宽脉冲和一窄脉冲交 叉。对于每9 位数据信息,可以看作是一个数据字,为了提高通信的安全性,编解码芯片对 每个数据字发送两次,接收两次。其电路原理如图6所示。 a1 1 a2 2 a3 3 a4 4 a5 5 a6/d6 6 a7/d7 7 vss 8 a8/d8 9 a9/d9 10 rs 11 ctc 12 rtc 13 te 1

17、4 out 15 vdd 16 mc145026 u2 mc145026 a1 1 a2 2 a3 3 a4 4 a5 5 r1 6 c1 7 vss 8 in 9 r2/c2 10 vt 11 d9 12 d8 13 d7 14 d6 15 vdd 16 mc145027 u4 mc145027 y1 1 a1 2 b1 3 y2 4 a2 5 b2 6 gnd 7 a3 8 b3 9 y3 10 a4 11 b4 12 y4 13 vcc 14 74ls02 u3 74ls02 in1 1 in1 2 out1 3 out2 4 in2 5 in2 6 vss 7 in3 8 in3 9

18、out3 10 out4 11 in4 12 in4 13 vdd 14 u1 cd4011 vcc 51kr1 100kr2 4.7k r5 561 c2 103c1 103 c1 9013 led 300k r3 vcc 200 r6 vcc 503 r4 下下下下下下 vcc vcc out 200kr1 400kr2 104c2 下下下下下下 1 2 3 0038 in 图6 红外编解码通讯原理图 3.2 软件说明 由于篇幅有限,这里只给出主程序的核心流程图,如图7所示。 图7 主程序核心流程图 4 数据测试 运水机器人制作完成后,对系统性能作出了测试。测试仪器如表2所示,测试数据如表

19、3 所示。 表2 测试仪器 仪器数量 秒表1 只 烧杯2 只 温度计1 只 表3 测试数据 项目 次数 显示时间 单位:s 秒表时间 单位:s 测量水量 单位:ml 实际水量 单位:ml 测量水温 单位: 实际水温 单位: 测试时间 133.433.61100107625.425.6am 9:10 235.134.81110109026.626.7am10:08 332.232.71100108127.427.6am10:50 436.837.01100107228.027.8pm14:35 533.033.31090101328.228.2pm15:00 634.634.0109010982

20、7.227.5pm17:00 根据测试记录数据可知:考虑人为按下秒表的因素,系统时间显示准确无误;水量测量 误差均控制在3%以内;18b20单总线温度传感器的水温测量亦是无可挑剔。 整套系统经过一个星期的反复试验和测试,可靠稳定、达到方案设计的预期指标。 5 创新总结 5.1 系统设计创新点 (1)采用自创的分布导线液位测量法进行运水量测量,并将测量误差控制在3%以内; (2)机器人每次动作的进行都配套有适时的语音播报,加上lcd液晶显示使其具备更 佳的人机交换界面; (3)对每次所运的水进行水温测量,并液晶显示,使其在相关应用领域具备一定的实 用价值; (4)电路焊接工艺良好,机械结构设计简

21、便合理,机器人运行平稳无噪声,而且不乏 创新元素的融入,外形亦是具备很强的观赏性。 5.2 心得体会 “三人行,必有我师焉”,这恐怕是我们此次省赛体会最为深刻的一句话。我们三个人 共同点是从大一开始便开始热衷于各种课外创新活动,尤其在电子创新方面有所侧重;不同 之处是三人专业不尽相同机械、能源、通信工程。三个人都有自己的特长和优势,大家 在一起交流学习、取长补短、并肩作战并乐在其中这个暑假繁忙而充实! 附页: p1.0/t2 1 p1.1/t2ex 2 p1.2 3 p1.3 4 p1.4 5 p1.5 6 p1.6 7 p1.7 8 rst 9 p3.0/rxd 10 p3.1/txd 11

22、 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 vss 20 p2.0/a8 21 p2.1/a9 22 p2.2/a10 23 p2.3/a11 24 p2.4/a12 25 p2.5/a13 26 p2.6/a14 27 p2.7/a15 28 psen 29 ale 30 ea/vpp 31 p0.7/ad7 32 p0.6/ad6 33 p0.5/ad5 34 p0.4/ad4 35 p0.3/ad3 36 p0.2/ad2 37 p0.1/ad1 38 p

23、0.0/ad0 39 vcc 40 stc89c52 5v 12 12m 30pf c1 30pf c2 s1 1k r1 10k r2 5v 100pf c3 1 2 3 4 5 下下下下 5v in1 5 en a 6 in2 7 gnd 8 vss 9 in3 10 en b 11 in4 12 out3 13 out4 14 is en a 15 is en b 1 out1 2 out2 3 vs 4 lm298 u2 lm298 d5d7 d2d3d1d4 d6d8 m 下下下下 m 下下下下 100ufc9100ufc11 0.1ufc100.1ufc8 8550 1k r4 m

24、 下下下1 m 下下下2 vcc 1 2 3 下下下下 1 2 3 4 5 6 7 8 下下下下下 1 2 3 4 5 6 7 8 下下下下下 1 2 12v 下下下 ds1 led2 vinvout gnd vr-7806 104 c4 vinvout gnd vr-7805下下下下 12v 103 c5104 c6 470u c7 1k r3 5v 1 2 3 下下下下下下下 6v 6v 12v 下下 下下 下下下下下下下 12v 5v p1.0/t2 1 p1.1/t2ex 2 p1.2 3 p1.3 4 p1.4 5 p1.5 6 p1.6 7 p1.7 8 rst 9 p3.0/rx

25、d 10 p3.1/txd 11 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 vss 20 p2.0/a8 21 p2.1/a9 22 p2.2/a10 23 p2.3/a11 24 p2.4/a12 25 p2.5/a13 26 p2.6/a14 27 p2.7/a15 28 psen 29 ale 30 ea/vpp 31 p0.7/ad7 32 p0.6/ad6 33 p0.5/ad5 34 p0.4/ad4 35 p0.3/ad3 36 p0.2/ad2

26、37 p0.1/ad1 38 p0.0/ad0 39 vcc 40 stc89c52 5v 12 12m 30pf c1 30pf c2 s1 1k r1 10k r2 5v 100pf c3 1 2 3 4 5 下下下下 5v 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10k out1 2 out2 1 out3 14 out4 13 vcc 3 in1- 4 in1+ 5 in2- 6 in2+ 7 in3- 8 in3+ 9 in4- 10 in4+ 11 gnd 12 u1 lm339 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9

27、 10 10 11 11 12 12 13 13 14 14 15 15 16 16 lcd1602 10k r4 10k r5 5v rs lcdes 5v 1 2 3 ds18b20 out1 2 out2 1 out3 14 out4 13 vcc 3 in1- 4 in1+ 5 in2- 6 in2+ 7 in3- 8 in3+ 9 in4- 10 in4+ 11 gnd 12 u2lm339 104 r11 5v 1 2 3 4 5 6 7 8 下下下下下下 1 2 3 下下下下下下下 rw rs rw lcdes 5v 5v 5v bj bj bj bj bj bj bj bj b

28、j 下下下下下下下 附表1 元器件清单 名称型号数量名称型号数量 单片机stc89c523直流隔膜水泵12v 20w1 单片机spce061a1微型水泵12v 8w2 比较器lm3396直流减速电机12v 120r/min2 功率放大器l298n1晶振12 mhz3 继电器srd-s-1052晶振32.768khz1 继电器jrc-21f1或非门74ls021 红外编码芯片mc1450261与非门cd40111 红外解码芯片mc1450271音频功放spy00301 红外对管rpr22012电位器10212 液晶显示器lcd16021电位器1032 温度传感器ds18b201电位器1045 三

29、极管901212集成稳压芯片l78053 三极管90133集成稳压芯片l78062 上位机 /=奥运第四天省赛程序完整版=/ /_ _ _ _ _ _ _ _ _ _ _ /-全部功能很好实现- /- /=洞庭飞=洞庭飞=洞庭飞=洞庭飞=/ /- /=/ #include #includeintrins.h /_nop_();延时函数用 #includemath.h #define uchar unsigned char #define uint unsigned int #define ulint unsigned long bit k1=0,k2=0; /k=0正转k=1反转 sbit s

30、huiman=p32; /一根线在a区检测水满,则使a区水泵停止 sbit fangshui=p33;/通过红外发射控制a区泵的转动和停止高有效 sbit kaibeng=p34;/车在c区开泵向c容器中放水 sbit shuidao=p35;/车向c容器中放水,检测b容器中水已抽完 sbit start=p36; /上位51机控制下位机定时器0开,也作为小车运行停止的联络信号 sbit jianshui=p37;/上位机控制下位开始检测水位 uchar bianh,bianl; /k控制转动方向 uchar sud1=0,sud2=0; /速度调节码值 uchar jishi1=0,jish

31、i2=0; /定时器0中断计数 uchar yuyin; /= /应用时先开中断tr0=1,设sud1,sud2大小控制速度, /k1 k2值控制方向,sud范围为0-255,对应停止-全速 /k=0电机正向转动,k1=1电机反向转动 /- timer0() interrupt 1 using 1 /使用定时器0 uchar zuoq,zuot,youq,yout; th0=bianh; /每次中断定时0.1ms tl0=bianl; jishi1+; jishi2+; /*左直流电机* if(sud1!=0) if(k1=0) /k1=0,左电机正转 if(jishi1=sud1) zuoq

32、=0 x01;zuot=0 x00; else if(sud1jishi1100) jishi1=0;zuoq=0;zuot=0; else /k1!=0,左电机反转 if(jishi1=sud1) zuoq=0 x00;zuot=0 x01; else if(sud1jishi1=100) zuoq=0 x00;zuot=0 x00; else jishi1=0;zuoq=0;zuot=0; else /sud1=0,左电机停转 zuoq=0;zuot=0; /*右直流电机* if(sud2!=0) if(k2=0) /k2=0,右电机正转 if(jishi2=sud2) youq=0 x0

33、1;yout=0 x00; else if(sud2jishi2=100) youq=0 x00;yout=0 x00; else jishi2=0;youq=0;yout=0; else /k2!=0,右电机反转 if(jishi2=sud2) youq=0 x00;yout=0 x01; else if(sud2jishi2=100) youq=0 x00;yout=0 x00; else jishi2=0;youq=0;yout=0; else /sud2=0,右电机停转 youq=0 x00;yout=0 x00; /*两电机驱动码中和* yout=yout3;youq=youq2;z

34、uot=zuot1; p2=(yout|youq|zuot|zuoq|yuyin); / p2口低四位输出驱动码 /p2.0 p2.1控制左电机,p2.2 p2.3控制右电机 /以及控制凌阳61的语音,p2.4 p2.5 p2.6控制 /- /*前进巡线,即由a区运行至c区* void xunqian() uchar hong5=0; /存红外状态 k1=0;k2=0; /左右电机都正转 hong5=p0;_nop_(); hong5=hong5 if(hong5 sud2=255; else if(hong5 sud2=255; /左电机减速,右电机大全速 else if(hong5sud2

35、=0; /右电机大减速,左电机全速 else if(hong5sud2=255;/右电机全速左电机小减速 else if(hong5sud2=170; /右电机大减速,左电机全速 /- /*倒车巡线,即由c区运行至a区,前端* void xunhou() uchar hong5=0; /存红外状态 k1=1;k2=1; /左右电机都反转 hong5=p1;_nop_(); hong5=hong5 if(hong5 sud2=255; else if(hong5 sud2=0; /左电机减速,右电机大全速 else if(hong5sud2=255; /右电机大减速,左电机全速 else if(

36、hong5sud2=170;/右电机全速左电机小减速 else if(hong5sud2=255; /右电机大减速,左电机全速 /= void xunhou1() uchar hong5=0; /存红外状态 k1=1;k2=1; /左右电机都反转 hong5=p0;_nop_(); hong5=hong5 if(hong5 sud2=255; else if(hong5 sud2=255; /右电机减速,左电机大全速 else if(hong5sud2=120; /左电机大减速,右电机全速 else if(hong5sud2=255;/左电机全速右电机小减速 else if(hong5sud2

37、=200; /左电机大减速,右电机全速 /-延时程序,一个单位代表约1ms- void delay(uint k) uint i,j; for(i=0;i=k;i+) for(j=0;j=200;j+) ; /- /不管小车是前进还是倒车都是sud1控制左边的, /速度2控制右边的 /当然都是人站在车后面向行驶的方向看去 /= /=/ /sbit start=p30;/上位51机控制下位机定时器0开,使之开始计时 /sbit jianshui=p31;/上位机控制下位开始检测水位 /sbit shuiman=p32;/下位机检测水满后反馈给上位机一个信号 /sbit fangshui=p33;

38、/上位机通过红外发射控制a区泵的转动和停止, / 低有效 /sbit kaibeng=p34;/车在c区开泵向c容器中放水,低有效 /sbit shuidao=p35;/车向c容器中放水,检测b容器中水已抽完 /*主函数* /= void main() ulint kk=0; /-初始化- uchar biao1=0,heng2=0,heng1=0,biao2=0,biao3=0,biao4=0; tmod=0 x01; /初始化,定时器0用方式1定时 bianh=0 xff; /定时us bianl=0 xc0; th0=bianh; tl0=bianl; ea=1;et0=1;tr0=0;

39、 sud1=0;k1=0; sud2=0;k2=0; yuyin=0; start=0; jianshui=0; fangshui=0; kaibeng=1; tr0=1; /开定时器0 start=1; /开下位机定时器0开始计时间 delay(40); /安全延时约6秒钟 /- /小车第一次在a区进行装水程序段,小车还未开始计时 fangshui=1; /开泵放水 delay(80); jianshui=1; delay(10); /延时0.2秒由下位机检水 while(!shuiman); /下位机检测水未满,在此等待 fangshui=0; /关泵 jianshui=0; /关下位机检

40、水程序 delay(30); /% yuyin=0 x30; /% delay(120); /- sud1=220;sud2=220; /-小车装水完毕第一次由a区运行至c区- biao1=1; delay(30); yuyin=0 x40; delay(50); while(biao1=1) /% yuyin=0 x10; /% xunqian(); heng2=p0; /检测第二条横线 heng2=heng2/用前红外管0号管检测 if(heng2!=0) biao1=0;sud1=0;sud2=0;yuyin=0 x00;/检测到横线后停车 delay(40); /-小车停在c区向容器中

41、抽水- while(shuidao) kaibeng=0; kaibeng=1; /水到shuidao为0后,关b容器中泵停止抽水 yuyin=0 x50; /-为倒车即车由c区运行至a区作准备- biao2=1; delay(50); sud1=255;k1=1; sud2=255;k2=1; delay(65); yuyin=0 x20; /-小车由c区运行至a区- while(biao2=1) xunhou(); heng1=p1; /检测第二条横线 heng1=heng1 /用前红外管0号管检测 if(heng1!=0) biao2=0; biao3=1; yuyin=0 x60; w

42、hile(biao3=1) xunhou1(); heng1=p0; /检测第二条横线 heng1=heng1 /用前红外管0号管检测 if(heng1!=0) biao3=0;sud1=0;sud2=0;yuyin=0 x00; /车到达a区停稳 /-由a区容器向车中容器放水- delay(10); /# start=0; /小车第2次在a区进行装水程序段 fangshui=1; /开泵放水 delay(10); jianshui=1; /延时0.2秒由下位机检水 while(!shuiman); /下位机检测水未满,在此等待 fangshui=0; /关泵 jianshui=0; /关下位

43、机检水程序 delay(90); /- /-为小车第二次由a区运行至c区做好准备- sud1=220;k1=0; sud2=220;k2=0; /-小车装水完毕第二次由a区运行至c区- biao4=1; delay(55); /% yuyin=0 x30; /% start=1; while(biao4=1) /% kk=0; kk+; if(100000kk100100) yuyin=0 x40; else yuyin=0 x10; /% xunqian(); heng2=p0; /检测第二条横线 heng2=heng2/用前红外管0号管检测 if(heng2!=0) biao4=0;sud

44、1=0;sud2=0;yuyin=0 x00;/检测到横线后停车 /- delay(40); kaibeng=0; delay(50); jianshui=1; while(shuidao); /% yuyin=0 x30; delay(10); yuyin=0 x50; /% kaibeng=1; jianshui=0; start=0; yuyin=0 x00; tr0=0; delay(10); while(1); 下位机 /=08奥运第四天版,中国军团已获12金= /_ _ _ _ _ _ _ _ _ _ _ _ /= /液位测量,根据实际容器情况换算为运载容量进行显示 /包括第一次运

45、载量ml,第二次运载量,以及总和 /水温测试 ds18b20 /精确计算,含一位小数液晶显示液晶板1602 /运行时间显示 /= #include #includeintrins.h /_nop_();延时函数用 #includemath.h #define uchar unsigned char #define uint unsigned int #define ulint unsigned long sbit dq=p27; /温度控制口18b20,传感器输入 sbit rs=p24; /液晶控制 sbit rw=p25; sbit e=p26; sbit start=p20; /上位51

46、机控制下位机定时器0开,使之开始计时 sbit jianshui=p21; /上位机控制下位开始检测水位 /sbit shuiman=p22; /下位机检测水满后反馈给上位机一个信号 /sbit chebiao=p23;/作为小车运行停止接受上位机的联络信号 sbit yeweizhi2=p11; uchar add; /用来存显示地址 uint time=0; uchar data dis16= t,:, , , ,., ,s, , w, , ,., ,0 xeb,c,; /存计算结果水温测量及运行时间显示 uchar data dis116= v,1,:, , , , , , v,2,:,

47、 , , ,m,l ; /用于显示第一次运水量,第二次运水量 单位:ml uchar data dis216= ,v,0,=,v,1,+,v,2,=, , , , ,m,l; /用于显示两次运水量总和,单位:ml uchar code ditab16= 0 x00,0 x01,0 x01,0 x02,0 x03,0 x03,0 x04,0 x04,0 x05,0 x06, 0 x06,0 x07,0 x08,0 x08,0 x09,0 x09; /小数转换表 /= timer0() interrupt 1 using 1 /使用定时器0 th0=-(10200/256); /每次中断延时10m

48、s tl0=-(10200%256); dis2=time/10000+0 x30; dis3= (time%10000)/1000+0 x30; dis4= (time%1000)/100+0 x30; dis6= (time%100)/10+0 x30; time+; /# /=/ /=水温测量块=/ /* /延时11us函数 void delay(uint t) for(;t0;t-); /* /复位程序 ow_reset(void) bit presence=1; while(presence) while(presence) dq=1; _nop_(); _nop_(); dq=0;

49、 delay(50); /550us dq=1; delay(6); /66us presence=dq; /presence=0继续下一步 delay(45); /500us presence=dq; dq=1; /* /写命令函数,写一个字节 void write_byte(uchar val) uchar i; for(i=8;i0;i-) dq=1; _nop_(); _nop_(); dq=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();/5us dq=val /最低位移出 delay(6); /66us val=val1; /右移1位

50、dq=1; delay(1); /* /读一字节函数 uchar read_byte(void) uchar i; uchar value=0; for(i=8;i0;i-) dq=1; _nop_(); _nop_(); value=1; dq=0; _nop_(); _nop_(); _nop_(); _nop_(); /4us dq=1; _nop_(); _nop_(); _nop_(); _nop_(); /4us if(dq) value|=0 x80; delay(6); /66us dq=1; return(value); /* /温度数据处理函数 void chuli(uch

51、ar gaowei,uchar diwei) uchar zong; dis13=diwei /转换成液晶码 dis13=ditabdis13+0 x30; zong=(diwei dis11=zong%100; dis10=dis11/10+0 x30; dis11=dis11%10+0 x30; /* /=/ /=1602液晶显示块=/ /*延时*/ delay1(uint z) uint i,j; for(i=0;iz;i+) for(j=0;j120;j+) ; /* /写指令子程序 wrcod(uchar i) p0=i; /p0口为数据位 rs=0; e=0; delay1(8);

52、 e=1; /* /写数据子程序 wrshu(uchar i) p0=i; rs=1; e=0; delay1(2); e=1; /* /初始化液晶 chushi() uchar coad; coad=0 x01; /清屏 wrcod(coad); coad=0 x06; wrcod(coad); /输入方式控制 coad=0 x0e; wrcod(coad); /显示开关控制 coad=0 x38; wrcod(coad); /功能设定:设置16x2显示,5x7显示,8位数据接口 /* /显示程序 /-显示小车工作时间,水温- xian1() uchar i=0; while(i16) wr

53、shu(disi); i+; /-显示第一次运水量,第二次运水量- xian2() uchar i=0; while(i16) wrshu(dis1i); i+; /-显示运水总量- xian3() uint yeweizhi3; uchar i=0; yeweizhi3=11090; dis210=yeweizhi3/10000+0 x30; /送至1602显示 dis211=(yeweizhi3%10000)/1000+0 x30; dis212=(yeweizhi3%1000)/100+0 x30; dis213=(yeweizhi3%100)/10+0 x30; while(i16)

54、wrshu(dis2i); i+; /* /* /*水温测量初始* void shuiwen() uchar wenh,wenl; /存高低温度值ow_reset(); /转换 ow_reset(); /转换 write_byte(0 xcc); write_byte(0 x44); ow_reset(); write_byte(0 xcc); /发读命令 write_byte(0 xbe); wenl=read_byte(); /温度低八位 wenh=read_byte(); /温度高八位 chuli(wenh,wenl); /数据处理 /-运行时间显示,水温测量显示-/ add=0 x80

55、; /显示 wrcod(add); xian1(); /- add=0 xc0; wrcod(add); xian2(); /运水量的已经测量的显示 /-/ delay1(200); /= /# /=液位测量子程序= ceye() uint ce1,ce3,ceyewei; ce1=p1; /接高处的短排针 ce3=p3 / 接较低处的,即较长排针的 ce1=7; ceyewei=ce1|ce3; return(ceyewei); /- ceyewei() uint yewei,yeweizhi=0; yewei=ceye(); switch(yewei) case 0 x0000:yewei

56、zhi=yeweizhi+10;break; case 0 x0001:yeweizhi=4800;break; /可检测处最低液面处 case 0 x0003:yeweizhi=4874;break; case 0 x0007:yeweizhi=4948;break; case 0 x000f:yeweizhi=5022;break; case 0 x001f:yeweizhi=5096;break; case 0 x003f:yeweizhi=5170;break; case 0 x007f:yeweizhi=5244;break; case 0 x00ff:yeweizhi=5318;b

57、reak; case 0 x01ff:yeweizhi=5392;break; case 0 x03ff:yeweizhi=5466;break; case 0 x07ff:yeweizhi=5540;break; case 0 x0fff:yeweizhi=5614;break; case 0 x1fff:yeweizhi=5688;break; case 0 x3fff:yeweizhi=5762;break; case 0 x7fff:yeweizhi=5836;break; /case 0 xffff:yeweizhi=5840;break; default: break; return(yeweizhi); /-对测得的液位值进行显示处

温馨提示

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

评论

0/150

提交评论