机器人项目研究报告

时间:2024.4.20

机器人项目研究报告

有一位同学过生日,我们去买生日蛋糕时就想,能否自己制作一台机器人,让机器人来做我们自己设计的蛋糕。

  机器人做蛋糕的好处在于它还可以完成一些手工难以精确绘制的图形,比如圆锥曲线或者比较复杂的几何图形组之类。此外,若把原材料换一下,改一下机器结构,就能让它做煎饼,做冰淇淋。所以说,这个机器人还可以有更广泛的外延应用。

  经过调查,我们在网上和资料中没有发现任何团体或个人正在制作或已经做出类似的产品。

  我们的基本思路是:由中心电机将蛋糕坯带入加工的各个工序,气动系统配合液压系统将奶油挤至蛋糕上,刮板将奶油刮平,单片机协调双步进电机配合控制奶油嘴进行二维定位,在蛋糕表面喷出美丽的图案。机器人的结构和框架的主材料——使用铝角钢。喷花奶油罐——我们将兽医注射器改造,并使其上部推压板与气筒固定为一体,这样当气筒通气时,气筒拉杆收缩,注射器便能挤出奶油。对于抹平奶油罐——我们同样利用气筒拉杆的推动,自制活塞将奶油挤出。

在蛋糕坯上抹奶油的部分模拟了蛋糕师的抹平工具,奶油挤出后下部转盘配合旋转,上板将蛋糕上表面奶油刮平,多余奶油挤至侧边,同时侧板开了槽,这样能直接刮出侧表面的花纹。喷花奶油嘴的精确定位——我们采用极坐标计算方式,以圆盘中心为原点建立极坐标系,将图形中的线转化为两个步进电机的转角、转速,同时计算单片机给步进电机脉冲的相应频率,由单片机协调双电机实现奶油嘴按特定路径的精确定位。单片机使用了AVR ATmega128单片机作为内核,我们自己设计制做了外部电路。所有的机械结构和软件程序都是由我们自主设计并制作的。

仿生六足探测机器人研究报告

          

一、课题背景:

仿生运动模式的多足步行机器人具有优越的越障能力,它集仿生学原理、机构学理论、自动控制原理与技术、计算机软件开发技术、传感器检测技术和电机驱动技术于一体。

不论在何种地面上行走,仿生六足机器人的运动都具有灵活性与变化性,但其精确控制的难度很大,需要有良好的控制策略与精密的轨迹规划,这些都是很好的研究题材。

二、项目创新点:

作为简单的关节型伺服机构,仿生六足机器人能够实现实时避障,合理规划行走路线。

简单的关节型机器人伺服系统不仅具有可批量制造的条件,作为今后机器人群系统的基本组成,也可以作为探索复杂伺服机构的研究对象。

三、研究内容:

1.仿生学原理分析:

 仿生式六足机器人,顾名思义,六足机器人在我们理想架构中,我们借鉴了自然界昆虫的运动原理。

 足是昆虫的运动器官。昆虫有3对足,在前胸、中胸和后胸各有一对,我们相应地称为前足、中足和后足。每个足由基节、转节、腿节、胫节、跗节和前跗节几部分组成。基节是足最基部的一节,多粗短。转节常与腿节紧密相连而不活动。腿节是最长最粗的一节。第四节叫胫节,一般比较细长,长着成排的刺。第五节叫跗节,一般由2-5个亚节组成﹔为的是便于行走。在最末节的端部还长着两个又硬又尖的爪,可以用它们来抓住物体。

行走是以三条腿为一组进行的,即一侧的前、后足与另一侧的中足为一组。这样就形成了一个三角形支架结构,当这三条腿放在地面并向后蹬时,另外三条腿即抬起向前准备替换。

前足用爪固定物体后拉动虫体向前,中足用来支持并举起所属一侧的身体,后足则推动虫体前进,同时使虫体转向。

这种行走方式使昆虫可以随时随地停息下来,因为重心总是落在三角支架之内。并不是所有成虫都用六条腿来行走,有些昆虫由于前足发生了特化,有了其他功用或退化,行走就主要靠中、后足来完成了。

大家最为熟悉的要算螳螂了,我们常可看到螳螂一对钳子般的前足高举在胸前,而由后面四条足支撑地面行走。

参考以上的昆虫足部结构,我们想出了较简单的方式来表达。一支脚共有两个关节(假设没有爪的情况下),一个关节采左右式移摆;另一个关节则是采偏摆式,使脚可提高,当做上下运动的一种,结构设计图如下。

