跪求基于STC89C51单片机制作循迹小车的资料,本人初学,邮箱564760072@qq.com感激不尽
买至少3个TCRT5000 LM339 或者其他比较器
程序
#include<reg52.h>
unsigned char zkb1=0 ; /*左边电机的占空比*/
unsigned char zkb2=0 ; /*右边电机的占空比*/
unsigned char t=0; /* 定时器中断计数器 */
bit flag=0; /*标志位检测一个pwm波是否结束*/
sbit SEN1=P1^4; //左二级
sbit SEN2=P1^5; //左一级
sbit SEN3=P1^6; //中
sbit SEN4=P1^7; //右一级
sbit SEN5=P3^0; //右二级
sbit LED5=P2^0;
sbit ENA=P3^2;
sbit ENB=P3^3;
/*延时函数*/
void delay(unsigned int a){ // 1ms延时程序(12MHz 10倍于51单片机速度时)
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*循迹函数*/
void xunji()
{
if(SEN3==1&&SEN1==0&&SEN2==0&&SEN4==0&&SEN5==0)//中 直走
{
//t=0;
flag=0;
P0=0xaf;
zkb1=99;
zkb2=99;
//delay(50);
}
if(SEN1==1)//左二级 急转
{
//t=0;
flag=0;
P0=0x9f;
//P0=0x5f;
zkb1=20;
zkb2=99;
//delay(200);
}
if(SEN3==0&&SEN1==0&&SEN2==1&&SEN5==0&&SEN4==0)//左一级 缓转
{
flag=0;
// t=0;
P0=0xaf;
zkb1=30;
zkb2=99;
//delay(200);
}
if(SEN3==0&&SEN1==0&&SEN2==0&&SEN4==1&&SEN5==0)//右一级 缓转
{ //t=0;
flag=0;
P0=0xaf;
zkb1=99;
zkb2=30;
// delay(200);
}
if(SEN5==1)//右二级 急转
{
flag=0;
// t=0;
P0=0x6f;
//P0=0x5f;
zkb1=99;
zkb2=20;
//delay(200);
}
//if(SEN1==0&&SEN2==0&&SEN3==0&&SEN4==0&SEN5==0) //终点
//{
//P0=0;
// }
}
/*初始化函数*/
void Init(void)
{
TMOD=0X11; /* 设定T0的工作模式为2,设定T0的工作模式为1 */
TH0=(65536-100)/256;
TL0=(65536-100)%256;
IT0=1;
EA=1; /* 开总中断 */
ET0=1; /* 定时器0允许中断 */
TR0=1; /* 启动定时器0 */
EX0=1; /*开中断0*/
P1=0xff;
P3=0xff;
P2=0xff;
P1=0xff;
ENA=0;ENB=0;
}
void main()
{
Init();
ENA=1;
ENB=1;
LED5=0;//红外指示灯亮
delay(5000);//延时,防止红外脉冲信号被再次利用作为停止指令
LED5=1;//红外指示灯灭
while(1)
{
xunji();//寻迹 zkb1=99;
/* zkb2=99;
P0=0xaf;//后推
delay(2000);
P0=0x5f;//前进
delay(2000);
P0=0x9f;//右转
delay(2000);
P0=0x6f;//左转
delay(2000); */
}
}
/*中断函数+脉宽调制*/
void timer0() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
if(t<zkb1)
{ENA=1;}
else
{ENA=0;}
if(t<zkb2)
{ENB=1;}
else
{ENB=0;}
t++;
if(t>=100)
{t=0;}
}
我做的是5个传感器的。 小车两驱
298N 图 比较器电路一查一大把
2024-09-04 广告