專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實(shí)例 >> 瀏覽文章

智能小車循跡記時測速程序

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時間:2013年07月07日   【字體:

這個是從一個制作成功的智能小車?yán)锩嫣崛〕鰜淼?br />

原理圖及其完整程序下載:http://www.torrancerestoration.com/bbs/dpj-19526-1.html

下面是部分程序:
#include<reg52.h>
unsigned int i=0;
sbit P36=P3^6;

sbit P10=P1^0;  //循跡口
sbit P11=P1^1;
sbit P12=P1^2;

sbit P14=P1^4;  //電機(jī)口
sbit P15=P1^5;
sbit P16=P1^6;     
sbit P17=P1^7;
unsigned char j,time;
unsigned int kop,dr;
unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char c[4]={0xff,0xff,0xff,0xff},d[4];

void delay(unsigned char z)   //延時子程序
{
 unsigned char j;
 while(z--)
 for(j=123;j>0;j--);
}

   void main()
  { 
    TMOD=0x15;              // 打開定時器和計數(shù)器
 TH0=0x00;
 TL0=0x00;
      
   TH1=0XFc;               //1ms
 TL1=0X18;
 EA = 1;
    ET0=1;
 ET1=1;
    TR1 = 1;
 TR0 = 1;

   while(1)
      { 
       if(P10==0&&P11==0&&P12==0)
      {
    TR0=0;      //顯示時間   停
       P0=d[0];   
       P2=0XFE;
       delay(1);
       P0=d[3];   
       P2=0XFB;
       delay(3);

      P0=d[2];     //顯示測速     停
      P2=0XFD;
      delay(3);
      P0=d[3];  
      P2=0XF7;
      delay(3);
      P14=1;P15=1;P16=1; P17=1;
        }
      }
  }
   void timer1() interrupt 3    //中斷 服務(wù)程序
 {
   unsigned int qq=0,ww=0;
   TH1=0XFc;
   TL1=0X18;//1ms
   i++;
    switch(i%4)
    {   
    case 0:P0=c[0],P2=0XFE;d[0]=c[0];break;
    case 1:P0=c[1],P2=0XFD;d[1]=c[1];break;
    case 2:P0=c[2],P2=0XFB;d[2]=c[2]; break;
    case 3:P0=c[3],P2=0XF7;d[3]=c[3]; break;
    default:break;
    }    
    P14=1;P15=1;P16=1; P17=1;
 
 if(P10==0&&P11==0&&P12==0)  //全測到
 dr=0;
 if(P10==1&&P11==0&&P12==1)  //中間測到
 dr=1;
 if(P10==0&&P11==1&&P12==1)   //左邊測到
 dr=2;
    if(P10==1&&P11==1&&P12==0)   //右邊測到
 dr=3;
 if(P10==0&&P11==0&&P12==1)   //左兩測到
 dr=4;
 if(P10==1&&P11==0&&P12==0)   //右兩測到 
 dr=5;
   
 switch(dr)
  {
     case 0:P14=1,P15=1,P16=1,P17=1,TR1=0;break;       //全測到     停
  
     case 1:P14=0,P15=1,P16=0,P17=1;break;       //直走
 
  case 2:P14=1,P15=1,P16=0,P17=1,ww=1;break;    //左拐
  
  case 3:P14=0,P15=1,P16=1,P17=1,qq=1;break;    //右拐
  
  case 4:P14=1,P15=0,P16=0,P17=1,ww=1;break;    //左兩測到   左拐
 
  case 5:P14=0,P15=1,P16=1,P17=0,qq=1;break;    //右兩測到   右拐
  }
  /*跑出跑道外記憶 回到跑道內(nèi) */
   if(dr==2&&ww==1||dr==4&&ww==1)     //單邊或雙邊 測到跑出去
     {
   qq=0;
    P14=1;P15=1;P16=0;P17=1;
  }
   if(dr==3&&qq==1||dr==5&&qq==1)
  {
       ww=0;
    P14=0;P15=1;P16=1;P17=1;
     }

           if(i==1000) //1s
           {
             kop=TH0;//計數(shù)器計入脈沖
             kop=kop<<8;
             kop=kop+TL0;
             kop=kop*15;
             c[3]=a[kop/10];
             c[2]=a[kop%10];
             time++;
             c[1]=a[time/10];
             c[0]=a[time%10];
             i=0;
             TH0=0;
             TL0=0;
            }
}
 

關(guān)閉窗口

相關(guān)文章