关于51制作小车避障的一些问题。

2019-07-15 08:54发布

  • 我正在做一个避障小车,但是遇到了一些问题,希望你们能够帮助一下,我刚刚开始学,很多东西可能不懂。我现在遇到的问题是:我用超声波HC-SR04和LCD1602显示屏作为测距,舵机MG995作为转向器。把它们独自实验时可以实现,但把他们组合一起就出现了问题,舵机会把显示屏屏蔽掉,不能看到测出的距离。我想做的小车是遇到障碍物通过超声波来达到避障的效果,舵机我用的是定时器1,超声波用的是定时器0。照片能够看到数字的是没有把舵机接上,看不到数据的那张照片是接上舵机了的。



#include<reg52.h>#include<intrins.h>//#include uint unsigned int//#include uchar unsigned char#define Stop 0   //停止#define Left 1   //左转#define Right 2  //右转                                                                                            sbit L1=P2^0;            //左电机反转sbit L2=P2^1;            //左电机正转sbit R3=P2^2;           //右电机正转sbit R4=P2^3;           //右电机反转 sbit ControlPort = P1^5;  //舵机信号端//sbit KeyLeft = P1^0; //左转按键端口//sbit KeyRight = P1^1;  //右转按键端口//sbit KeyStop = P1^2;   //归为按键端口 sbit rs=P2^6;            //1602的数据/指令选择控制线 sbit rw=P2^5;           //1602的读写控制线 sbit en=P2^7;          //1602的使能控制线 sbit trig=P2^4;      //超声波测距模块Trigsbit echo=P3^2;     //超声波测距模块Echobit flag1;        //触发信号标志位// unsigned char count;           //中断累加变量long int distance;    //测量所得距离   unsigned char timeOutCounter =0,LeftOrRight=0;//TimeOutCiunter:定时器溢出计数//LeftOrRight :舵机左右旋转标志 unsigned char code table[]={"0123456789"}; //定义字符数组显示数字 void delay(unsigned int n)    //延时函数                       {    unsigned int x,y;     for(x=n;x>0;x--)    for(y=110;y>0;y--); } void delayt(unsigned int x)        //延时函数{   unsigned char j;   while(x-- > 0)    {              for(j = 0;j < 125;j++)       {         ;       }    }} void Init(){   TMOD =0x11; //定时/计数器1为工作方式1,定时/计数器0为工作方式1         TL0=0X66;  //1ms         TH0=0xfc;         TH1=0xff;   //赋初始值0.1ms         TH1=0xa4;         EA=1;  //打开总中断         ET0=1;      //打开定时器0中断         ET1=1;      //打开定时器1中断         TR1=1;  //启动定时器0} /*------------------------------------------------                1602写命令函数 ------------------------------------------------*/void lcd_wcom(unsigned char com)            {    rs=0;                //选择指令寄存器    rw=0;               //选择写    P0=com;            //把命令字送入P0    delay(5);         //延时一小会儿,让1602准备接收数据    en=1;            //使能线电平变化,命令送入16028位数据口,这点非常重要    en=0; } /*------------------------------------------------               1602写数据函数    ------------------------------------------------*/void lcd_wdat(unsigned char dat)        {    rs=1;             //选择数据寄存器    rw=0;            //选择写    P0=dat;         //把要显示的数据送入P0    delay(5);      //延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。   en=1;         //使能线电平变化,数据送入16028位数据口
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。