注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hellorobot

全民机器人,零起步实现你童年的梦想

 
 
 

日志

 
 

六足红外遥控避障示例_动作组版  

2013-09-04 18:09:41|  分类: 51单片机与机器人 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
//先将动作下载到舵机板中//

#include <STC12C5A60S2.h> 
#define uchar unsigned char 
uchar data    IRcode[4];   //定义一个4字节的数组用来存储代码 
uchar     CodeTemp;   //编码字节缓存变量 
uchar     i,j,k,aa;    //延时用的循环变量 
sbit     IR=P3^2;   //接收头OUT端直接连P3.2(INT0) 
sbit LEDUP = P3^4; //上
sbit LED = P3^3;   //前(容易受到左右腿的干扰,不加)
sbit LEDL = P3^6;  //左
sbit LEDR = P3^5;  //右

/**************************延时0.9ms子程序**********************/ 
void Delay0_9ms(void) 
uchar i,j; 
   for(i=12;i>0;i--) 
   for(j=180;j>0;j--) ; 
/***************************延时1ms子程序**********************/ 
void Delay1ms(void) 
uchar i,j; 
   for(i=12;i>0;i--) 
   for(j=230;j>0;j--) ; 
/***************************延时4.5ms子程序**********************/ 
void Delay4_5ms(void) 
uchar i,j; 
   for(i=60;i>0;i--) 
   for(j=225;j>0;j--) ; 
/**************************** 延时子程序 ************************/ 
void Delay(void) 
uchar i,j,k; 
for(i=60;i>0;i--)   
   for(j=200;j>0;j--) 
   for(k=10;k>0;k--) ; 

