⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiao1zhushi.c

📁 我们实验室智能小车源码
💻 C
字号:
#include "m16io.h"
/*一共9个按键*/

#define TIME1  50-1     /*一毫秒脉宽是扰动,检测的信号脉宽必须大于一毫秒*/
#define TIME2  500-1    
#define TIME3  12500-1   
#define RUN       0x600  
#define BACK      0x604  
#define LEFT      0x184  
#define RIGHT     0x180  
#define STOP      0x120  
#define REMOTE    0X48
#define SAFE_H    0X1e
#define SAFE_L    0x420
#define OVER      0x4c
#define AOTO      0x7e
 
void portinit(void);     
void pwminit(void);         
void caroperation(void);/*红外马 比较*/
void wait(unsigned int k );  
void wait_1(unsigned int k ); 
void run(void);  
void back(void);
void right_c(void); 
void left_c(void);  
void left(unsigned int k );  
void right(unsigned int k );
void stop(void);
void pwminit(void);  
void remote(void);    /*预编成的遥控程序*/

void main(void);
int  ircode;       


void main(void)
{	
  unsigned char temp1, temp2;   /*temp1用于接收记录当前port7_0的当前值,temp2定义为0x00,两者进行当前比较*/
  unsigned presentbit;          /*红外码的当前位*/
  unsigned int n;               
  static int s;                 /*保存的按键值,键码*/
  int s_h[5];                   /*方向指令数组,前后左右的方向指令*/
  int s_l[5];                   /*持续时间的数组*/
  int j=0;                   
  int k=0;
  int i;
  int safe1,safe2 ;              /*自锁*/
  int tempcode;                  /*记录当前红外码*/ 
  int pluswidth;                 /*当前电平持续时间*/
  int time1;                     
  int time2;
  int time3;
  
  portinit();       
  pwminit();        
  port_0 = 0x00;    
  
  while(1)
  {
    temp1 = ( port_7&0x01 ); /*7口是干什么的?初始值是多少?与0x01相与的用意是什么?*/
    if (temp1 == 0x00)       /*如果相与的结果为0x00*/
    {
      
       ta0 = TIME3;       /*定时器0赋值*/
       tabsr |= 0x01;   /*关闭计时器*/
/*三个time变量都赋值为25ms是什么意思,有什么意义*/
       time1 = TIME3; 
       time2 = TIME3; 
       time3 = TIME3;  
       temp2 = 0x00;       /*temp2赋值为0x00的意义是什么*/ 
       presentbit = 0x00;  /*当前的控制信号码*/
       tempcode = 0x00;    /*累加值*/


//累加解码
 
       while( ta0>10 )   /*定时器0的值大于10(十进制?)是什么意思*/
       {  	 
           temp1 = ( port_7&0x01 ); /*7口第二次与0x01相与的用意是什么?*/
           if(temp1 != temp2)       /*temp2此时等于0x00*/
           {
               time1 = ta0;            /*把定时器0的值给与time1*/
               pluswidth= time2-time1; /*脉宽=25ms-定时器0的值*/
               time2 = time1;          /*把定时器0的值给与time2*/

	       if( pluswidth<TIME1 )	/*若脉宽值小于定时器0的值*/
		     {
                     tempcode >>= 1;   
		     tempcode = tempcode - (presentbit & 0x01);
		     time2 = time3;
		     continue;
		     }
               else if( pluswidth<TIME2 )
		     {
                     presentbit = 0;
                     tempcode = tempcode + (presentbit & 0x01);
                     tempcode <<= 1;
		     time3 =time2 + pluswidth;
		     }
               else
		     {
                     presentbit = 1;
                     tempcode = tempcode + (presentbit & 0x01);
                     tempcode <<= 1;
		     time3 =time2 + pluswidth;
		     }

           }
	   else  
		;

           temp2 = temp1;	
       }


 port_0 = 0x01;   
       port_0 = 0x00;  
       ircode = tempcode;
       tabsr &= 0xFE;   /*tabsr是定时器使能寄存器,等于1时使能,此时是关闭*/

/*以下代码是不是表示弹片机开始接收遥控器的指令?*/
       if(ircode==SAFE_H)    /*SAFE_H开始记录方向键,预编程用*/ 
         {s=1;}              
       if(ircode==SAFE_L)    /*记录时间键,预编程用*/
         {s=2;}
       if(ircode==AOTO)      /*按下后实施控制*/
         {s=3;
          j=0;               /*j*/
          k=0;              /*k变量记录的又是什么?*/
          for(i=0;i<5;i++)   /*i表示可以预编程的步数*/
          {
           s_h[i]=0;         /*s_h数组的作用?*/
           s_l[i]=0;         /*s_l数组的作用?*/  
          }
         }
       if(ircode==REMOTE)   /*自动行走*/
         {s=0;              
          j=0;
          k=0;}         
       if(s==1)           /*记录控制方向*/
         { safe1=ircode; 
           if(ircode==RUN && safe1!=safe2)
             {
              s_h[j]=1; /*代表前进,无特殊意义*/
              safe2=safe1;
              j=j+1;
             }  
           if(ircode==BACK && safe1!=safe2) 
             {
              s_h[j]=2;
              safe2=safe1;
              j=j+1;
             }          
           if(ircode==RIGHT && safe1!=safe2) 
             {
              s_h[j]=3;
              safe2=safe1;
              j=j+1;
             }                     
           if(ircode==LEFT && safe1!=safe2) 
             {
              s_h[j]=4;
              safe2=safe1;
              j=j+1;
             }
         } 
       if(s==2)/*开始记录时间*/
         {       
           safe1=ircode; 
           if(ircode==0x4 && safe1!=safe2)
             {
              s_l[k]=1;
              safe2=safe1;
              k++;
             }  
           if(ircode==0x6 && safe1!=safe2) 
             {
              s_l[k]=2;
              safe2=safe1;
              k++;
             }          
           if(ircode==0x10 && safe1!=safe2) 
             {
              s_l[k]=3;
              safe2=safe1;
              k++;
             }                     
           if(ircode==0x18 && safe1!=safe2) 
             {
              s_l[k]=4;
              safe2=safe1;
              k++;
             }
           if(ircode==0x16 && safe1!=safe2) 
             {
              s_l[k]=5;
              safe2=safe1;
              k++;
             }   
           if(ircode==0x12 && safe1!=safe2)
             {
              s_l[k]=6;
              safe2=safe1;
              k++;
             }  
           if(ircode==0x40 && safe1!=safe2) 
             {
              s_l[k]=7;
              safe2=safe1;
              k++;
             }          
           if(ircode==0x60 && safe1!=safe2) 
             {
              s_l[k]=8;
              safe2=safe1;
              k++;
             }                     
           if(ircode==0x64 && safe1!=safe2) 
             {
              s_l[k]=9;
              safe2=safe1;
              k++;
             }
         }
       while(s==0)  /*开始自动行走*/
        {
	  if(s_h[j]==1)
  	   {
  	    run();
 	    wait_1(s_l[j]);
  	    stop();
  	    wait(1);
  	   } 
	  if(s_h[j]==2)
 	   {
 	    back();
 	    wait_1(s_l[j]);
  	    stop();
  	    wait(1);
  	  }
 	 if(s_h[j]==3)
  	  {
  	   right();
  	   wait(s_l[j]);
    	   stop();
    	   wait(1);
  	  }
 	 if(s_h[j]==4)
  	  {
   	  left();
   	  wait(s_l[j]);
    	  stop();
   	  wait(1);
         }
         j=j+1;   
         if(j==5)
          {s=4;
           j=0;}      
       }
      if(s==3) /*实施控制,随机控制*/
       {       
       caroperation(); /*比较指令信号*/
        }              
    }
    else
	;
  }
}


