#include<reg52h>
#include<mathh>
#define uint unsigned int
#define uchar unsigned char
uchar i=0,j=0,t=0,k,m1,m2,tmp1,tmp2,temp;
sbit P10=P1^0;//循迹传感器最左有测得信号 低电平有效
sbit P11=P1^1;//循迹传感器次左有测得信号
sbit P12=P1^2;//循迹传感器中有测得信号
sbit P13=P1^3;//循迹传感器次右有测得信号
sbit P14=P1^4;//循迹传感器最右有测得信号
sbit s1=P2^2;//单片机输出到L298N控制电机左后退
sbit s2=P2^3;//单片机输出到L298N控制电机左前进
sbit s3=P2^4;//单片机输出到L298N控制电机右后退
sbit s4=P2^5;//单片机输出到L298N控制电机右前进
sbit en1=P2^0;
sbit en2=P2^1;
sbit qian=P1^6;
sbit ce=P1^7;
sbit beep=P3^0;
sbit choose=P3^1;
sbit zheng=P3^6;
sbit fu=P3^7;
sbit ceshi=P3^5;
sbit ceshi2=P3^4;
void Delay(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<113;j++)
{
;
}
}
}
void init()
{
TMOD=0x02; / 设定T0的工作模式为2 /
TH0=0x9c; / 装入定时器的初值 /
TL0=0x9c;
EA=1; / 开中断 /
ET0=1; / 定时器0允许中断 /
TR0=1; / 启动定时器0 /
}
/ 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) /
void motor(uchar index, int speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) / 电机1的处理 /
{
m1=abs(speed); / 取速度的绝对值 /
if(speed>0) / 速度值为正则正转 /
{
s1=1;
s2=0;
}
if(speed<0) / 为负数则反转 /
{
s1=0;
s2=1;
}
}
if(index==2)
{
m2=abs(speed);
if(speed>0)
{
s3=1;
s4=0;
}
if(speed<0)
{
s3=0;
s4=1;
}
}
}
}
void main()
{
init();
zheng=1;
fu=0;
ceshi=0;
ceshi2=1;
P1=0xff;
if(choose==1)
while(1)
{
temp=(P1|0xe0);
switch(temp)
{
case 0xf7:i=1;motor(1,50);motor(2,0);break;
case 0xef:i=2;motor(1,50);motor(2,0);break;
case 0xe7:i=3;motor(1,50);motor(2,0);break;
case 0xe3:i=4;motor(1,50);motor(2,0);break;
case 0xf3:i=5;motor(1,50);motor(2,0);break;
case 0xfe:j=1;motor(1,0);motor(2,50);break;
case 0xfc:j=2;motor(1,0);motor(2,50);break;
case 0xf8:j=3;motor(1,0);motor(2,50);break;
case 0xf9:j=4;motor(1,0);motor(2,50);break;
case 0xfd:j=5;motor(1,0);motor(2,50);break;
case 0xfb:k=1;motor(1,30);motor(2,30);break;
case 0xf1:k=2;motor(1,30);motor(2,30);break;
case 0xe0:motor(1,30);motor(2,30);break;
case 0xff:if(i==1||i==2||i==3||i==4||i==5){i=0;motor(1,50);motor(2,0);}
if(j==1||j==2||j==3||j==4||j==5){j=0;motor(1,0);motor(2,50);}
if(k==1||k==2){k=0;motor(1,30);motor(2,30);}break;
default : break;
}
if(qian==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;
while(!qian);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
}
if(ce==0)
{
beep=0;
TR0=0;en1=0;en2=0;EA=0;ET0=0;
Delay(2000);
TR0=1;en1=1;en2=1;EA=1;ET0=1;
beep=1;
while(ce==0)
{motor(1,15);
motor(2,15);
}
}
}
else
{
P0=0xff;
while(1)
{
switch(P0&0x1f)
{
case 0x11: motor(1,50);motor(2,50);Delay(1000);break;
case 0x12: motor(1,0);motor(2,50);Delay(1000);break;
case 0x14: motor(1,50);motor(2,0);Delay(1000);break;
case 0x18: motor(1,-50);motor(2,-50);Delay(1000);break;
default:motor(1,0);motor(2,0);break;
}
}
}
}
void timer0() interrupt 1 / T0中断服务程序 /
{
if(t==0) / 1个PWM周期完成后才会接受新数值 /
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1)
en1=1;
else
en1=0; / 产生电机1的PWM信号 /
if(t<tmp2)
en2=1;
else
en2=0; / 产生电机2的PWM信号 /
t++;
if(t>=100)
t=0; / 1个PWM信号由100次中断产生 /
}
这个是可循迹智能小车的程序 你自己研究吧
接循迹用的光电传感器,用单片机判断,驱动电机执行。传感器越多越好。
以比较奇葩的单路传感器为例,0驱动左轮,1驱动右轮,就可以沿黑线一侧摇摆前进。这么简单的判断都可以不用单片机,呵呵。
以上就是关于本人是51单片机菜鸟,求助各位大神.全部的内容,包括:本人是51单片机菜鸟,求助各位大神.、51智能小车寻迹路线,怎么编程让小车按原路返回、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)