2.运动学分析:

    六足步行机器人的步态是多样的,其中三角步态是六足步行机器人实现步行的典型步态。

三角步态介绍:

“六足纲” 昆虫步行时,一般不是六足同时直线前进,而是将三对足分成两组,以三角形支架结构交替前行。目前,大部分六足机器人采用了仿昆虫的结构,6条腿分布在身体的两侧,身体左侧的前、后足及右侧的中足为一组,右侧的前、后足和左侧的中足为另一组,分别组成两个三角形支架,依靠大腿前后划动实现支撑和摆动过程,这就是典型的三角步态行走法,如下图所示。图中机器人的髋关节在水平和垂直方向上运动。此时,B、D、F 脚为摆动脚,A、C、E脚原地不动,只是支撑身体向前。由于身体重心低,不用协调Z向运动,容易稳定,所以这种行走方案能得到广泛运用。

 

(2)机器人行走步态分析:

项目设计共使用12个舵机用于步态实现。每条腿上有两个舵机,分别控制髋关节和膝关节的运动,舵机安装呈正交,构成垂直和水平方向的自由度。由于腿只有水平和垂直平面的运动自由度,所以只考虑利用三角步态实现直线行走。分别给12个舵机编号(1~12),如图所示。

直线行走步态分析

由1、2、5、6、9、10 号舵机控制的A、C、E腿所处的状态总保持一致(都是正在摆动,或者都在支撑);同样,3、4、7、8、11、12 所控制的B、D、F腿的状态也保持一致。当处在一个三角形内的3 条腿在支撑时,另3条腿正在摆动。支撑的3条腿使得身体前进,而摆动的腿对身体没有力和位移的作用,只是使得小腿向前运动,做好接下去支撑的准备。步态函数的占空系数为 0.5,支撑相和摆动相经过调整,达到满足平坦地形下的行走步态要求和稳定裕量需求。

转弯步态分析

项目设计的机器人采用以一中足为中心的原地转弯方式实现转弯,下图为右转的示意图,图中E腿为支撑中足。右转弯运动的过程如下:1)首先A、C、E 腿抬起,然后A、C 腿向前摆动,E腿保持不动,B、D、F腿支撑。2)A、C、E腿落地支撑,同时B、D、F腿抬起保持不动。3)A、C腿向后摆动。整个运动过程中B、D、E、F 不做前后运动,只是上下运动。

 

3.结构设计:

六足机器人的基本结构的设计主要包括机器人足部关节自由度转换结构的设计和躯干整体支架的设计。

  (1)足部结构:

仿生六足机器人足部机构主要是电机间的链接与自由度转换结构。

采用Auto公司开发的3D机械制图软件辅助设计的方法,分析电机尺寸,设计固定作用的固定架,传动作用的U型架。

    

结构通过平面钣金加工制作,通过紧固件进行基本结构件的连接。

基本足部自由度转换结构设计实物图。

  (2)躯干结构:

经过改进后的机器人躯干结构在结构设计软件中的设计图如下

 

  躯干结构模拟图                       整体结构模拟图

4.驱动器与驱动原理:

仿生六足机器人采用电动驱动的方式进行驱动

驱动器采用微型直流角位移伺服电动机【舵机】。

舵机原理

舵机是一种结构简单的、集成化的直流伺服系统,其内部结构由直流电机、减速齿轮、电位计和控制电路组成。舵机采用的驱动信号是脉冲比例调制信号(PWM),即在通常为20ms 的周期内,输入以0.5~2.5ms 变化的脉冲宽度,对应的转角范围从O°变化到180°,脉冲宽度与转角呈线性关系[5]。控制信号线提供一定脉宽的脉冲时,其输出轴保持在相对应的角度上。若舵机初始角度状态在0°位置,那么电机只能朝一个方向运动,所以初始化的时候,应将所有电机的位置定在90° 的位置。六足机器人腿部偶数舵机转轴为垂直运动,控制机器人腿部抬起和放下;奇数舵机转轴为水平转动,控制机器人腿部前进和后退。

舵机控制方法

 标准的舵机有3条导线,分别是:电源线、地线、控制线。

