找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1284|回复: 1
收起左侧

小车循迹程序

[复制链接]
ID:348270 发表于 2018-6-9 16:18 | 显示全部楼层 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char zkb1=0; //  左电机占空比
unsigned char zkb2=0;  //右电机占空比
unsigned char t=0;    //

sbit LSEN=P2^0;    // 左红外对管io2.0
sbit MSEN=P2^1;    // 中红外对管io2.1
sbit RSEN=P2^2;   // 右红外对管io2.2
sbit IN1=P1^0;  //L298Nin1口对51IO1.0口
sbit IN2=P1^1;         
sbit IN3=P1^2;
sbit IN4=P1^3;
//初始化定时器 中断
void init()
{
TMOD=0x01;  //   定时器工作在方式一
TH0=(65536-2000)/256;   //定时2ms
TL0=(65536-2000)%256;
EA=1;         //打开总中断                                       
ET0=1;        //打开定时器中断
TR0=1;        //使用TCON寄存器,TR0 = 1
}
//中断函数 加 脉宽调制     
void timer0()  interrupt 1
{
  TH0=(65536-5000)/256;
  TL0=(65536-5000)%256;
if(t>zkb1)   //大于左电机占空比
   IN1=0;        //in1关闭   
else
   IN1=1;        //否则in1打开
if(t>zkb2)      //小于右电机占空比  
   IN3=0;
else
   IN3=1;
   t++;
if(t>=20)       //20就是这个周期  
{
   t=0;
}
}
//前进模块
void qianjin()
{
      zkb1=10;
   zkb2=10;
}
//左转函数
void turn_left()
{
   zkb1=0;
   zkb2=10;       //右电机转速大于左电机
   
}
//右转函数
void turn_right()
{
   zkb1=10;          //左电机转速大于右电机
   zkb2=0;
}

//循迹函数  
void xunji()
{
   uchar flag;
   if((RSEN==0)&&(MSEN==1)&&(LSEN==0))
   {
     flag=0;
  }
//左转函数  
else if((RSEN==0)&&(MSEN==0)&&(LSEN==1))
{
  flag=1;
  }
//右转函数
else if ((RSEN==1)&&(MSEN==0)&&(LSEN==0))
{
flag=2;
}
switch (flag)
{
   case 0:
      qianjin();
      break;
   case 1:
       turn_right();
    break;
case 2:
    turn_left();
    break;
default:
    break;
}
}  
//主程序
void main()
{
  init();
  zkb1=10;
  zkb2=10;
  while(1)
  {
  //给电机加启动程序
  IN1=1;
  IN2=0;
  IN3=1;
  IN4=0;
  while(1)
  {
   xunji();   //循迹
   }
   }
}

回复

使用道具 举报

ID:316776 发表于 2018-6-11 17:43 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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