用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片

用c语言写一个单片机控制小车走直线的程序,小车一共3个轮子,一个万向轮,另两个是电机驱动的,用51单片,第1张

自己看注释改一下就行 函数都写好了了没用的删掉就可以了

#include<reg52.h>

#include<math.h>

#define uchar unsigned char

#define uint unsigned int

#define L_M 1

#define R_M 2

uchar temp2,temp1,t,m1,m2,redline

sbit tr=P2^4//超声波

sbit ec=P2^5//

sbit en=P2^7//液晶的EN

sbit rs=P2^6//液晶RS选择端

//液晶数据口 P0口

sbit Rin_1=P2^0//寻迹管脚输入

sbit Rin_2=P2^1

sbit Lin_2=P2^2

sbit Lin_1=P2^3

sbit L_EN=P1^0//左侧电机使能弊派

sbit L_1=P1^1//左侧电机控制 1

sbit L_2=P1^2//左侧电机控制 2

sbit R_1=P1^3//右侧电机控制 1

sbit R_2=P1^4//右侧电机控晌滚制 2

sbit R_EN=P1^5//右侧电机使能

void delay(uint z) //延时程序1

{

uint x,y

for(x=zx>0x--)

for(y=110y>0y--)

}

void delay1s(uchar t) //1s延时租谨贺函数

{

uchar a,h,i,j,k

for(a=ta>0a--)

{

for(h=5h>0h--)

for(i=4i>0i--)

for(j=116j>0j--)

for(k=214k>0k--)

}

}

void v_cotrol(uchar number,uchar speed)

{

if(speed<100)

{

if(number==1)

m1=abs(speed)

if(number==2)

m2=abs(speed)

}

}

void turnleft()

{

L_1=1// left fan zhuan //

L_2=0

R_1=1// right fanzhuan

R_2=0

}

void turnright()

{

L_1=0// left zheng zhuan

L_2=1

R_1=0// right fanzhuan

R_2=1

}

void gostright()

{

L_1=0// left zheng zhuan

L_2=1

R_1=1// right zhengzhuan

R_2=0

}

void goback()

{

L_1=1// left zheng zhuan

L_2=0

R_1=0// right zhengzhuan

R_2=1

}

void stop()

{

L_1=1// stop

L_2=1

R_1=1// stop

R_2=1

}

void timer0_int()

{

TMOD=0X01

TH0=-100/256

TL0=-100%256

EA=1

ET0=1

TR0=1

}

state_int()

{

Rin_1=1

Rin_1=1

Lin_1=1

Lin_1=1

t=0

m1=50

m2=50

stop()

}

void main()

{

timer0_int()

state_int()

while(1)

{

//避障程序

if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))

gostright()

if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

turnleft()

if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))

turnright()

if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

goback()

if((Lin_1==1)&&(Lin_2==1)&&(Rin_1==1)&&(Rin_2==1))

gostright()

if((Lin_1==1)&&(Lin_2==1)&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

turnleft()

if((Rin_1==1)&&(Rin_2==1)&&(((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0))))

turnright()

if((((Lin_1==1)&&(Lin_2==0))||((Lin_1==0)&&(Lin_2==1))||((Lin_1==0)&&(Lin_2==0)))&&(((Rin_1==1)&&(Rin_2==0))||((Rin_1==0)&&(Rin_2==1))||((Rin_1==0)&&(Rin_2==0))))

goback()

}

while(1)

}

timer0() interrupt 1

{

TH0=-100/256

TL0=-100%256

if(t==0)

{

temp1=m1

temp2=m2

}

if(t==temp1)

L_EN=0

if(t==temp2)

R_EN=0

t++

if(t==50)

{

t=0

L_EN=1

R_EN=1

}

}

程序需要结合硬件,不同硬件程序也不一样,就算硬件一样,连线方法不同程序也不一样。程序所实现的功能也不同,所以碰颂纳就算有程序,移植樱激性也比较差。下笑没面是我的小车黑白循迹的程序,包含前行转弯等,希望能帮到你

#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=0j<12000j++)

}

void wzhongduan()

{

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()

{

wzhongduan()

while(1)

{

switch(line)

{

case 2:EA=0case2()EA=1break

case 4:EA=0case2()EA=1break

case 7: EA=0youzhuan90()youzhuan90()youzhuan90()youzhuan90()EA=1break

case 10:EA=0case2()EA=1break

case 12:EA=0case2()EA=1break

case 15: EA=0youzhuan90()youzhuan90()youzhuan90()youzhuan90()EA=1break

default :xunji()

}

}

}

void w0 () interrupt 0

{

line++

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12387127.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存