找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机控智能小车源程序

[复制链接]
跳转到指定楼层
楼主
ID:618842 发表于 2019-10-2 19:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>      //包含52系统头文件
#define uint unsigned int
#define uchar unsigned char   
#define Leftmotogo      {IN1=0,IN2=1;}   //左电机向前zou
#define LeftmotoStop    {EN1=0;IN1=0,IN2=0;}         //左边电机停转                     
#define Rightmotogo     {IN3=1,IN4=0;}   //右边电机向前走
#define RightmotoStop   {EN2=0;IN3=0,IN4=0;}        //右边电机停转  
sbit IN1=P1^2; //
sbit IN2=P1^3; //
sbit IN3=P1^6; //
sbit IN4=P1^7; //
sbit EN1=P1^4; //使能
sbit EN2=P1^5; //使能
sbit key4=P3^7;
sbit beep=P2^3;
sbit Leftled=P3^3;  //左循迹红外传感器      
sbit Rightled=P3^2;  //右循迹红外传感器
sbit Left_2_led=P3^4;  //左避障红外传感器  
sbit Right_2_led=P3^5;  
uchar pwmleft  =0;//变量定义
uchar pwmright =0;
uchar pushleft =6;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
uchar pushright=6;// 右电机占空比N/20
          // 大家可以根据循迹效果修改以上两个数值
bit RightPWMON=1;            //右电机PWM开关
bit LeftPWMON =1;      //左电机PWM开关

void delayms(uint xms)   
{
    uint i,j;
for(i=xms;i>0;i--)
     for(j=110;j>0;j--);
}
void run()
{
    pushleft=6;  //速度调节变量 0-20。。。0最小,20最大
pushright=6;
Leftmotogo ;   //左电机往前走
Rightmotogo ;  //右电机往前走
}
void leftrun()
{  
     pushleft=5;
  pushright=5;
  Rightmotogo ;  //右电机往前走
     LeftmotoStop ;  //左电机停止
}
void  rightrun()
{
  pushleft=5;
  pushright=5;
     Leftmotogo;   //左电机往前走
  RightmotoStop;  //右电机往前走
}
void  stop()
{
  LeftmotoStop;
  RightmotoStop;
}
//       PWM调制电机转速            左电机调速                                                           
/*调节push_val_left的值改变电机转速,占空比*/
void pwmoutleftmoto()
{  
     if(LeftPWMON)
     {
          if(pwmleft<=pushleft)
       {
            EN1=1;
       }
       else        EN1=0;
          if(pwmleft>=20)
       pwmleft=0;
     }
     else       EN1=0;   //若未开启PWM则EN1=0 左电机 停止
}
/*                    右电机调速                                  */  
void pwmoutrightmoto()
{
    if(RightPWMON)
    {
        if(pwmright<=pushright) //20ms内电平信号 111 111 0000 0000 0000 00
     {
         EN2=1;        //占空比6:20
        }
     else     EN2=0;
     if(pwmright>=20)
     pwmright=0;
    }
    else          EN2=0;   //若未开启PWM则EN2=0 右电机 停止
}   
void timer0() interrupt 1     //TIMER0中断服务子函数产生PWM信号
{
     TH0=0XFC;   //1Ms定时
  TL0=0X66;
  pwmleft++;
  pwmright++;
  pwmoutleftmoto();
  pwmoutrightmoto();
}
void keyscan()              //按键扫描函数
{
    A:    if(key4==0)   //判断是否有按下信号
  {
      delayms(10);    //延时10ms
   if(key4==0)   //再次判断是否按下
    {
       beep=0;               //蜂鸣器响   
       while(!key4); //判断是否松开按键
       beep=1;               //蜂鸣器停止  
     }
      else  goto A;        //跳转到A重新检测
  }
  else  goto A;             //跳转到A重新检测
}
void main()
{
    P1=0X00;    //关电机
    keyscan(); //按键启动检测
delayms(1000);//1s后启动
TMOD=0X01;
    TH0= 0XFC;  //1ms定时
    TL0= 0X66;
    TR0= 1;
    ET0= 1;
EA = 1;     
while(1) //无限循环
{
     if(Left_2_led==0||Right_2_led==0) {stop();}
        if(Leftled==0&&Rightled==0)    run();   //调用前进函数
        else if(Leftled==1&&Rightled==0)/*左边检测到黑线*/  leftrun(); //调用小车左转函数   
  else if(Rightled==1&&Leftled==0)/*右边检测到黑线*/rightrun();//调用小车右转函数  
  else  stop();
  
  }
}
  
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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