找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2457|回复: 2
打印 上一主题 下一主题
收起左侧

红外小车加超声波测距

[复制链接]
跳转到指定楼层
楼主
ID:138082 发表于 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;         //产生一个20us的脉冲
       while(ec==0); //等待Echo回波引脚变高电平
       TH1=0;          //定时器1清零
       TL1=0;          //定时器1清零
       TF1=0;          //计数溢出标志
       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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:147443 发表于 2016-11-14 21:59 | 只看该作者
你感觉哪里有问题呢,这样让人看一堆代码 谁愿意看啊
回复

使用道具 举报

板凳
ID:147916 发表于 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中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  StartModule()                          //T1中断用来扫描数码管和计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;                            //开启计数
         while(RX);                        //当RX为1计数并等待
         TR0=0;                                //关闭计数
     Conut();                        //计算
         delayms(100);                //100MS

        }

}              

测距模块加进去就好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表