寻迹小车的c程序

寻迹小车的c程序,第1张

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit moto1=P1^5

sbit moto2=P1^6

sbit moto3=P2^0

sbit moto4=P2^1

sbit en1=P1^7

sbit en2=P2^2

//渣桥桥*循迹口 七个红外传感器*///////////////

sbit left1=P1^0//*左边传感器*//

sbit left2=P1^1

sbit left3=P1^2

sbit mid=P1^3//*黑线位置*//

sbit right1=P1^4

sbit right2=P2^3

sbit right3=P2^4//*右边传感器*///////如猛/////////

sbit hled=P0^0

sbit bled=P0^1

sbit lled=P0^2

sbit rled=P0^3

sbit bizhang=P2^5

uchar pro_head

uchar pro_back

uchar i

uchar j//前后占空比标志

void delay(uint z)

{

uchar i

while(z--)

{

for(i=0i<121i++)

}

}

/********初始化定时器,中断************/

void init()

{

TMOD=0x01

TH0=(65536-100)/256

TL0=(65536-100)%256

EA=1

ET0=1

TR0=1

en1=1

en2=1

}

void time0(void) interrupt 1

{

i++

j++

if(i<=pro_back)

{

en1=1

}

else

{

en1=0

}

if(i==40)

{

en1=~en1

i=0

}

if(j<=pro_head)

{

en2=1

}

else

{

en2=0

}

if(j==40)

{

en2=~en2

j=0

}

TH0=(65536-100)/256

TL0=(65536-100)%256

}

void qianjin()//*直行*/////////////////////

{

pro_back=15

pro_head=5

moto1=0

moto2=0

moto3=1

moto4=0

lled=1

rled=1

bled=1

}

void turn_right1()//消备*右转1函数*//

{

pro_back=10

pro_head=15

moto1=0

moto2=1

moto3=1

moto4=0

}

。。。。。。。

void xunji() //*循迹函数*//

{

uchar flag

if((left1==0)&&(left2==0)&&(left3==1)&&(mid==1)&&(right1==0)&&(right2==0)&&(right3==0))

{

flag=1

}

else if((left1==0)&&(left2==0)&&(left3==1)&&(mid==0)&&(right1==0)&&(right2==0)&&(right3==0))

{

flag=2

}

else if((left1==0)&&(left2==1)&&(left3==1)&&(mid==0)&&(right1==0)&&(right2==0)&&(right3==0))

{

flag=3

}

、。。。。。。。。。。。。。

switch (flag)

{

case 0:qianjin()headled()

break

case 1:turn_left1()leftled()

break

case 2:turn_left2()leftled()

、。。。。。。。。。。。。。。。break default:backled()

break

}

}

void main()

{

init()

delay(600)

jiance()

delay(300)

while(1)

{

if(bizhang==1)

{

xunji()

}

else

bz()

}

}、、、、、、、、、中间省略了,自己根据需要写吧

智能小车程序

#include "reg52.h"

#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4

#define RD 9 //小车对角轴长度

#define PI 3.1415926

#define ANG_90 90

#define ANG_90_T 102

#define ANG_180 189

/*============================全局变量定义区============================*/

sbit P10=P1^0//控制继电器的开闭

sbit P11=P1^1//控制金属接近开关

sbit P12=P1^2//控制颜色传感器的开闭

sbit P07=P0^7//控制声光信号的开启

sbit P26=P2^6//接收颜色传感器的信号,白为0,黑为1

sbit P24=P2^4//左

sbit P25=P2^5//右 接收左右光传感器的信号,有光为0

unsigned char mType=0//设置运动的方式,0 向前 1 向左 2 向没搭后 3 向右

unsigned char Direction=0//小车的即时朝向 0 朝上 1 朝左 2 朝下 3 朝右

unsigned sX=50unsigned char sY=0//小车的相对右下角的坐标 CM(sX,sY)

unsigned char StartTask=0//获得铁片后开始执行返回卸货任务,StartTask置一

unsigned char Inter_EX0=0// 完成一个完整的任务期间只能有一次外部中断

// Inter_EX0记录外部中断0的中断状态

// 0 动作最近的前一次未中断过,

// 1 动作最近的前一丛森次中断过

unsigned char cntIorn=0//铁片数

unsigned char bkAim=2//回程目的地,0为A仓库,1为B仓库,2为停车场,

//(在MAIN中接受铁片颜色判断传感器的信号来赋值)

unsigned char Light_Flag=0//进入光引导区的标志(1)

unsigned int cntTime_5Min=0//时间周期数渗察亩,用于 T0 精确定时

unsigned int cntTime_Plues=0//霍尔开关产生的脉冲数

/*============================全局变量定义区============================*/

/*------------------------------------------------*/

/*-----------------通用延迟程序-------------------*/

