写了个51单片机寻黑线的简单程序

#include <REGX52.H> 

sbit LeftLed=P2^0;                        //定义前方左侧指示灯端口
sbit RightLed=P0^7;                       //定义前方右侧指示灯端口
sbit FontLled=P1^0;

sbit LeftIR=P3^5;                         //定义前方左侧红外探头端口
sbit RightIR=P3^6;                        //定义前方右侧红外探头端口
sbit FontIR=P3^7;                         //定义前方正前方红外探头端口

sbit M1A=P0^0;                            //定义左侧电机驱动A端
sbit M1B=P0^1;                            //定义左侧电机驱动B端

sbit M2A=P0^2;                            //定义右侧电机驱动A端
sbit M2B=P0^3;                            //定义右侧电机驱动B端

sbit B1=P0^4;                             //定义语音识识别传感器端口
sbit SB1=P0^6;                            //定义蜂鸣器端口


void tingzhi()
{
   M1A=0;                                   //将M1电机A端初始化为0
   M1B=0;                                   //将M1电机B端初始化为0
   M2A=0;                                   //将M2电机A端初始化为0
   M2B=0;

}

void qianjin()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=1;                                   
   M2B=0;
}

void houtui()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=0;                                   
   M2B=1;
}

void zuozhuan()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=1;                                   
   M2B=0;
}

void youzhuan()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=0;                                   
   M2B=1;
}

void delay_nus(unsigned int i)  //延时:i>=12 ,i的最小延时单12 us
{ 
  i=i/10;
  while(--i);
}   
void delay_nms(unsigned int n)  //延时n ms
{ 
  n=n+1;
  while(--n)  
  delay_nus(900);         //延时 1ms,同时进行补偿
  
}  


void ControlCar(unsigned char ConType)    //定义电机控制子程序
{
 
  tingzhi();
 switch(ConType)                          //判断用户设定电机形式
 {
  case 1:  //前进                         //判断用户是否选择形式1
  { 
    qianjin();
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  { 
    houtui();                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  { 
    zuozhuan();                               //M2电机正转
	break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  { 
    youzhuan();                                //M1电机正转
                                          //M2电机反转
	break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    tingzhi();
	break;                                //退出当前选择
  }
 }
}
void main()                               //主程序入口
{
  bit RunFlag=0;                          //定义小车运行标志位
  //RunShow=0;                              //初始化显示状态

  ControlCar(8);                          //初始化小车运行状态
  while(1)                                //程序主循环
  {
   Start:

   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   FontLled= FontIR; 
   SB1=LeftIR;
   if(LeftIR == 0 && RightIR == 0)    //三个红外检测到黑线,就前进
   {
      ControlCar(1);                      //左侧没有信号时,开始向右转一定的角度
      delay_nms (10);
	  goto NextRun;
   }
   
   if(LeftIR == 0 && RightIR == 1)
   {
      ControlCar(3);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
	  goto NextRun;
   }

   if(LeftIR == 1 && RightIR == 0)
   {
      ControlCar(4);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
	  goto NextRun;
   }


   goto Start;
   NextRun:
   ControlCar(8);
  }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值