打印

超声波壁障小车问题。请求解答!!!

[复制链接]
1342|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
枫恋00|  楼主 | 2013-3-10 22:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>       
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit   lcd_rs=P2^5;
sbit   lcd_rw=P2^6;
sbit   lcd_en=P2^7;

sbit   Tx=P2^0;
sbit   Rx=P3^2;
sbit   test=P0^7;

sbit   T_1=P0^0;
sbit   T_2=P0^1;
sbit   R_1=P0^2;
sbit   R_2=P0^3;

uchar code lcd[]="distance is:";
uchar code lcd1[]="       CM";
uchar lcd2[5];
uchar num;
uchar time_low=0,time_high=0;
long temp=0;
long dis=0;
void qianjin();
void turn_left();
void turn_right();
void houtui();

/********************延时*************************************/
void delayms(uint z)           //延时ms
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void delay()
{
       _nop_(); _nop_();
           _nop_(); _nop_();
           _nop_(); _nop_();
           _nop_(); _nop_();
           _nop_(); _nop_();          
}
/****************lcd写指令控制命令****************************/
void write_com(uchar com)//lcd写指令控制命令
{
    delayms(5);
        lcd_rs=0;
    lcd_rw=0;
        P1=com;
        lcd_en=1;
        delay();
        lcd_en=0;
    delay();
}
/**************lcd写数据命令**********************************/
void write_data(uchar date)//lcd写数据命令
{
    delayms(5);                                                                                                                       
        lcd_rs=1;
    lcd_rw=0;
        P1=date;
        delay();
        lcd_en=1;
        delay();
        lcd_en=0;
}
/********************lcd初始化*******************************/
void lcd_init()
{                       
    lcd_en=0;
        write_com(0x38);
        write_com(0x0c);   //设置光标的显示/闪烁
        write_com(0x06);   //设置显示后指针加1,并且光标移一位
        write_com(0x01);   //清屏设置
        write_com(0x80);   //设置字符从地址为10的位置开始显示
}
/*************初始化显示子程序**************************************/
void init_display()          
{
           write_com(0x80+0x00);
           for(num=0;num<12;num++)
                {
                        write_data(lcd[num]);
                        delayms(10);
                }
                write_com(0x80+0x40);
           for(num=0;num<9;num++)
                {
                        write_data(lcd1[num]);
                        delayms(10);
                }               
}
/******初始化*****************/
void init_time()
{
        TMOD=0X09;//设置定时器0/1工作方式1
        EA=1;
        IT0=1;
        TH0=0;//设置定时器初值。
        TL0=0;
}
/******发送超声波******************/
void send()
{
        Tx=1;  
        delay();
        delay();          
        EX0=1;
        TR0=1;
    Tx=0;  
}
/*******************************/
void count()
{
dis=0.017*temp;
}
void show()
{
     count();
     lcd2[0]=(uint)dis/1000+0x30;
         lcd2[1]=(uint)dis/100%10+0x30;
         lcd2[2]=(uint)dis/10%10+0x30;
         lcd2[3]=(uint)dis%10+0x30;
         if(lcd2[0]==0x30)               //如果第一位为0则不显示
          {
           lcd2[0]=0x20;
          }
         write_com(0xc1);
         write_data(lcd2[0]);
       
         write_com(0xc2);                  
         write_data(lcd2[1]);

          write_com(0xc3);
         write_data(lcd2[2]);
       
//         write_com(0xc4);            //显示小数点
//         write_data(0x2e);
         
         write_com(0xc4);
         write_data(lcd2[3]);
}
/************转弯选择********************/
void choise(uchar d)
{
switch(d)
{
case 0:qianjin();delayms(200);break;
case 1:turn_left();delayms(200);break;
case 2:houtui();delayms(200);break;
default:break;
}
}
/************************/
uchar panduan()
{
uchar c;
//jisuan();
if(dis<100&&dis>50)
   {
         c=0;  //直走
    }
  else if(dis<50&&dis>10)
   {
     c=1;   //左转
    }
  else if(dis<10)
   {
         c=2;  //后退
    }
  else
    c=0;
return c;
}
/*******主函数**************************/
void main()
{  qianjin();
  lcd_init();
  init_display();
  init_time();
  while(1)
  {
   send();
   show();
   test=!test;
   choise(panduan());
   delayms(10);
  }  
}
/********************************/
void qianjin()           //前进
{
T_1=1;
T_2=0;

R_1=1;
R_2=0;
}

/*************************/
void turn_left()   //左转
{
T_1=0;
T_2=0;

R_1=1;
R_2=0;
}
/***************************/
/*
void turn_right()  //右转
{
T_1=1;
T_2=0;

R_1=0;
R_2=0;
}
*/
/****************************/
void houtui()           //后退
{
T_1=0;
T_2=1;

R_1=0;
R_2=1;
}
/********中断函数************************/
void int0() interrupt 0
{
temp=(TH0*256+TL0);
TL0=0;//重赋定时器0的初值。
TH0=0;
}
这是我自己写的超声波壁障小车的程序,没有PWM控制,只有简单的高低电平控制小车电机的转动,但是在调试的时候小车只能后退,而不能前进,不知道是为什么,请大家帮忙解答!!

相关帖子

沙发
y651503148| | 2013-3-29 15:50 | 只看该作者
读回来的dis对不对呢

使用特权

评论回复
板凳
yhhsky| | 2013-3-29 19:22 | 只看该作者

使用特权

评论回复
地板
yhhsky| | 2013-3-29 22:37 | 只看该作者

使用特权

评论回复
5
airwill| | 2013-3-29 23:07 | 只看该作者
这样说, 问题的原因会很多。
我看可以先强制的办法, 确定和排除硬件问题,再调试查找软件问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

60

帖子

0

粉丝