void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/************************串口发送***********************************/ 
void UART_T (uchar UART_data) 
SBUF = UART_data; //将接收的数据发送回去 
while(TI == 0);  //检查发送中断标志位 
TI = 0;  //令发送中断标志位为0(软件清零) 
void UART_TC (unsigned char *str) 
while(*str != '\0') 
UART_T(*str); 
*str++; 
*str = 0; 
/************************中断0解码服务子程序**********************/ 
void int0(void) interrupt 0 using 2        
EA=0; 
for(k=0;k<10;k++)     //不同型号请改成5/10 
Delay0_9ms(); 
   if (IR==1)         //如果0.9ms后IRsignal=1,说明不是引导码 
   { 
k=10;break; 
   else if(k==9)           //如果持续了10×0.9ms=9ms的低电平,说明是引导码 
   { 
while(IR==0); 
      Delay4_5ms();        //跳过持续4.5ms的高电平 
      for(i=0;i<4;i++)       //分别读取4个字节 
      { 
for(j=1;j<=8;j++)      //每个字节8个bit的判断 
         {  
while(IR==0);       //等待上升沿 
            Delay0_9ms();      //从上升沿那一时刻开始延时0.9ms,再判断IRsignal 
            if(IR==1)     //如果IRsignal是"1",则向右移入一位"1" 
            { 
Delay1ms(); 
               CodeTemp=CodeTemp|0x80; 
               if(j<8) CodeTemp=CodeTemp>>1; 
            } 
            else 
        if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0" 
         IRcode[i]=CodeTemp; 
         CodeTemp=0; 
      } 
    Delay(); 
Delay(); 
   } 
aa=1; 
EA=1; 
/***********************动作指令*********************/ 
void forward (){  //前进
  
 UART_TC("#3G1C\r\n"); 
 }

void back (){  //后退
  
 UART_TC("#4G1C\r\n"); 
 }

void left (){  //左转
  
 UART_TC("#5G1C\r\n");
 }

void right (){  //右转
 
 UART_TC("#6G1C\r\n");
 }
 void DD (){  //待定
 
 UART_TC("#1G1C\r\n"); 
 }
 void SLEEP (){  //休息
  UART_TC("#2G1C\r\n"); 

 }

 
 

 


/***********************串口初始化程序*********************/ 
void initUart(void) 
{   
 PCON |= 0x80;  //使能波特率倍速位SMOD
 SCON = 0x50;  //8位数据,可变波特率
 AUXR |= 0x40;  //定时器1时钟为Fosc,即1T
 AUXR &= 0xfe;  //串口1选择定时器1为波特率发生器
 TMOD &= 0x0f;  //清除定时器1模式位
 TMOD |= 0x20;  //设定定时器1为8位自动重装方式
 TL1 = 0xFA;  //设定定时初值
 TH1 = 0xFA;  //设定定时器重装值
 ET1 = 0;  //禁止定时器1中断
 TR1 = 1;  //启动定时器1
/**************************主程序*************************/ 
void main() 
{  
uchar a; 
initUart(); 
IT0=1;    //INT0为负边沿触发, (1:负边沿触发,0:低电平触发) 
EX0=1;    //外部中断INT0开, (1:开,      0:关    ) 
EA=1;    //开所有中断 
CodeTemp=0;    //初始化红外编码字节缓存变量 
Delay(); 
  UART_TC("#1G1C\r\n"); 
while(1) 
{if(LED==0){
  DELAY_MS (300);        //参照视频,当手在六足面前前后移动,时间不超过300ms六足就会前进,超过300ms就后退
  if(LED==0){
  
  back ();
  DELAY_MS (100);
  
  
  //while(LED==0);   //可以把双斜杠去掉试试效果
}
       else{
       forward ();

        DELAY_MS (100);
}
}
if(LEDUP==0){
  DELAY_MS (10);
  if(LEDUP==0){
  SLEEP ();

 //while(LEDL==0); 
 
  
  DELAY_MS (100);
  
  
}
}
if(LEDL==0){
  DELAY_MS (10);
  if(LEDL==0){
  left ();

 //while(LEDL==0); 
 
  
  DELAY_MS (100);
  
  
}
}
if(LEDR==0){
  DELAY_MS (10);
  if(LEDR==0){
  right ();
 //while(LEDR==0); 
 
  
  DELAY_MS (100);
  
  
}
if(aa==1) 
for(a=0;a<2;a++)  { 
if(IRcode[a]==0xff){
for(a=2;a<3;a++){

switch (IRcode[a]){

 case 0x45:                    //电源键
  DD(); 
  break;
 case 0x47:                    //menu
  SLEEP(); 
  break;
 case 0x40:                    //+
  forward();
  break;
 case 0x19:                    //-
  back();
  break;
 case 0x07:                    //<<
  left();
  break;
 case 0x09:                    //>>
  right();
  break;
 case 0x15:                    //>
  UART_TC("#20G1C\r\n"); 
  break;
 case 0x44:                    //test
  UART_TC("#7G1C\r\n"); 
  break;
 case 0x43:                   //返回
  UART_TC("#8G1C\r\n"); 
  break;
 case 0x0D:                   //C
  UART_TC("#9G1C\r\n"); 
  break; 
 case 0x16:                   //0键
  UART_TC("#10G1C\r\n"); 
  break;
 case 0x0C:                   //1
  UART_TC("#11G1C\r\n");  
  break;
 case 0x18:                   //2
  UART_TC("#12G1C\r\n"); 
  break;
 case 0x5E:                   //3
  UART_TC("#13G1C\r\n"); 
  break;
 case 0x08:                   //4
  UART_TC("#14G1C\r\n"); 
  break;
 case 0x1C:                   //5
 UART_TC("#15G1C\r\n"); 
  break;
 case 0x5A:                   //6
  UART_TC("#16G1C\r\n"); 
  break;
 case 0x42:                   //7
  UART_TC("#17G1C\r\n"); 
  break;
 case 0x52:                   //8
  UART_TC("#18G1C\r\n"); 
  break;
 case 0x4A:                   //9
 UART_TC("#19G1C\r\n"); 
  break;

 default:
  break;
  
}

}
}


 } 

    Delay(); 
aa=0; 
}
  评论这张
 
阅读(1645)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017