循黑线程序c语言,51单片机舵机循黑线小车程序

#include

sbit pwm = P2^0;    //定义舵机p20

sbit ENA = P3^6;   //定义驱动模块

sbit ENB = P3^7;   //

sbit IN1 = P3^0;

sbit IN2 = P3^1;

sbit IN3 = P3^2;

sbit IN4 = P3^3;   //定义驱动模

/*定义光电管,光电管检测到黑线输出高电平,否则输出低电平*/

sbit zuoz = P2^7;  //定义最左边 光电

sbit zuo = P2^6;        //定义中左边 光电

sbit you = P2^5;        //定义中右边 光电

sbit youy = P2^4;  //定义最右边光电模块

unsigned int         sum1 = 0; //定义几个光电管的和1

unsigned int         sum2= 0;  //定义几个光电管的和2

unsigned int         i ;

void zhengzhuan();            //前进

void tingzhi();            //停止

void youzhuan();

void zuozhuan();

void quansu();

void InitTimer();

typedef unsigned int uint;

typedef unsigned char uchar;

void delay_ms(uint x)

{

uint i;

while(x--)

for(i=0;i<125;i++);

}

void delay(int z)//延时函数,调节电机转速

{

int i,j;

for(i=2;i>0;i--)

for(j=z;j>0;j--);

}

void InitTimer(void)

{

TMOD=0x11;//开定时器0,1

TH0=-18432/256;//定时20MS,20MS为一个周期

TL0=-18432%256;

TH1=-1382/256;//定时1.5MS,这时舵机处于0度

TL1=-1382%256;

EA=1;//开总断

TR0=1;//开定时器0

ET0=1;

TR1=1;//开定时器1

ET1=1;

}

//输出PWM信号

uint pwm_value=1382;                     //初值为1.5ms

uint value[]={1150,1290,1382,1474,1580,};//定义1.2ms,1.4ms,1.5ms,1.6ms,1.75ms;

void main()

{

while(1)

{

uint j;

InitTimer();

pwm_value=1382;

sum1=zuoz&zuo&you&youy;

sum2=zuoz|zuo|you|youy;

if(zuoz==1&&zuo==0)

j=0;

else if(zuo==1&&you==0&&zuoz==0)

j=1;

else if(you==1&&zuo==0&&youy==0)

j=2;

else if(youy==1&&you==0)

j=3 ;

else if(sum1==1) //所有光电管输出高电平,停止

j=4;

else if(sum2==0)  //所有光电管输出低电平,前进

j=5;

else  j= 6 ;

switch(j)

{

case 0: pwm_value=value[4]; delay_ms(100);break;    //舵机输出小偏转角度 。高电平1.3ms

case 1: pwm_value=value[3]; delay_ms(50);break;

case 2: pwm_value=value[1]; delay_ms(50);break;

case 3: pwm_value=value[0]; delay_ms(100);break;

case 4: pwm_value=value[2]; delay_ms(50);break;

case 5: pwm_value=value[2]; delay_ms(50);break;

default : break;

}

while((zuoz==1)&&(zuo==0))//判断当左边光电管遇到黑线,

{                                                        //右边和前边的光电管遇到白线时左转

zuozhuan();//调用左转函数

}

while((zuoz==0)&&(zuo==1)&&(you==0))//判断当右边光电管遇到黑线,

{                                                        //左边和前边的光电管遇到白线时右转

zhengzhuan();//

}

while((zuo==0)&&(you==1)&&(youy==0))//判断当左边光电管遇到黑线,右边光电管也遇到黑线

{                                                        //前边的光电管遇到白线时停止

zhengzhuan();//调用停止函数

}

while((you==0)&&(youy==1))

{

youzhuan();

}

while((zuo==0)&&(zuoz==0)&&(you==0)&&(youy==0))

{

zhengzhuan();

}

while((zuo==1)&&(zuoz=1)&&(you==1)&&(youy==1))

{

tingzhi();

}

}

}

/*以下调用函数*/

void timer0(void) interrupt 1//定时器0中断函数

{

pwm=1;

TH0=-18432/256;

TL0=-18432%256;

TR1=1;

}

void timer1(void) interrupt 3//定时器1中断函数

{

pwm=0;

TH1=-pwm_value/256;

TL1=-pwm_value%256;

TR1=0;

}

void tingzhi()

{

ENA=1;

ENB=1;

IN1=0;

IN2=0;

IN3=0;

IN4=0;

}

void zhengzhuan()//左右轮协同前进子函数

{        ENA=1;

ENB=1;

IN1=1;

IN2=0;

IN3=1;

IN4=0;

delay(10-1);//pwm调速

IN1=0;

IN2=0;

IN3=0;

IN4=0;

delay(1);

}

void zuozhuan()//左右轮协同左转子函数

{        ENA=1;

ENB=1;

IN1=0;

IN2=0;

IN3=1;

IN4=0;

delay(10-1);//pwm调速

IN1=0;

IN2=0;

IN3=0;

IN4=0;

delay(1);

}

void youzhuan()//左右轮协同右转子函数

{        ENA=1;

ENB=1;

IN1=1;

IN2=0;

IN3=0;

IN4=0;

delay(10-1);//pwm调速

IN1=0;

IN2=0;

IN3=0;

IN4=0;

delay(1);

}

void quansu()

{

ENA=1;

ENB=1;

IN1=1;

IN2=0;

IN3=1;

IN4=0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值