void portinit(void)    
{
  port_0  = 0x01;  /*此口只控制一灯
  pd0     = 0xff;     
  port_1  = 0x02;  /*1号口用于控制右轮的前进的方向*/ 
  pd1     = 0xff;  
  port_3  = 0x03;  /*用于左轮,等于0x03时等于前进*/
  pd3     = 0xff;
  pd7     = 0x08;


  udf   = 0x00;   /*未知*/
  ta0mr = 0x80;/*0号定时器的工作方式*/
 
  tabsr = 0x00;/*所有定时器关闭*/     

}

void pwminit(void)   
{
  ta2mr = 0x47;      /*2号定时器处于PWM工作方式*/
  ta3mr = 0x47;    
  ta2   = 0x803e;   /*前两位控制占空比,换算成10进制后除以255,得到占空比,后两位控制周期*/
  ta3   = 0x803e;  
  tabsr = 0x00;     
}


void caroperation()
{
   switch(ircode)
   {
     case  RUN:   run();
     break;
     case  BACK:   back();
     break;
     case  LEFT:      left(1);
     break;
     case  RIGHT:     right(1);
     break;
     case  STOP:      stop();
     break;
     default:         stop();
    }
}
void wait(unsigned int k )  /*k值自定,可以遥控器定,控制左右转,时间持续短*/
{
  unsigned int  i, j;

  for (i = 0; i < 15*10*k; i++ )      
    for ( j = 0; j < 300; j++ )
      ;
}

void wait_1(unsigned int k )  /*用于前进的,时间稍长*/
{
  unsigned int  i, j;

  for (i = 0; i < 15*50*k; i++ )      
    for ( j = 0; j < 300; j++ )
      ;
}

void run(void)

{
  port_1=0x03;
  port_3=0x02;
  ta2=0x803e;
  ta3=0x913e;
  tabsr = 0x0c;
}


void back(void)
{
 port_1=0x02;
 port_3=0x03;
 ta2=0x803e;
 ta3=0x913e;
 tabsr=0x0c;
}


void right_c(void) /*右转半圈*/
{
  port_1=0x03;
  port_3=0x02;
  ta2=0x843e;
  ta3=0x743e;
  tabsr = 0x0c;
}

void left_c(void)/*左转半圈*/
{
  port_1=0x03;
  port_3=0x02;  
  ta2=0x603e;
  ta3=0x933e;
  tabsr = 0x0c;
}

void right(unsigned int k )
{
  port_1=0x03;
  port_3=0x02;
  ta2=0xfe3e;
  ta3=0x803e; 
  tabsr = 0x0c;
  wait(15*k);
  stop();   
}

void left(unsigned int k )
{
  port_1=0x03;
  port_3=0x02;  
  ta2=0x803e;
  ta3=0xfe3e;
  tabsr = 0x0c;
  wait(15*k);
  stop();
}


void stop(void)
{
  port_1=0x03;
  port_3=0x02;  
  ta2=0xfe3e;
  ta3=0xfe3e;
  tabsr = 0x0c;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -