C51红外循迹小车
PWM占空比
定时器中断
L298N驱动
#include <REGX52.H>
#define uchar unsigned char
#define uint unsigned
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^4;
sbit IN4=P1^5;
sbit left1=P3^1;
sbit right1=P3^2;
sbit ENA=P1^7;
sbit ENB=P1^6;
uchar zkb1=0;
uchar zkb2=0;
uchar t=0;
void delay_ms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<114;j++);
}
void init()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-20)/256;
TL0=(65536-20)%256;
TR0=1;
}
void turnleft()
{
zkb1 = 23;
zkb2 = 6;
IN1=0; IN2=1;
IN4=0; IN3=1;
}
void turnright()
{
zkb1 = 6;
zkb2 = 23;
IN1=0; IN2=1;
IN4=0; IN3=1;
}
void stright()
{
zkb1=23;
zkb2=23;
IN1=0;IN2=1;
IN4=0;IN3=1;
}
void stop()
{
IN1=1; IN2=1;
IN4=1; IN3=1;
}
void xunji()
{
if((left1 == 0)&&(right1 == 0))
{
stright();
}
if((left1 == 1)&&(right1 == 0))
{
turnleft();
}
if((left1 == 0)&&(right1 == 1))
{
turnright();
}
if((left1 == 1)&&(right1 == 1))
{stop(); }
}
void main()
{
init();
IN1 = 0;
IN2 = 1;
IN4 = 0;
IN3 = 1;
while(1)
{
xunji();
}
}
void time() interrupt 1
{
TH0 = (65536 - 20) / 256;
TL0 = (65536 - 20) % 256;
if(t < zkb1)
{
ENA = 1;
}
else
{
ENA = 0;
}
if(t < zkb2)
{
ENB =1;
}
else
{
ENB = 0;
}
t++;
if(t >= 50)
{
t = 0;
}
}