您的位置 首页 培训

智能小车C言语程序

智能小车黑线循迹C语言程序includereg51h>includemathh>defineucharunsignedchardefineuintunsignedintsbitLeftIR

智能小车黑线循迹C言语程序
#include
#include
#define uchar unsigned char
#define uint unsigned int

sbit LeftIR=P1^6; //左面红外接纳
sbit RightIR=P1^7; //右边红外接纳
sbit ENA=P1^2; // L298的Enable A
sbit IN1=P1^0; // L298的Input 1
sbit IN2=P1^1; // L298的Input 2
sbit ENB=P1^5; // L298的Enable B
sbit IN3=P1^3; // L298的Input 3
sbit IN4=P1^4; // L298的Input 4
uchar t=0; //中止计数器
uchar motor_1=0,motor_2=0; //电机1,2速度值
uchar tmp1,tmp2; // 电机当时速度值
uchar aa; //守时器1中止计数
bit flag=0; //标志位

void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) // 电机1的处理
{
motor_1=abs(speed); // 取速度的绝对值
if(speed<0) // 速度值为负则回转
{
IN1=0;
IN2=1;
}
else // 不为负数则正转
{
IN1=1;
IN2=0;
}
}
if(index==2) // 电机1的处理
{
motor_2=abs(speed); // 取速度的绝对值
if(speed<0) // 速度值为负则回转
{
IN3=0;
IN4=1;
}
else // 不为负数则正转
{
IN3=1;
IN4=0;
}
}
}
}
void init()
{
TMOD=0x12; // 设定T0的作业形式为2
TH0=0x9B; // 装入守时器的初值
TL0=0x9B;
TH1=(65536-50000)/256; //设置初值守时50ms
TL1=(65536-50000)%6;
EA=1; // 开中止
ET0=1; // 守时器0答应中止
ET1=1; //守时器1答应中止
TR0=0; // 封闭守时器0
TR1=0; // 封闭守时器0
ENA=0; //封闭电机1
ENB=0; //封闭电机2
}
void main()
{
int irDetectLeft,irDetectRight;
init();
while(1)// 电机实践操控演示
{
irDetectRight = RightIR;//右边接纳
irDetectLeft = LeftIR;//左面接纳
if((irDetectLeft==0)&&(irDetectRight==0))//向前进
{
motor(1,100);
motor(2,100);
}
if((irDetectLeft==0)&&(irDetectRight==1))//右转
{
motor(1,-100);
motor(2,100);
}
if((irDetectLeft==1)&&(irDetectRight==0))//左转
{
motor(1,100);
motor(2,-100);
}
if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次勘探守时器1开端计时
{
motor(1,100);
motor(2,100);
TR1=1;
}
if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第2次勘探时小车停
{
TR0=0;
ENA=0;
ENB=0;
}
}
}
void timer0() interrupt 1 // T0中止服务程序
{
if(t==0) // 1个PWM周期完成后才会承受新数值
{
tmp1=motor_1;
tmp2=motor_2;
}
if(t ENA=1;
else
ENA=0; // 发生电机1的PWM信号
if(t ENB=1;
else
ENB=0; // 发生电机2的PWM信号
t++;
if(t>=100)
t=0; // 1个PWM信号由100次中止发生
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%6;
aa++;
if(aa==40) //守时2s后小车开端运动
TR0=1;
if(aa==60) //守时3s后置标志位
{
aa=0;
flag=1;
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/319581.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部