Ⅰ STC的89C52做的循迹小车L298N的电机驱动急求一个c语言的驱动程序做循迹小车的有三个黑白关电
#include<reg51.h>
#define sen_port P1
sbit SEN1=P1^0;
sbit SEN2=P1^1;
sbit EN1=P2^2;
sbit IN1=P2^3;
sbit IN2=P2^4;
sbit EN2=P2^5;
sbit IN3=P2^6;
sbit IN4=P2^7;
void delay(int n) //延时子程序
{
unsigned char i,j,k;
for(i=n;i>0;i--)
for(j=100;j>0;j--)
for(k=200;k>0;k--);
}
unsigned char sensor_inp()
{
unsigned char sensor;
sensor = sen_port;
sensor &= 0x03;
P0 = sensor;
return sensor;
}
void forward() //two motos are runing forward
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void backward() //two motos are runing backward
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void turn_left() //left moto is runing, but right moto is brake
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
EN1=1;
EN2=1;
}
void rotate_left() //right moto is runing forward, and left moto is running backward
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
EN1=1;
EN2=1;
}
void turn_right() //right moto is runing, but left moto is brake
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void rotate_right() //left moto is running forward, and right moto is running backward
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
EN1=1;
EN2=1;
}
void free() //two motos is free
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
EN1=0;
EN2=0;
}
void stop() //two motos stop
{
IN1=1;
IN2=1;
IN3=1;
IN4=1;
EN1=1;
EN2=1;
}
void main(void)
{
delay(10);
P0=0x55;
while(1)
{
// P0=P1;
// delay(100); forward();
// delay(100); stop();
delay(100); backward();
delay(100); stop();
delay(100); turn_left();
delay(100); stop();
delay(100); turn_right();
delay(100); stop();
delay(100); rotate_left();
delay(100); stop();
delay(100); rotate_right();
delay(100); stop();
delay(100); stop();
delay(20); forward();
delay(20); backward();
delay(20);
/*
*/
}
}
这个是没有加传感器的,你试着加上传感器改一下,有问题可以发邮件 [email protected]...
Ⅱ 基于89C51单片机,L298N驱动的循迹小车C语言程序帮忙写一个
这个是lcd驱动程序啊,不是循迹小车驱动 配套程序: 接线方法程序里有
Ⅲ 求高手给一份c程序,用rpr220黑白循迹模块进行小车黑白循迹,有急用的!!!~~~谢谢了啊
#include<reg52.h>
#define uchar unsigned char; //char单字节整型数据或字符型数据
#define uint unsigned int; //int声明基本整型数据
#define PON 0
#define POFF 1
#define ON 1
#define OFF 0
#define SPEED2 100
#define SPEED1 50
uchar ito=0;
uchar m=0;
uchar time=0;
uchar PWM1=0;
uchar PWM2=0;
sbit p=P2^0; //控制左轮
sbit q=P2^1; //控制右轮
sbit p_green=P2^2;
sbit p_red=P2^3;
sbit TCRD1=P2^4;//此处是传感器RPR220管脚位声明
sbit TCRD2=P2^5;
sbit TCRD3=P2^6;
sbit TCRD4=P2^7;
int count1=0;//用于定时计数的两个全局变量位声明
int count2=0;
int x[4];
uchar table1[]={ 0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//0,1,2,3,4,5,6,7,8,9,关显示,数码管码表,高电平有效
unsigned char code table2[]=
{0xfe,0xfd,0xfb, //11111110,11111101,11111011
0xf7,0xef,0xdf,0xbf,0x7f,}; //11110111,11101111,11011111,10111111,01111111
unsigned char dp=0x7f; //Use AND to add the decimal point/clock point.
unsigned char cp;
int s=0;
int sec=0; //定义路程,时间
char a;
int idi=0;
int j=0;
bit rup3=0;
int GAO=4000;
int T=0;//处理时间中断3
int timeCount;//计时标志
int wheelCount;//测距标志
//int white=0;//测交叉线
void delay(int x)
{
int a;
int b;
for(a=x;a>0;a--)
for(b=125;b>0;b--);
}
void display()//显示时间和路程
{
//显示时间
P0=table1[x[idi]];
P1=table2[idi];
idi++;
if(idi==4)
idi=0;
delay(1);
}
void forward_turn1()//电机1前进
{
if(PWM1)
p=PON;
else
p=POFF;
}
void forward_turn2()//电机2前进
{
if(PWM2)
q=PON;
else
q=POFF;
}
void stop_turn1()//电机停止
{
P=POFF;
q=POFF;
}
void speed1(int ct,int sd)//电机1速度控制函数,其中参数 sd为生成 PWM 波
{
if(ct>=sd)
PWM1=0;
else
PWM1=1;
}
void speed2(int ct,int sd)//电机2速度控制函数,其中参数 sd为生成 PWM 波
{
if(ct>=sd)
PWM2=0;
else
PWM2=1;
}
void advance(int ct1,int sd1,int ct2,int sd2)//小车直线前进函数
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//*************以下是方案1, 通过使两轮一快一慢来实现转向*********
void left_turn1(int ct1,int sd1,int ct2,int sd2)//小车左转
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void right_turn1(int ct1,int sd1,int ct2,int sd2)//小车右转
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
//*************以下是方案2, 通过使两轮一慢传,一停转来实现转向***
void left_turn2(int ct1,int sd1,int ct2,int sd2)//小车左转
{
forward_turn1();
forward_turn2();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void right_turn2(int ct1,int sd1,int ct2,int sd2)//小车右转
{
forward_turn1();
stop_turn1();
speed1(ct1,sd1);
speed2(ct2,sd2);
}
void main()
{
p=1;
q=1;
TMOD=0x11;//中断模式设置
TH0=(65536-1000)/256;//定时器1初始化
TL0=(65536-1000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-1000)/256;//定时器2初始化
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
while(1)
{
..............
}
}
void time0()interrupt 1
{
TH0=(65536-5000)/256;//定时 5ms
TL0=(65536-5000)%256;
count1++;
ito++;
if(ito==200)
{
ito=0;
s++;
if(s==60)
{
s=0;
m++;
if(m==60)
{
m=0;
}
x[0]=m/10;
x[1]=m%10;
}
x[2] =s/10;
x[3] =s%10;
}
display();
if(count1==SPEED2)//周期是1s
count1=0;
count2++;
if(count2==SPEED2)//周期是1s
count2=0;
}
Ⅳ 急求基于MSP430单片机编写的智能循迹小车C语言程序。要求小车能按圆形轨迹和8字形轨迹行驶。
MSP430
专门的教材
MSP430
有本署名
Ⅳ 下面一段c语言代码驱动小车实现三路循迹,停车5秒,壁障,寻光,但是下载到单片机中,驱动小车存在问题。
三个问题:
1. 你的flag没有初始化。
2. while(flag!=1){}中的代码有些问题。有几处应加上{ },给你改了一下:
while(flag!=1)
{
if(a5==0)
qianjin();
else
{ if(a4==0)
zuozhuan();
else
{ if(a6==0)
youzhuan();
else
flag=1;
}
}
}
3. 为什么不在最外层设置大循环?
Ⅵ 单片机小车C语言行走程序,注释
程序需要结合硬件,不同硬件程序也不一样,就算硬件一样,连线方法不同程序也不一样。程序所实现的功能也不同,所以就算有程序,移植性也比较差。下面是我的小车黑白循迹的程序,包含前行转弯等,希望能帮到你
#include <reg52.h>
sbit z0 = P1^0;
sbit z1 = P1^1;
sbit y0 = P1^2;
sbit y1 = P1^3;
sbit x = P1^4;
sbit m = P3^2;
sbit zm0 = P2^0;
sbit zm1 = P2^1;
sbit ym0 = P2^2;
sbit ym1 = P2^3;
unsigned int line=0,j=0;
void turnright()
{
ym0=1;
ym1=1;
zm0=1;
zm1=0;
}
void turnleft()
{
ym0=0;
ym1=1;
zm0=1;
zm1=1;
}
void zuozq()
{
ym0=0;
ym1=1;
zm0=0;
zm1=1;
}
void youzq()
{
ym0=1;
ym1=0;
zm0=1;
zm1=0;
}
void qianxing()
{
ym0=0;
ym1=1;
zm0=1;
zm1=0;
}
void stop()
{
ym0=1;
ym1=1;
zm0=1;
zm1=1;
}
void xunji()
{
if(z1==1&& y0==1) //检测到黑线为低电位
qianxing();
if(z1==0&& y0==0)
qianxing();
if(z1==0&& y0==1)
turnleft();
if( y0==0&&z1==1)
turnright();
// if(z0==0&& y1==1)
// turnleft();
// if( y0==0&&z0==1)
// turnright();
}
void yanshi(unsigned int i)
{
unsigned int j;
while(--i)
for(j=0;j<12000;j++);
}
void wzhongan()
{
IT0=1;
EA=1;
EX0=1;
}
void youzhuan90()
{
youzq();
yanshi(3);
while(1)
{
youzq();
if(x==0)
break;
}
}
void case2()
{
youzq();
yanshi(5);
while(1)
{
if(m==0)
{
stop();
yanshi(10);
//
break;
}
}
zuozq();
yanshi(5);
while(1)
{
if(x==0)
{
qianxing();
yanshi(5);
break;
}
}
}
void zhuanshen()
{
EA=0;
while(1)
{
youzq();
yanshi(2);
if(m==0)
{
yanshi(2);
j++;
}
if(j>=4)
if(x==0)
{
xunji();
yanshi(3);
break;
}
}
EA=1;
}
void main()
{
wzhongan();
while(1)
{
switch(line)
{
case 2:EA=0; case2();EA=1;break;
case 4:EA=0; case2();EA=1;break;
case 7: EA=0;youzhuan90();youzhuan90();youzhuan90();youzhuan90();EA=1;break;
case 10:EA=0; case2();EA=1;break;
case 12:EA=0; case2();EA=1;break;
case 15: EA=0;youzhuan90();youzhuan90();youzhuan90();youzhuan90();EA=1;break;
default :xunji();
}
}
}
void w0 () interrupt 0
{
line++;
}