电源线和地线用于提供舵机内部的直流电机和控制线路所需的能源.电压通常介于4~6V,一般取5V。给舵机供电电源应能提供足够的功率。控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20 ms(即频率为50 Hz)。当方波的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比。某型舵机的输出轴转角与输入信号的脉冲宽度之间的关系可用下图表示。

 从上述舵机转角的控制方法可看出,舵机的控制信号实质是一个可嗣宽度的方波信号(PWM)。该方波信号可由FPGA、模拟电路或单片机来产生。采用FPGA成本较高,用模拟电路来实现则电路较复杂,不适合作多路输出。一般采用单片机作舵机的控制器。

(2)选型:

 辉盛SG90舵机

 参数:扭矩:1.5KG/CM  死区:10us  转速:0.12秒/60度(4.8V) 重量:9克

       尺寸:21.5mmX11.8mmX22.7mm  工作电压4.8V-6V

5.控制电路的硬件设计

 (1)电源模块--驱动电路和抗干扰技术

 双电源供电:

舵机内部是直流电机驱动,在带载时启停的瞬间会产生较大的峰值电流,将舵机供电电源与 MCU和IC的供电电源分开,双线供电能保证控制电路不受驱动电路产生不稳定脉冲的干扰。

为保证驱动器电源输入的稳定性,结合电路抗干扰技术,采用合适方法保证电路抗脉冲干扰、抗低频干扰、抗共模干扰的能力,使12个电机的多驱动系统能够稳定工作。

电源采用,镍氢电池7.4V,1200mA,15CC;    

控制电路电源输入由1117低压差电压调节转换电路提供。

 

驱动电路电源由LM2596 DC-DC直流开关电压转换电路提供。

     (2)控制核心--单片机接口电路和传感器检测

控制电路主要由1602显示调试屏幕,12路舵机控制输出,抗干扰等部分组成,结合PROTEUS仿真技术,分析控制程序。原理图如下:

 

    

6.计算机与软件开发:

单片机主控系统:AVR单片机 ATmega16

软件设计的基本思想软件的主要功能是使机器人在向前行进的过程中能够

避开障碍物,即对12 个舵机进行调度和控制。可将软件功能分解为:要避开障碍物,首先应探测到障碍物,其次能绕开障碍物,这就要求机器人能完成前进、后退、左右转弯等动作。动作协调完美性的实现,要求了在任一时刻能够做出12个舵机的同步动作控制。

软件设计中首先将前进、后退、左右转弯等高层动作分解,具体到完成一个动作各个舵机所要完成的动作和时序。采用模块化的设计思想,将对所有舵机的调度做成一个独立的模块,所有的高层动作都是通过调用底层舵机控制的模块来完成。多个舵机的控制是采用多舵机分时控制的思想来实现的。程序采用C语言模块化程序设计的基本思路程序模块如下。

 (1)驱动模块:

12路PWM驱动信号通过软件计数法多路输出利用MCU片内定时器和I/O模块控制输出多路占空比可调的PWM控制信号

多舵机分时控制思想

由于单片机在某一时刻只能对一个中断进行响应,所以一个单片机驱动多个舵机的条件是每个舵机产生的中断时间间隔必须相互错开。由于舵机的驱动周期内的2 次电平变化的最短时间是高电平的脉宽时间,即0.5~2.5ms,那么在不产生冲突的情况下,若分时对多个舵机产生驱动信号,则最多可实现的驱动舵机数量为20/2.5=8。就是说一个单片机最多可以控制8 个舵机运行在完整转角空间。采用多舵机分时控制的思想,可实现对12个舵机的协调控制。将12 个舵机分成两组,定时器0 控制舵机1~6,定时器1 控制舵机7~12,每个定时器在一个周期内将产生12次定时器中断。使数据发生错误也很难连续起来,大大提高整体的纠错能力。

  (2)动作模块:

将计算得到的机器人运动数据封装为前进、后退、左转、右转的动作函数子程序。设计电机控制的速度伺服、角度伺服程序,采用流程控制法调用动作函数。

  (3)传感器模块:

针对传感器检测的输入,传感器检测使用 AVR单片机片内引脚中断资源,并且对不稳定信号进行软件滤波处理,增加控制系统的稳定性。

      (4)1602液晶显示调试模块:

1602液晶显示模块显示程序运行情况,作为程序调试的重要工具。通过单片机IO口引脚发送数据,指令信息,显示当前舵机实时运行状态。

   (5) 全局控制上位机程序:

整合多模块,形成系统化控制结构图如下。

 

