找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3256|回復: 2
打印 上一主題 下一主題
收起左側

紅外小車加超聲波測距

[復制鏈接]
跳轉到指定樓層
樓主
ID:138082 發(fā)表于 2016-11-12 18:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
紅外小車加超聲波測距
程序哪里有錯誤?
#include<reg52.h>
#define uint  unsigned int
#define uchar  unsigned char   
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
sbit hw=P3^0;
sbit tr=P3^4;
sbit ec=P3^5;
sbit wela=P2^7;
sbit dula=P2^6;
uint distance,time,tl,th;
uchar code table[]={                                   
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay_20us(void )
{
    uchar a ;
    for(a=0;a<100;a++);
}
void delay(uint a )
{
    while(a--);
}
void delaym(uint xms)                     
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void display(uint temp)
{
    uint ge,shi,bai;
    bai=temp/100;
    shi=(temp%100)/10;  
    ge=temp%10;
  
    wela=1;
    P0=0xfe;
    wela=0;
    dula=1;
    P0=table[bai];
    dula=0;
    delaym(1);
    dula=1;
    P0=0x00;   //關位碼
    dula=0;
    wela=1;
    P0=0xfd;
    wela=0;
    dula=1;
    P0=table[shi];
    dula=0;
    delaym(1);
    dula=1;
    P0=0x00;   //關位碼
    dula=0;
    dula=1;
    P0=table[ge];
    dula=0;
    wela=1;
    P0=0xfb;
    wela=0;
    delaym(1);
    dula=1;
    P0=0x00;   //關位碼
    dula=0;
}     
void forward()                 //左右輪都正轉,前進                        //speed>=0&&speed<=100; time=speed*200us
{
      
        IN1=1;
        IN2=0;
        IN3=1;
        IN4=0;
}
void backward()                   //左右輪都后轉,后退
{
      
        IN1=0;
        IN2=1;                     
        IN3=0;
        IN4=1;
}
void main()
{  TMOD=0X10;
         while(1)
        {
                if(hw==1)
                {   
                           forward();
                }
               
                else
                {
                         backward();
                }
    tr=1;         //超聲波輸入端
       delay_20us();   //延時20us
       tr=0;         //產(chǎn)生一個20us的脈沖
       while(ec==0); //等待Echo回波引腳變高電平
       TH1=0;          //定時器1清零
       TL1=0;          //定時器1清零
       TF1=0;          //計數(shù)溢出標志
       TR1=1;          //啟動定時器1
    while(ec==1);
      th=TH1;
    tl=TL1;
    TL1=0;
    TH1=0;
       TR1=0;          //關閉定時器1
       time=th*256+tl;
       distance=time*0.017;  //厘米     
           display(distance+1);        
        }
   

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:147443 發(fā)表于 2016-11-14 21:59 | 只看該作者
你感覺哪里有問題呢,這樣讓人看一堆代碼 誰愿意看啊
回復

使用道具 舉報

板凳
ID:147916 發(fā)表于 2016-11-14 22:29 | 只看該作者
        #include   <AT89X51.H>
        #include   <intrins.h>
    #include   <STDIO.H>

    #define uchar unsigned  char
    #define uint  unsigned   int  
        #define  RX  P1_6
    #define  TX  P1_5
  

        unsigned int  time=0;
        unsigned int  timer=0;
        float         S=0;
    bit           flag =0;
       

/********************************************************/
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.87)/100;     //算出來是CM
         if(flag==1)                    //超出測量
         {
          flag=0;
          printf("-----\n");
         }

          printf("S=%f\n",S);
        }
/********************************************************/
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/********************************************************/
     void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  {
    flag=1;                                                         //中斷溢出標志
  }
/********************************************************/
   void  StartModule()                          //T1中斷用來掃描數(shù)碼管和計800MS啟動模塊
  {
          TX=1;                                         //800MS  啟動一次模塊
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          TX=0;
  }
/********************************************************/
void main(void)
{  
    TMOD=0x21;                   //設T0為方式1,GATE=1;
        SCON=0x50;
        TH1=0xFD;
        TL1=0xFD;
        TH0=0;
        TL0=0;
        TR0=1;  
        ET0=1;             //允許T0中斷
        TR1=1;                           //開啟定時器
        TI=1;

        EA=1;                           //開啟總中斷


        while(1)
        {
         StartModule();
         while(!RX);                //當RX為零時等待
         TR0=1;                            //開啟計數(shù)
         while(RX);                        //當RX為1計數(shù)并等待
         TR0=0;                                //關閉計數(shù)
     Conut();                        //計算
         delayms(100);                //100MS

        }

}              

測距模塊加進去就好了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表