/*------------------------------------------------*/

void delay(unsigned int time) // time*0.5ms延时

{

unsigned int i,j

for(j=0j<timej++)

{

for(i=0i<60i++)

{}

}

}

/*-----------------------------------------------*/

/*-------------------显示控制模块----------------*/

/*-----------------------------------------------*/

/*数码管显示,显示铁片的数目(设接在P0,共阴)*/

void Display(unsigned char n)

{

char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}

P0=Numb[n]

}

/*-----------------------------------------------*/

/*-------------------传感器模块------------------*/

/*-----------------------------------------------*/

/*光源检测程序: */

/*用于纠正小车运行路线的正确性*/

unsigned char LightSeek()

{ void Display(unsigned char)

bit l,r

l=P24

r=P25

if(l==0&&r==1)

{

//Display(1)

return (3)//偏左,向右开

}

if(r==0&&l==1)

{

//Display(3)

return(1)//偏右,向左开

}

if((l==1&&r==1)||(l==0&&r==0))

{//Display(9)

return(0)//没有偏离,前进

}

}

/*铁片检测程序: */

/*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/

void IornColor()

{

delay(4000)

bkAim=(int)(P26)

Display((int)(P26)+2)

}

/*-----------------------------------------------*/

/*------------------运动控制模块-----------------*/

/*-----------------------------------------------*/

/*====基本动作层:完成基本运动动作的程序集====*/

/*运动调整程序: */

/*对小车的运动进行微调*/

void ctrMotor_Adjust(unsigned char t)

{

if(t==0)

{

P2=P2&240|11//用来解决两电机不对称的问题

delay(6)

}

if(t==3)

{

P2=P2&250//向左走

delay(1)

}

if(t==1)

{

P2=(P2&245)

delay(1)//向右走

}

P2=((P2&240)|15)

delay(10)

}

/*直走程序:*/

/*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/

/*只改变小车sX 和 sY的值而不改变Direction的值. */

void ctrMotor_Dist(float dist,unsigned char type)

{unsigned char t=0

mType=type

P2=((P2&240)|15)

cntTime_Plues=(int)(dist/det_Dist)

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0

break

}

if(Light_Flag==1) t=LightSeek()

if(type==0) //向前走

{

P2=P2&249

delay(40)

ctrMotor_Adjust(t)

}

if(type==2) //向后退

{

P2=P2&246

delay(50)

ctrMotor_Adjust(t)

}

P2=((P2&240)|15)

if(mType==2) delay(60)//刹车制动 0.5ms

else delay(75)

}

}

/*拐弯程序: */

/*控制小车运动角度,type为运动方式(1 3) */

/*只改变小车Direction的值而不改变sX 和 sY的值*/

void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir)

{

unsigned char i=0

mType=type

P2=((P2&240)|15)

cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90)

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0

break

}

if(type==1) //向左走

{

P2=P2&250

delay(100)

ctrMotor_Adjust(0)

}

if(type==3) //向右走

{

P2=P2&245

delay(100)

ctrMotor_Adjust(0)

}

P2=((P2&240)|15)

delay(50)//刹车制动 0.5ms

}

if(!(Inter_EX0==1&&StartTask==0))

{

Direction=dir

}

}

/*====基本路线层:描述小车基本运动路线的程序集====*/

/*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/

void rchPlace()

{unsigned int time,b,s,g

time=(int)(cntTime_5Min*0.065535)//只有一个数码管时,轮流显示全过程秒数 个 十 百

b=time%100

s=(time-b*100)%100

g=(time-b*100-s*10)%10

if(bkAim==2)

{

//到达停车场了,停车

EA=0

P2=((P2&240)|15)

while(1)

{

Display(10)//N

delay(2000)

Display(cntIorn)

delay(2000)

Display(11)//A

delay(2000)

Display(b)

delay(2000)

Display(s)

delay(2000)

Display(g)

delay(2000)

}

}

else

{

if(Inter_EX0==1&&StartTask==1)P10=0//到达仓库,卸下铁片

}

}

/*无任务模式: */

/*设置小车的固定运动路线,未发现铁片时的运动路线*/

void BasicRoute()

{ //Light_Flag=1

ctrMotor_Dist(153,0)

//Light_Flag=0

ctrMotor_Ang(ANG_90,1,1)

ctrMotor_Dist(100-sX,0)

ctrMotor_Dist(125,2)

ctrMotor_Dist(73,0)

ctrMotor_Ang(ANG_90,1,2)

//Light_Flag=1

ctrMotor_Dist(153,0)

//Light_Flag=0

ctrMotor_Ang(ANG_180,1,0)

rchPlace()

}

/*任务模式: */

/*设置小车的发现铁片后的运动路线*/

void TaskRoute()