四、项目总结

     完成的设计:

                 1.仿生学原理分析

                 2.机构学理论分析

                 3.自动控制系统设计

                 4.计算机软件开发

                 5.传感器检测控制系统设计

                 6.电机驱动电路设计

     达到的要求:

                 1.控制系统对12路驱动器的稳定角度控制,速度控制。

                 2.整体结构与行走步态稳定性达到要求。

                 3.多种静态步态与传感器检测控制一体化的实现。

                 4.机器人能够快速准确探测前方障碍物,针对不同情况探索行进路线。

     项目成果总结:

     项目已经设计制作出三代机器人样本实物,经过实际行走测试,稳定性,速度,蔽障性能等参数达到甚至超过预先设定的指标。

   机器人相关参数与性能指标如下:

  

   重量:460g

   尺寸:160*100*40mm

   平均行走速度:0.06m/s

   平均功率:1.2A*5V=6W

   探测响应时间:约0.5s

  

   能够在平地上进行前进、后退、左转、右转等稳定步行能够准确探测前方障碍物,根据不同情况执行合适的步态,探索行走路径

    

     

    

五.附录程序:

//===========主程序  main.c================//

#include <avr/io.h>

#include <util/delay.h>

#include <1602LCD.h>

#include <avr/interrupt.h>

#define uchar unsigned char

#define uint unsigned int

uchar f[12];

uchar m[12][7];

uchar sign,rooptime,roopnum;

uchar direc;

uchar canmove=1;

uchar run=0;

char parameter[12]={9,-9,-15,3,9,-3,-13,6,8,9,-14,-10};

void sys_init(void)

 {

DDRA=0xe0;

DDRB=0xff;

DDRC=0xff;

DDRD=0x0f;

PORTA=0x1f;

PORTB=0x00;

PORTC=0x00;

PORTD=0xf0;

 TCCR2=0x0a;  

 OCR2=10;   

 TIMSK|=0x80;  

Lcd_init();

_delay_ms(1000);

}

void residual(void)

{

uchar i,j;

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

f[i]+=parameter[i];

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

  for(j=0;j<7;j++)

m[i][j]+=parameter[i];

}

void gait1(void)//动作函数  前进

{

uchar i;

roopnum=4;

rooptime=6;

sign=0;

i=0;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=1;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=2;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=3;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=4;

m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=5;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=6;

m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=7;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=8;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=9;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=10;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=11;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

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

f[i]=m[i][3];

residual();

}

void gait2(void)//动作函数  后退

{

uchar i;

roopnum=4;

rooptime=6;

sign=0;

i=0;

m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=1;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=2;

m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=3;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=4;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=5;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=6;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=7;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=8;

m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=9;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=10;

m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=11;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

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

f[i]=m[i][3];

residual();

}

void gait3(void)//动作函数  左转

{

uchar i;

roopnum=4;

rooptime=6;

sign=0;

i=0;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=1;

m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=2;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=3;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=4;

m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=5;

m[i][0]=150;m[i][1]=155;m[i][2]=150;m[i][3]=145;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=6;

m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=7;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=8;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=9;

m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=10;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=11;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

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

f[i]=m[i][3];

residual();

}

void gait4(void)//动作函数  右转

{

uchar i;

roopnum=4;

rooptime=6;

sign=0;

i=0;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=1;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=2;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=3;

m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=4;

m[i][0]=150;m[i][1]=150;m[i][2]=140;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=5;

m[i][0]=150;m[i][1]=140;m[i][2]=150;m[i][3]=160;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=6;

m[i][0]=160;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=7;

m[i][0]=150;m[i][1]=155;m[i][2]=150;m[i][3]=145;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=8;

m[i][0]=140;m[i][1]=150;m[i][2]=150;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=9;

m[i][0]=150;m[i][1]=160;m[i][2]=150;m[i][3]=140;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=10;

m[i][0]=150;m[i][1]=150;m[i][2]=160;m[i][3]=150;m[i][4]=0;m[i][5]=0;m[i][6]=150;

i=11;

m[i][0]=150;m[i][1]=145;m[i][2]=150;m[i][3]=155;m[i][4]=0;m[i][5]=0;m[i][6]=150;

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

f[i]=m[i][3];

residual();

}

ISR(TIMER2_COMP_vect)    //定时器2比较匹配中断

