资源描述
______________________________________________________________________________________________________________
摘 要
本设计为一款具有智能判断的能自动行驶在起始位置与终点库房间的搬运小车。具有以下功能:自动行驶;检测木块;搬运木块;自动入库;同步显示小车运行时间等。该设计采用STC89C52单片机作为智能小车的检测和控制核心,使用激光校正导航技术检测木块位置。直流电机驱动电路采用四通道驱动集成芯片L298N,采用PWM脉冲调制驱动直流电机。系统具有很大的扩展潜力。实现了无人控制即可完成一系列动作,相当于简易机器人。
关键词:智能判断;自动入库;PWM脉宽调制;简易机器人
目录
1 设计任务及要求 1
1.1基本任务 1
1.2基本要求 2
1.3 发挥部分 2
2 方案设计 2
2.1 总体方案设计 2
2.1.1 车体的确定 2
2.1.2 系统原理分析 2
2.2单元模块设计 3
2.2.1控制器模块 3
2.2.2自动导航模块 4
2.2.4电机驱动模块 5
2.2.5系统供电模块 6
3 分析计算 6
3.1 精确定位的实现 6
3.2 准确计时的实现 7
3.3 PWM控制实现 7
4 系统调试 8
4.1、模块测试 8
表1 电机驱动测试结果 8
4.2 总体测试 8
5 创新点 8
6 总结及心得体会 9
附录 9
精品资料
1 设计任务及要求
1.1基本任务
设计并制作一个能自动行驶并完成货物搬运的机器人。机器人允许使用玩具汽车改装,可应用图像、光电、声波、超声波等无线自动导航识别技术,在比赛场地里移动,将不同颜色的物体分类搬运到仓库对应的不同颜色位置。搬运场地如图所示。
搬运场地为 1.2m×1.2m,表面为白纸;终点库房区设与地面垂直的╚╝形档板,即留有一侧给车子将木块搬运进去,其余三个侧面用挡板挡住,其长宽高为20cm×20cm×10cm,库区有三个贴有不同颜色位置,用于分别存放对应颜色的木块,位置间距随意设定;起始线为2 cm 宽、30cm 长的黑线,机器人任意时刻长宽不超过40cm×40cm。
1.2基本要求
(1)机器人从起始线出发(出发前,机器人任何部分不得超出起始线,后端不限),能自
动识别木块,并逐一运送到库房20cm 线以内。
(2)将三个木块运送至库房10cm 库区线内。
(3)整个搬运时间不得超过180 秒。
1.3 发挥部分
(1)三色木块在木块起点位置任意顺序摆放,能自动识别红、黄、蓝三个颜色的木块,并显示识别到木块的颜色。
(2)将三种颜色的木块从木块起点位置逐一运送至库区位置的对应颜色区域内,最终放置位置超出对应颜色框小于0.5cm。
(3)终点库房区在搬运场地内Y 轴上任意平移,仍能完成发挥部分第(2)任务(对应的无线引导装置可以跟随库区移动)。
(4)其他。
2 方案设计
2.1 总体方案设计
通过赛题分析,以下几点是解题的关键:
(1)小车在不受人工控制的时候怎样检测木块以及木块的颜色并保持高速向木块前进。
(2)小车怎样准确的找到木块并将其套取。
(3)怎么把木块整齐的摆放在库房内并且不超过10cm线内。
2.1.1 车体的确定
方案一:小车由四轮支撑。
本设计小车的行驶路线为直线,四轮车走直线稳,比较有优势。实践中发现靠后轮驱动和转向,会使小车在粗糙表面前进时转向产生困难,而不能寻线。
方案二:小车由三轮支撑。
三轮车的平衡性不如四轮车的强,但由于前部只采用一个轮子,减小了摩擦,相对来说转向更易实现。
根据自身条件,本系统采用方案二,车体为自制长26cm,宽14cm的简易三轮小车,万向轮置于车体前方起辅助支撑作用,两个直流电机分别置于车体后方两侧控制左轮和右轮。
2.1.2 系统原理分析
根据设计要求,基本结构框图如下。系统主要分为控制部分和信号检测部分。其中信号检测部分主要包括:木块检测模块,黑线检测模块,颜色识别模块。控制部分主要包括:电机驱动模块,显示模块,控制器模块。
控制器模块1
机械手模块
激光接收模块
记时
模块
电机驱动模块
显示 模块
控制器模块2
激光发射模块行驶检线模块
颜色识别模块
图1 系统基本结构框图 图2 系统基本结构框图
2.2单元模块设计
2.2.1控制器模块
根据题目的要求,控制器主要接受和辨认各个传感器信号、控制小车的电机的动作、控制显示小车运动的时间及协调小车各部分的运动。
方案一:51系列单片机设计方案
51系列单片机是最常用也是最基本的单片机,其特点有:它具有两种可以用软件进行选择的低功耗工作方式:待机方式和掉电方式,采用CMOS技术、集成度高、速度快、功耗低。
89C51含EEPROM电可编闪速存储器。有两级或三级程序存储器保密系统,防止EEPROM中的程序被非法复制。不用紫外光擦除,提高了编程效率。外部接口电路扩展,实现三线式串行外围设备接口SPI(Serial Peripheral Interface)和I2C(Inter-Icbus)简化了硬件线路。
方案二:ATMEL公司 AVR ATmega16设计方案
AVR系列单片机是采用低功率、非挥发CMOS工艺制造的Harvard结构的新型高速单片机单片机(一个时钟周期执行一条指令),具有休眠省电功能(POWER DOWN)及闲置(IDLE)低功耗功能,一般耗电在1~2.5mA,典型功耗情况,WDT关闭时为100nA,更适用于电池供电的应用设备。
多累加器型、数据处理速度快。超功能精简指令!具有32个通用工作寄存器。ATmega16单片机具有1KB的SRAM静态随机数据存储器,可灵活使用指令运算, 存放数据。中断响应速度快
有多个固定中断向量入口地址,可快速响应中断。
I/O口功能强、驱动能力大。AVR的I/O口是真正的I/O口,能正确反映I/O口输入/输出的真实情况。I/O口有输入/输出, 三态高阻输入,也可设定内部拉高电阻作输入端的功能,便于作各种应用特性所需(多功能I/O口) 。工业级产品!具有大电流(灌电流)10~40mA,可直接驱动可控硅SSR或继电器, 节省了外围驱动器件。
具有A/D转换电路, 可作数据采集闭环控制,AVR内带模拟比较器,I/O口可作A/D转换用,可组成廉价的A/D转换器。,中断源16个 ,外中断8个,SPI,UART,8路10位A/D,ISP。
有功能强大的计数器/定时器.C/T计数器/定时器,有8位和16位,可作比较器;计数器外部中断和PWM(也可当D/A)用于控制输出,有的有3-4个PWM,作电机无级调速是理想器件。
根据自身条件采用方案一。
图2 控制模块原理图
2.2.2自动导航模块
自动导航模块使小车不需人工控制,实现自动向木块前进,搬运木块,将木块放入库中等一系列活动。
方案一:采用红外接近开关。红外接近开关又叫做探头,其工作原理是被测参数的改变使得探头内产生相应的电流,再被信号处理及系统处理,然后输出显示。其探测范围是10CM到30CM。探测距离较短,红外接近开关发出的光较为发散容易导致定位不够精确。
方案二:采用激光传感器。激光导航具有以下特点:高方向性(即高定向性,光速发散角小),激光束在几公里外的扩展范围不过几厘米;高单色性,激光的频率宽度比普通光小10倍以上;高亮度,利用激光束会聚最高可产生达几百万度的温度。它的优点是能实现无接触远距离测量,速度快,精度高,量程大,抗光、电干扰能力强等。相对于红外接近开关定位更加精确。
基于以上分析,拟订方案二。
小车在场地内行驶时,通过激光的导航把木块从起始点搬运到终点,最终把所有的木块搬运到终点,小车运行时根据激光的进行转向或直行,当小车到达可以套取木块的位置时,接近开关亮,小车能成功套取木块。
激光的发射模块
激光的接收模块
图3 激光检测原理
2.2.3机械手臂模块
方案一:采用抓取形式的机械手臂,外形较为美观,但是容易遇到抓取不牢,木块中途脱落的问题,不易控制。并且占用空间较大,在放下木块时容易碰到其他木块,影响木块的整齐排列。
方案二:采用套取形式的机械手臂,其形式简单,性价比高。并且以拖拽的方式搬运木块,可避免木块脱落的问题,并且在放置木块时,较易实现题目要求,使木块能较为整齐的排列。
基于以上分析,拟订方案二。
2.2.4电机驱动模块
电机的驱动电路主要通过电机的正传和反转实现小车的前后或者左右的方向选择。对于电机驱动电路有以下几种方案:
方案一:采用L293D电机驱动芯片对电机的开和关进行控制,L293D电机驱动芯片允许电压范围在4.5~36V, 内有四重推挽(双重H桥集成功放电路)驱动电路,该芯片内部集成了双极型H-桥电路,所有的开关量都做成n型。这种双极型脉冲调宽方式具有很多优点,如电流连续;电机可在四象限运行;电机停止时有微振电流,起到了“动力润滑”作用,消除正反向时的静摩擦死区;低速平稳性好等。H-桥电路的输入量可以用来设置马达的转动方向,使能信号可以用于脉宽调整(PWM),通过调整PWM的占空比来调整电机的转速。每一组PWM波用来控制一个电机的速度,而另外两个I/O口可以控制电机的正反转,控制比较简单,电路也很简单,一个芯片内包含有8个功率管,这样简化了电路的复杂性。电路图如附图1所示。该芯片过热后能自动关断,两个通道可以向各自的电机提供1A的驱动电流。其最大的优点是其内部还集成续流二极管。该芯片的功耗比较小,有四个推挽电路组成,它们成对使用,每对推挽电路的输出共享一个使能端,用以控制直流电机,比较适合直流电机或步进电机的驱动。但采用PWM控制时,芯片容易发热,驱动能力下降,而且电源接反时,容易烧故而放弃。
方案二: 采用市面易购的电机驱动芯片L298N,该芯片是利用TTL电平进行控制,对电机的操作方便,通过改变芯片控制端的输入电平,即可以对电机进行正反转操作,很方便单片机的操作,亦能满足直流减速电机的要求。可以采用两个电机分别对左轮和右轮驱动,这样有利于小车的转弯。
该系统采用方案二。
2.2.5系统供电模块
方案一:采用单一的电池供电。单电池供电,也就是说电机驱动系统与信息采集及MCU控制系统采用的电源是同一电源,这样供电比较简单,但是由于电动机启动瞬时电流很大,而且PWM驱动的电动机电流波动较大,会造成电压不稳,会使系统的抗干扰能力降低,使得电机驱动系统与信息采集及MCU控制系统不能很好的工作,同时也会造成传感器误检测,严重时可能造成单片机程序跑飞、复位等异常现象。
方案二:采用双电池供电。用一个电池给电机驱动系统单独供电,另外一个电池给信息采集及MCU控制系统供电。将电动机驱动系统电源与信息采集及MCU控制系统电路电源完全隔离,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻底清除,提高了系统的稳定性和可靠性。小车负载大,所以耗电量必然很大,采用双电池,保证小车的动力。
经分析决定采用方案二。
2.2.6颜色识别模块
TCS230采用8引脚的SOIC表面贴装式封装,在单一芯片上集成有64个光电二极管。这些二极管共分为四种类型。其中16个光电二极管带有红色滤波器;16个光电二极管带有绿色滤波器;16个光电二极管带有蓝色滤波器;其余16个不带有任何滤波器,可以透过全部的光信息。这些光电二极管在芯片内是交叉排列的,能够最大限度地减少入射光辐射的不均匀性,从而增加颜色识别的精确度;另一方面,相同颜色的16个光电二极管是并联连接的,均匀分布在二极管阵列中,可以消除颜色的位置误差。工作时,通过两个可编程的引脚来动态选择所需要的滤波器。当选定一个颜色滤波器时,它只允许某种特定的原色通过,阻止其他原色的通过。例如:当选择红色滤波器时,入射光中只有红色可以通过,蓝色和绿色都被阻止,这样就可以得到红色光的光强;同理,选择其他的滤波器,就可以得到蓝色光和绿色光的光强。通过这三个值,就可以分析投射到TCS230传感器上的光的颜色。
S0
S1
输出频率定标
S2
S3
滤波器类型
L
L
关断电源
L
L
红色
L
H
20%
L
H
蓝色
H
L
20%
H
L
无
H
H
100%
H
H
绿色
3 分析计算
3.1 精确定位的实现
采用激光校正导航准确找到木块的位置。
激光具有3个重要特性:①高方向性(即高定向性,光速发散角小),激光束在几公里外的扩展范围不过几厘米;②高单色性,激光的频率宽度比普通光小10倍以上;③高亮度,利用激光束会聚最高可产生达几百万度的温度。激光传感器是利用激光技术进行测量的传感器,它由激光器、激光检测器和测量电路组成。激光传感器是新型测量仪表,它的优点是能实现无接触远距离测量,速度快,精度高,量程大,抗光、电干扰能力强等。
小车利用激光检测木块,在刚检测到木块右侧的时候开始前行,小车左轮的转速稍大于右轮,所以小车在前行的时候会稍微向右偏,在激光刚一检测不到木块的时候小车左转,重新检测到木块后继续前行。这样就能保证小车准确检测木块的位置。
3.2 准确计时的实现
利用定时器实现准确计时
TCCR0 = 0x04;
TCNT0 = 0x83;
TIMSK |= 0x01;
TCCR0是定时器/计数器0的控制寄存器,初值为4是普通模式,256分频,TCNT0的初值是131,加到256,共加了125次,所花的时间是8ms,每8ms 定时器计数器CPU就会在幕后进入溢出中断服务函数,然后在溢出中断服务函数里另设一个变量让每次溢出时这个变量自增1,然后经过125次溢出,即变量为125时为1s。
3.3 PWM控制实现
PWM(脉冲宽度调制)控制,通常配合桥式驱动电路实现电流电机调速,其调速范围大,工作原理为直流脉冲原理。如图5所示,若S3、S4关断,S1、S2受PWM控制,假设高电平导通,忽略快速开关管损耗,则在一个周期内的导通时间t,周期为T,波形如图12,则电机两端的平均电压为:U=Vcc*t/T=a*Vcc,其中,a=t/T称为占空比,Vcc为电源电压(电源电压减去两个开关管的饱和压降)。电机的转速与电机两端的电压成比例,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成比例,占空比越大,电机转得越快,当占空比a=1时,电机转速最大。
PWM控制波形的实现可以通过模拟电路或数字电路实现,例如用555搭成的触发电路。但是,这种电路的占空比不能自动调节,不能用于自动控制小车的调速。而目前使用的大多数单片机都可以直接输出这种PWM波形,或通过时序模拟输出,最适合小车的调速。系统使用的ATmega16通过对自身寄存器的设置,能够自己产生所需频率、占空比可调的PWM信号,用以控制电机调速。
T
t
图5 PWM控制波形
PWM控制原理:每一组PWM波用来控制一个电机的速度,而另外两个I/O口可以控制电机的正反转,控制比较简单,电路也很简单,一个L298N芯片含有8个功率管,这样简化了电路的复杂性。该系统使用AVR自带PWM CTC模式,其频率为2K赫兹。I/O口OC1A,OC1B分别输出PWM控制左右电机的速度 ;PB0、PB1控制左电机的方向,PB2、PB3控制右电机的方向。
基于上述条件我们决定采用方案二。
4 系统调试
4.1、模块测试
表1 电机驱动测试结果
正转
反转
快速
慢速
停止
左轮
正常
正常
正常
正常
正常
右轮
正常
正常
正常
正常
正常
表2 Lcd显示精度测试数据
测试次数
液晶显示时间(s)
秒表记录时间(s)
显示误差
第一次
30
30.20
0.67%
第二次
30
30.18
0.60%
第三次
29
29.24
0.83%
4.2 总体测试
采用秒表对行驶时间进行测试,并通过液晶屏显示物体的行走时间,三次运送木块所花的时间。进行多次测量,计算误差。经多次测试控制系统能够自动搜寻木块,并送入库中,偏差可控制在5%之内。调试完毕。
表6 总体性能
测试次数
第一次运送木块(s)
第二次运送木块(s)
第三次运送木块(s)
总运送时间(s)
第一次
13
16
16
45
第二次
14
15
17
46
第三次
13
16
15
44
5 创新点
1. 机械手臂采用套取的形式,以拖拽的方式搬运木块,避免抓取不牢,使木块掉落,并能使木块在仓库中摆放整齐;
2. 采用激光校正导航;
3. 系统中STC89C52最小系统板、电源板、L298驱动板等采用PCB板,避免信号干扰。
6 总结及心得体会
通过各种方案的讨论及实践,该系统车体制作为长34cm宽19cm高29.8cm,经过多次的整体软硬件结合调试,不断地对系统进行优化,小车能够完成各项功能:自动行驶,检测木块,搬运木块,自动入库,同步显示小车运行时间等。
在本次设计大赛过程中,我们学习到了很多的东西,掌握了各种相关元件的基本原理,并学会了他们的使用方法,注意事项等等。也对其他一些相关元件有了一定的了解,极大的丰富了我的课外知识,拓宽了我们的知识面。同时我们还遇到了许多突发的事件和各种困难,但通过仔细分析和积极的讨论,最终都解决了问题,在这个过程中我们深刻地体会到共同协作和团队包容的重要性,提高了分析问题解决问题的能力。参加这次比赛提高了我们的动手能力,让我们学到了很多在课堂里学不到的东西,这将使我们终身受益。
附录
器件
数量
器件
数量
ATmega16
2
直流电机
2
L298N
1
舵机
1
LCD
1
电池组
2
激光传感器
1
对管
2
7805
2
电阻、电容
若干
附表1 元器件清单
附图1 L293D驱动电路图
反射表面
发射
接收
x
4
10
x/mm
附图2 对管发射接收原理
附图3 光强度相应曲线
附图4 LM298N和二极管组成的电机驱动电路
附表2 自动搬运小车测试表 测试时间:
测试项目
要 求
测试记录
备注
基本部分
第一次搬运木块
从起始线出发,自动将木块运送到20cm库区,记录搬运时间。
木块1
T1=13s
是否入库
木块2
T2=16s
是
木块3
T3=16s
是
第二次搬运木块
从起始线出发,自动将木块运送到20cm库区,记录搬运时间。
木块1
T1=14s
是
木块2
T2=15s
是
木块3
T3=17s
是
第三次搬运木块
从起始线出发,自动将木块运送到20cm库区,记录搬运时间。
木块1
T1=13s
是
木块2
T2=16s
是
木块3
T3=15s
是
测试项目
要 求
测试记录
备注
发挥部分
第一次搬运木块
从起始线出发,自动将木块运送到10cm库区,显示单次运行时间和总运行时间,木块尽量对齐。
木块1
T1=13s
T=45s
是否入库
木块2
T2=16s
是
木块3
T3=16s
是
第二次搬运木块
从起始线出发,自动将木块运送到10cm库区,显示单次运行时间和总运行时间,木块尽量对齐。
木块1
T1=14s
T=46s
是
木块2
T2=15s
是
木块3
T3=17s
是
第三次搬运木块
从起始线出发,自动将木块运送到10cm库区,显示单次运行时间和总运行时间,木块尽量对齐。
木块1
T1=13s
T=45s
是
木块2
T2=16s
是
木块3
T3=15s
是
液晶初始化函数
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avrbit.h>
#define uchar unsigned char
#define uint unsigned int
#define P_RS BIT_PB5
#define P_RW BIT_PB6
#define P_E BIT_PB7
#define clear 0x01 //清除显示
#define home 0x02 //位址归位
#define dis_on 0x0E //0X0F 0X0C //打开显示
#define in_mode 0x06 //输入方式,地址增1,光标右移
uchar time[8];
// volatile uint ss;
uint addata;
/* void delay(uint ms)
{
uint i;
for(ms;ms>0;ms--)
for(i=0;i<9128;i++);
}
*/
void bit8_serial_input(unsigned int ix)
{
unsigned int i,j,nc;
BitPort ab;
P_E=0;
ab.W=ix;
for(i=0;i<8;i++)
{
P_RW=ab.B.bit7; //只送八位
ab.W<<=1;
P_E=1;
for(j=0;j<5;j++)
nc=0;
P_E=0;
}
}
void instruct(unsigned int dat)
{
unsigned int ch;
P_RS=1;
ch=0xf8;
bit8_serial_input(ch);
ch=dat&0xf0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0;
}
void write_abyte(unsigned int dat)
{
unsigned int ch;
P_RS=1;
ch=0xfa;
bit8_serial_input(ch);
ch=dat&0xf0;
bit8_serial_input(ch);
ch=dat<<4;
bit8_serial_input(ch);
P_RS=0;
}
void write_word(unsigned int w)
{
unsigned int ch,cl;
ch=w>>8; //先送高八位
cl=w;
write_abyte(ch);
write_abyte(cl);
}
void dis_hz_str(unsigned int x, unsigned int y, unsigned char *p_hz)
{
unsigned int loc;
unsigned char *p;
unsigned int xi;
unsigned int xline[5]={0,1,3,2,4};
x=xline[x];
instruct(home);
loc=((x<<3)+y-9)|0x80;
instruct(loc);
p=p_hz;
xi=*p++; //等价于*(p++)先得到p指向的变量的值,然后再使p++
xi<<=8;
xi|=*p++;
while(xi)
{
write_word(xi);
xi=*p++;
if(xi==0)
break;
xi<<=8;
xi|=*p++;
}
}
void dis_str(unsigned int x, unsigned int y, unsigned char *str)
{
unsigned int loc;
unsigned char *p;
unsigned int xline[5]={0,1,3,2,4};
p=str;
x=xline[x];
// instruct(home);
loc=(16*(x-1)+y-1); //y只能是奇数才能显示双字节汉字
if(loc&0x01) //如果低位是1(如果是奇数)
{
loc/=2;
instruct(loc|0x80);//如果是奇数第一个字些空格
write_abyte(' ');
}
else
{
loc/=2;
instruct(loc|0x80);//如果是偶数从第一个字节开始写
}
while(*p) //cgram是字符发生器ram
{ //可以放一些自定义的字符
write_abyte(*p++); //ddram字符显示RAM缓冲区
} //输入要显示的字符
}
void initial_screen(void)
{
unsigned int i,j,nc;
P_RS=0;
instruct(dis_on);
for(i=0;i<80;i++)
nc=0;
instruct(clear);
for(j=0;j<10;j++)
for(i=0;i<500;i++)
nc=0;
instruct(in_mode);
for(i=0;i<80;i++)
nc=0;
instruct(0x0c);
for(i=0;i<80;i++)
nc=0;
instruct(home);
for(i=0;i<60000;i++)
nc=0;
}
void itoa(int x,unsigned char *str)
{
unsigned int n;
unsigned char chn,*p,str1[8];
unsigned int i,j;
if(x<0)
{
*str++='-';
x=-x;
}
n=x;
p=str1;
j=0;
while(n!=0)
{
chn=n%10;
n=n/10;
*p++=chn+'0';
j++;
}
if(j!=0)
{
p--;
for(i=0;i<j;i++) //for 循环里可以这样写i<j
*str++=*p--;
}
else
*str++='0';
*str=0;
return;
}
时间显示程序
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avrbit.h>
#include <util/delay.h>
#include <lcd_16M.h>
#define uchar unsigned char
#define uint unsigned int
uchar asc[8],asc1[8],asc2[8],asc3[8],pp = 0;
char time_8ms = 0,f,flog=1,flag1,flag2,flag3,t=1,A=1,B=1,C=1;
uint time0 = 0,time2=0,num,a,b,c;
/*****************************************************************************
中断服务函数
*****************************************************************************/
ISR(TIMER0_OVF_vect) //Time0 溢出中断
{
TCNT0 = 0x83;
time_8ms = 1;
if(++time2 >= 126)
{
time2 = 0;
++pp;
}
}
void Init_T0() //Time0 初始化
{
TCCR0 = 0x04; //4M晶振 256分频 普通模式 4M/256=15.625K
TCNT0 = 0x83; // (256-130-1)/15.625K= 8ms
TIMSK |= 0x01; // 允许T/C0溢出中
}
void xianshi()
{
if((flag1 == 1)&&(A == 1))
{
dis_hz_str(1,1,"一次运送 秒");
dis_hz_str(3,1," ");
dis_hz_str(2,1," ");
a = pp;
A = 0;
itoa(a,asc1);
dis_str(1,12,asc1);
}
if((flag2 == 1)&&(B == 1))
{
dis_hz_str(2,1,"二次运送 秒");
b = pp;
B = 0;
itoa(b,asc2);
dis_str(2,12,asc2);
}
if((flag3 == 1)&&(C ==1))
{
dis_hz_str(3,1,"三次运送 秒");
c = pp;
C = 0;
itoa(c,asc3);
dis_str(3,12,asc3);
BIT_PB0 = 0;
cli();
}
}
/******************************************************************************/
/******************************************************************************/
int main()
{
DDRA = 0xfc;
DDRB = 0xff;
PORTB = 1;
initial_screen();
dis_hz_str(2,1,"搬运机器人 ");
dis_hz_str(3,1,"搜寻木块 ");
dis_hz_str(1,1,"东北农业大学 ");
dis_hz_str(4,1,"总用时: 秒");
Init_T0();
asm("sei");
while(1)
{
xianshi();
num = pp;
itoa(num,asc);
dis_str(4,12,asc);
if(P_A0 == 0)
{
if(flog == 1)
{
switch(t)
{
case 1:flag1 = 1;t++;break;
case 2:flag2 = 1;t++;break;
case 3:flag3 = 1;break;
}
flog = 0;
f = 1;
}
}
if(f == 1)
{
if(time_8ms == 1)
{
time_8ms = 0;
if(++time0 >= 500)
{
time0 = 0;
flog = 1;
f = 0;
}
}
}
}
}
小车程序
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avrbit.h>
#define uchar unsigned char
#define uint unsigned int
#define TurnSpeed_RQQQ 0x0014 //右轮快 做了调整
#define TurnSpeed_QQQ 0x0000
#define TurnSpeed_D 0x03ff //大弯
#define TurnSpeed_Z 0x02ff //中弯
#define TurnSpeed_X
展开阅读全文