{

//基本运行路线表,记载拐弯 0 向前 1 左拐 2 向后 3 右拐,正读去A区反读去B区

StartTask=1

ctrMotor_Ang(ANG_90_T,1,2)

if(bkAim==1)//仓库A

{

ctrMotor_Dist(10,0)

P2=((P2&240)|15)

delay(60)

ctrMotor_Ang(ANG_90_T,1,3)

ctrMotor_Dist(100-sX,2)

ctrMotor_Ang(ANG_90_T,1,2)

Light_Flag=1

ctrMotor_Dist(153,2)

Light_Flag=0

// ctrMotor_Ang(208,1,0)

}

else if(bkAim==0) //仓库B

{

ctrMotor_Dist(10,0)

P2=((P2&240)|15)

delay(60)

ctrMotor_Ang(ANG_90_T,1,3)

ctrMotor_Dist(100-sX,0)

ctrMotor_Ang(ANG_90_T,1,0)

Light_Flag=1

ctrMotor_Dist(153,2)

Light_Flag=0

//ctrMotor_Ang(208,1,0)

}

delay(5000)

rchPlace()

}

/*---------------------------------------------*/

/*-------------------主程序段------------------*/

/*---------------------------------------------*/

void main()

{

delay(4000)

P2=0xff//初始化端口

P07=0

P1=0

TMOD=0x01//初始化定时器0/1 及其中断

TL0=0

TH0=0

TR0=1

ET0=1

ET1=1

IT0=1//初始化外部中断

EX0=1

IT1=1

EX1=1

EA=1

P11=1

while(1)

{

Display(cntIorn)

bkAim=2

BasicRoute()

if(Inter_EX0==1)

{

TaskRoute()//按获得铁片后的路线运动

IE0=0

EX0=1

}

Inter_EX0=0

}

}

/*----------------------------------------------------*/

/*----------------------中断程序段--------------------*/

/*----------------------------------------------------*/

/*定时器0中断程序: */

/*当时间过了5分钟,则就地停车并进入休眠状态*/

void tmOver(void) interrupt 1

{

cntTime_5Min++

TL0=0

TH0=0

if(cntTime_5Min>=4520)

{

Display(5)

P2=((P2&240)|15)

EA=0//停车程序

P07=1

delay(4000)

PCON=0X00

while(1)

}

}

/*外部中断0中断程序: */

/*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*/

/*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/

void fndIorn(void) interrupt 0

{

unsigned char i

P10=1

P2=((P2&240)|15)//停车

P07=1

delay(1000)//刹车制动 0.5ms

P07=0

Inter_EX0=1

cntIorn++

Display(cntIorn)

for(i=0i<40i++)

{

P2=P2&249

delay(2)

P2=((P2&240)|15)

delay(2)

}

P2=P2&249

delay(100)

P2=((P2&240)|15)//停车

IornColor()//判断铁片黑白,设置bkAim

for(i=0i<95i++)

{

P2=P2&249

delay(3)

P2=((P2&240)|15)

delay(2)

}

P2=((P2&240)|15)//停车

delay(4000)//把铁片吸起来

EX0=0

}

/*外部中断1中断程序:*/

/*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/

void stpMove(void) interrupt 2

{

cntTime_Plues--

if(Direction==0) //向上

{

if(mType==0) sY+=det_Dist

else if(mType==2)

sY-=det_Dist

}

else if(Direction==1) //向左

{

if(mType==0) sX+=det_Dist

else if(mType==2)

sX-=det_Dist

}

else if(Direction==2) //向下

{

if(mType==0) sY-=det_Dist

else if(mType==2)

sY+=det_Dist

}

else if(Direction==3) //向右

{

if(mType==0) sX-=det_Dist

else if(mType==2)

sX+=det_Dist

}

我也是初次做小车

上面的是我做玩后的一些见解

你这个可以这样

你的小车每到一个分岔口(“T”或者“十”型路口)就随机选择一个寻迹方向(路线),并且把第一个寻迹值保存起来(就是记住这次小车是往哪里走的,防坦耐止下次走重复的路)。

小车走下去会有2种情况:

1,小车此次走的路线正确 继续前历信尺走,肢高值到下一个路口

2,小车走了一段路后没路了,又分为2种情况:

(1),小车走错路了,得退回去,这时候小车可以后退寻迹,直到返回分岔口,再重复上面过程(注意,此时小车选择路线时要和前面保存起来的值进行对比,不可以再走小车前面走过的错路了,并且还得把这次跑的方向保存,下面小车如果在这个点在此返回了,小车选择路线时就要排除上面2次的路线了,以此类推)

(2),小车到终点了,我看了你们的跑道情况,终点前面有2个断点,可以利用这个区分小车是到了终点还是跑错路了

程序可能有点复杂,祝你们成功


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存