{

  static uint time=0,rtime;

  uchar i;

  time++;

  if(time==2000)

    {

      PORTB=0xff;

      PORTD=0xff;

      time=1;

    }

 

  if(time==1000&&canmove)

   {

   if(rtime<rooptime) rtime++;

   else {rtime=0;

           sign++;   

           if(sign==roopnum)  sign=0;

           }

  

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

      {

   

      if(sign==0)

      f[i]=((rooptime-rtime)*m[i][roopnum-1]+rtime*m[i][0])/rooptime;

      else

      f[i]=((rooptime-rtime)*m[i][sign-1]+rtime*m[i][sign])/rooptime;

     

      }

     

    }

  if(time<400&&time>0)

  {

    if(f[0]==time+100) PORTB&=0xfe;

    if(f[1]==time+100) PORTB&=0xfd;

    if(f[2]==time+100) PORTB&=0xfb;

    if(f[3]==time+100) PORTB&=0xf7;

    if(f[4]==time+100) PORTB&=0xef;

    if(f[5]==time+100) PORTB&=0xdf;

    if(f[6]==time+100) PORTB&=0xbf;

    if(f[7]==time+100) PORTB&=0x7f;

    if(f[8]==time+100) PORTD&=0xfe;

    if(f[9]==time+100) PORTD&=0xfd;

    if(f[10]==time+100) PORTD&=0xfb;

    if(f[11]==time+100) PORTD&=0xf7;

    }

 if(time==400)  {PORTB&=0x00;PORTD&=0xf0;}

 

 }

uchar getkey(void)

{

uchar key;

 if((PINA&0x1f)!=0x1f)

    {

      _delay_us(50);

      if((PINA&0x1f)!=0x1f)

        {

        key=(PINA&0x1f);

        while((PINA&0x1f)!=0x1f);

        return key;

        }

    }

  return 0;

}

int main( void )  

{

uchar flag,flag1;

flag=0;

uint run=0;

sys_init();

 _delay_ms(1000);

sei();     //开总中断

gait1();

for(;;)

{

flag1=(PIND&0xc0);

if(flag!=flag1&&run>5000)

{

if(flag1==0xc0)

{

flag=flag1;

cli();

 _delay_ms(10);

gait1();

sei();

}

if(flag1==0x00)

{

flag=flag1;

cli();

 _delay_ms(10);

gait2();

sei();

}

if(flag1==0x40)

{

flag=flag1;

cli();

 _delay_ms(10);

gait4();

sei();

}

if(flag1==0x80)

{

flag=flag1;

cli();

 _delay_ms(10);

gait3();

sei();

}

run=0;

}

run++;

};

}

//===========1602.h================//

#ifndef USE_1602LCD_H_

#define USE_1602LCD_H_

#include <avr/io.h>

#include <util/delay.h>

#define uchar unsigned char

#define uint unsigned int

#define Com_Port PORTA          //指令口

#define Print_Port PORTC         //数据口

#define RS_set Com_Port|=(1<<7)

#define RS_clr Com_Port&=~(1<<7)

#define RW_set Com_Port|=(1<<6)

#define RW_clr Com_Port&=~(1<<6)

#define E_set Com_Port|=(1<<5)

#define E_clr Com_Port&=~(1<<5)

extern void Lcd_init(void);

extern void Show_char(uchar x,uchar y,uchar c);

extern void Show_str(uchar x,uchar y,uchar *s);

extern void Show_num(uchar x,uchar y,uchar num,uchar j);

#endif

//===========1602.c================//

#include <1602LCD.h>

void Write_com(uchar com)

{

 RS_clr;

 RW_clr;

 E_set;

 Print_Port=com;

 _delay_us(50);

 E_clr;

}

void Write_data(uchar data)

{

 RS_set;

 RW_clr;

 E_set;

 Print_Port=data;

 _delay_us(50);

 E_clr;

}

void Show_char(uchar x,uchar y,uchar c)

{

  if (y == 0)

    {    

      Write_com(0x80 + x);    

      }   

 else

   {    

     Write_com(0xC0 + x);    

     }       

 Write_data(c);

}

void Show_num(uchar x,uchar y,uchar num,uchar j)

{

j--;

if(!num) {Show_char(x,y,48);j--;x--;}

do

{

if(num%10)

{Show_char(x,y,num%10+48);}

else { if(!num)  Show_char(x,y,27); 

         else     Show_char(x,y,num%10+48);

        }

num/=10;

x--;

}

while(j--);

}

void Show_str(uchar x,uchar y,uchar *s)

{

 if (y == 0)

 {    

 Write_com(0x80 + x);    

 }

 else

 {    

 Write_com(0xC0 + x);    

 }       

 while (*s)

 {    

 Write_data( *s);    

 s ++;    

 }

}

void Lcd_init(void)

{

   Write_com(0x38);    /*显示模式设置*/

   _delay_ms(5);

   Write_com(0x38);

   _delay_ms(5);

   Write_com(0x38);

   _delay_ms(5);

   Write_com(0x38); 

   Write_com(0x08);    /*显示关闭*/

   Write_com(0x01);    /*显示清屏*/

   Write_com(0x06);    /*显示光标移动设置*/

   _delay_ms(5);

   Write_com(0x0C);    /*显示开及光标设置*/

}

更多相关推荐:
机器人行业深度投研报告

机器人行业深度投研报告第一部分全球机器人行业发展趋势一全球机器人行业重点企业股价趋势在研究机器人龙头企业股价过程中我们发现这些企业的股价无论是在一个较长的时间内还是在近几年都呈现上涨的态势从全球范围看机器人行业...

中国工业机器人产业分析研究报告

工业机器人产业分析研究报告一我国工业机器人发展我国机器人研究开始于20世纪70年代至今已有30多年19xx年北京机械工业自动化研究所曹祥康在江苏嘉兴召开了全国性机械手技术交流大会是我国第一个以机器人为主题的大型...

服务机器人发展战略研究报告(20xx-20xx)

20xx20xx年服务机器人市场投资分析及发展战略研究报告目前我国已步入老龄化社会劳动力人口所占比重正在逐年下滑20xx年末我国1559岁人口为93727万人占总人口比重为692人数比上年末减少345万人比重较...

20xx年中国服务机器人市场研究报告

智研数据研究中心20xx20xx年中国服务机器人市场前景研究与投资战略分析报告20xx20xx年中国服务机器人市场前景研究与投资战略分析报告出版日期20xx8报告价格印刷版RMB7000电子版RMB7200印刷...

中国特种机器人行业市场分析与发展趋势研究报告-灵核网

中国行业研究门户灵动核心产业研究院20xx20xx年中国特种机器人行业发展现状与投资分析报告报告编号A00029779中国行业研究门户httpldhxcncom行业研究是进行资源整合的前提和基础属于企业战略研究...

20xx-20xx年中国机器人行业全景调研及未来前景预测报告

机器人什么是行业研究报告行业研究是通过深入研究某一行业发展动态规模结构竞争格局以及综合经济信息等为企业自身发展或行业投资者等相关客户提供重要的参考依据企业通常通过自身的营销网络了解到所在行业的微观市场但微观市场...

中国服务机器人行业现状与投资分析报告-灵核网

中国行业研究门户灵动核心产业研究院20xx20xx年中国服务机器人行业现状与投资分析报告报告编号A00029441中国行业研究门户httpldhxcncom行业研究是进行资源整合的前提和基础属于企业战略研究范畴...

20xx年中国工业机器人市场深度调查报告

智研咨询专业市场调研报告网站20xx20xx年工业机器人行业全景调研与市场竞争态势报告客服QQ992930161交付方式Email电子版特快专递价格纸介版7000元电子版7200元纸介电子7500元文章来源报告...

智能机器人行业研究报告

智能机器人行业研究报告一行业概况1行业监管体制主要法律法规及政策1行业监管我国现行智能制造装备行业管理体制为国家宏观指导下的市场竞争体制宏观调控归属于国家发改委科技部工信部以及商务部主要通过研究制定产业政策提出...

中国服务机器人行业现状与投资分析报告-灵核网

中国行业研究门户灵动核心产业研究院20xx20xx年中国服务机器人行业现状与投资分析报告报告编号A00029441中国行业研究门户httpldhxcncom行业研究是进行资源整合的前提和基础属于企业战略研究范畴...

20xx-20xx年中国物流机器人行业市场发展现状研究及投资战略咨询报告

中金企信北京国际信息咨询有限公司国统调查报告网20xx20xx年中国物流机器人行业市场发展现状研究及投资战略咨询报告第一章20xx20xx年全球物流机器人行业发展分析第一节20xx20xx年世界物流机器人行业发...

20xx-20xx年中国服务机器人市场深度调研及投资策略分析报告

服务机器人什么是行业研究报告行业研究是通过深入研究某一行业发展动态规模结构竞争格局以及综合经济信息等为企业自身发展或行业投资者等相关客户提供重要的参考依据企业通常通过自身的营销网络了解到所在行业的微观市场但微观...

机器人研究报告(22篇)