当前位置:文档之家› PWM调速+循迹__智能小车程序

PWM调速+循迹__智能小车程序

PWM调速+循迹__智能小车程序
PWM调速+循迹__智能小车程序

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K 的上拉电阻。

/* 晶振采用12M,产生的PWM的频率约为100Hz */

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit en1=P3^4; /* L298的Enable A */

sbit en2=P3^5; /* L298的Enable B */

sbit s1=P1^0; /* L298的Input 1 */

sbit s2=P1^1; /* L298的Input 2 */

sbit s3=P1^3; /* L298的Input 3 */

sbit s4=P1^2; /* L298的Input 4 */

sbit R=P2^0;

sbit C=P2^1;

sbit L=P2^2;

sbit key=P1^4;

uchar t=0; /* 中断计数器*/

uchar m1=0; /* 电机1速度值*/

uchar m2=0; /* 电机2速度值*/

uchar tmp1,tmp2; /* 电机当前速度值*/

/* 电机控制函数index-电机号(1,2); speed-电机速度(0-100) */

void motor(uchar index, char speed)

{

if(speed<=100)

{

if(index==1) /* 电机1的处理*/

{

m1=abs(speed); /* 取速度的绝对值*/

s1=1;

s2=0;

}

if(index==2) /* 电机2的处理*/

{

m2=abs(speed); /* 电机2的速度控制*/

s3=1;

s4=0;

}

}

}

void Back(void)

{

s1=0;

s2=1;

s3=1;

s4=0;

}

void GO(void)

{

s1=1;

s2=0;

s3=1;

s4=0;

}

void TL(void)

{

s1=1;

s2=0;

s3=0;

s4=1;

}

void TR(void)

{

s1=0;

s2=1;

s3=1;

s4=0;

}

void STOP(void)

{

s1=1;

s2=1;

s3=1;

s4=1;

}

/*

void delay(uint j) /* 简易延时函数*/ {

for(j;j>0;j--);

} */

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

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

}

void main()

{

uchar i=0,j=0;

TMOD=0x02; /* 设定T0的工作模式为2 ,8位自动重置定时器,每过几个机器周期,计数器加一*/

TH0=0x9B; /* 装入定时器的初值,计数100次溢出*/

TL0=0x9B; /*装入时间常数*/

EA=1; /* 开中断*/

ET0=1; /* 定时器0允许中断*/

TR0=1; /* 启动定时器0 */

while(1)

{

if(key==1)

{

/* 电机实际控制演示*/

if(i<=100) // 正转加速

{

motor(1,i);

motor(2,i);

delay(5000);

i++;

}

else

{

GO();

}

}

else

{

EA=0;

while(1)

{

if((L|C|R)==0)

STOP();

if(L&R)

GO();

if(L==0)

{

while(C)

{

TL();

}

}

if(R==0)

{

while(C)

{

TR();

}

}

}

}

}

}

void timer0() interrupt 1 /* T0中断服务程序*/

{

if(t==0) /* 1个PWM周期完成后才会接受新数值*/

{ tmp1=m1;

tmp2=m2;

}

if(t

if(t>=100) t=0; /* 1个PWM信号由100次中断产生*/

}

#include

#include

/****************************************************************************** **\

** 宏定义区

**

\****************************************************************************** **/

/*------------------------------- LCD模块------------------------------------*/

#defineLCD_RW P2_6 //读写控制端

#defineLCD_RS P2_7 //数据命令选择端

#defineLCD_E P2_5 //执行使能端

#defineLCD_Data P1 //P1口

#defineWrite 0x00 //低电平写入

#defineRead 0x01 //高电平读出

#defineData 0x01 //高电平选择数据

#defineCmd 0x00 //低电平选择命令

#defineEnable 0x00 //跃变到低电平时执行命令

#defineDisable 0x01

#defineTrue 0x01

#defineFalse 0x00

#defineLCD_Init 0x38 //初始化模式

#defineLCD_DispCtr 0x0C //开显示及光标设置

#defineLCD_CloseCtr 0x08 //关显示

#defineLCD_CLS 0x01 //清屏幕

#defineLCD_EnterSet 0x06 //显示光标

#defineBusy P1_7 //忙信号

/*-------------------------- 测速/测距/测时模块-------------------------------*/

#defineCircleLength 0.132 //小车转一轮的长度为.132m

/*-------------------------------- 控速模块-----------------------------------*/

#defineP03 P0_3 //后电机

#defineP04 P0_4 //后电机

#defineP01 P0_1 //前电机

#defineP02 P0_2 //前电机

#defineP31 P0_5 //控制液晶背光

#defineP33 P3_3

/*------------------------------ 菜单选择模块---------------------------------*/

#defineLine 0x00 //0代表直线模式

#defineCurve 0x01 //1代表S型模式

#defineNormal 0x00 //0 代表正常速度

#defineLow 0x01 //1 代表低速

#defineHigh 0x02 //2 代表高速

/****************************************************************************** ***\

** 全局函数声明区**

\****************************************************************************** ***/

/*------------------------------- LCD模块-------------------------------------*/

voidLCDInit(void); //LCD初始化

voidSetWriteCmd(void); //设置写命令模式

voidSetReadCmd(void); //设置读命令模式

voidSetWriteData(void); //设置写数据模式

voidWriteCmd(charcmd); //写命令

voidWriteData(charddata); //写数据

voidExecuteCmd(void); //执行命令

voidSetXY(charx,chary); //定位显示地址

voidDisplaySingleChar(charx,chary,charcchar); //显示单个字符

voidDisplayString(charx,chary,char*str); //显示一段字符串

voidDelay(unsignedinttime); //延时主程序

voidDelayUs(unsignedinttime); //延时子程序

bit IsBusy(void); //判断忙标志函数

voidDisplayTime(void); //显示时间

voidDisplayAVGSpeed(void); //显示平均速度

voidDisplayDistance(void); //显示路程

/*-------------------------- 测速/测距/测时模块-------------------------------*/

voidINTInit(void); //所有中断初始化

voidSpeedINT(void); //测速中断

voidComputeTime(void);

voidComputeSpeedANDDistance(void); //计算速度和距离

/*-------------------------------- 控速模块-----------------------------------*/

voidCtrSpeedINT(void); //控速中断

voidTime0INT(void);

voidTime1INT(void); //控速单位时间中断

voidClock0_Init(void); //时钟中断初始化

voidClock1_Init(void); //时钟中断初始化

voidCtrSpeed(void);

/****************************************************************************** **\

** 全局变量区

**

\****************************************************************************** **/

float SpeedCount=0; //测速计数脉冲

float Speed=0.0;

float Distance=0.0;

char Time1INTCount=0; //T1中断时间计时

float PassTime=0.00; //小车行走的时间

short IsT0INT=1;

bit IsT1INT; //判断T1是否已经响应中断

short IsT0INT2=1;

char Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff}; //3ms,3ms,15ms,3ms char Tlx[5]={0x48,0x48,0x68,0x48,0xff};

char Thx0=0xd8;

char Tlx0=0xf0;

char Thx1=0xb1; //20ms

char Tlx1=0xe0;

short Round=0;

short Back=0;

short Back0=0;

bit Backid;

bit Stop=0;

char Area0=0;

char Area1=0; //区域变量

char LowSpeedArea1StartTime;

char LowSpeedArea1EndTime;

char HighSpeedAreaEndTime;

char LowSpeedArea2EndTime;

char LowSpeedArea1PassTime=0; //第一个低速区通过时间char HighSpeedAreaPassTime=0; //高速区通过时间

char LowSpeedArea2PassTime=0; //第二个低速区通过时间char ReadyToGo=4; //倒计时

char flag;

bit Roundid=0;

char Nocurve=0;

char ChangeFlag;

char Mode;

bit Running;

bit SelectedAll; //模式和速度是否选择完毕标志

bit IsSelectingMode; //模式选择标志

bit IsSelectingSpeed; //速度选择标志

bit ModeSelected; //已经被选择的模式标志

char SelectedMode=10; //模式选择是否完毕标志

bit Next; //Next键标志

bit SpeedSelected; //已经被选中的速度方案标志

char SelectedSpeed; //速度选择是否完毕标志

bit ChoosingDisplay; //人工选择菜单开始标志

bit SelectedShow; //显示选择标志

bit SelectedReturn; //返回选择标志

bit Selected; //确定/返回键选择标志

bit ReturnSelection; //返回键启用标志

bit A VGSpeedShow; //平均速度显示标志

bit TotalDistanceShow; //总路程显示标志

bit ReturnMain; //返回主菜单标志

bit AutoDisplay; //自动显示标志

bit GoToChoosingDisplay; //人工选择标志

bit AutoMode=0;

char PassLineID=0;

char PassLine=0;

float PrepareDistance;

float FirstDistance;

float SecondDistance;

float ThirdDistance;

int FirstHigh;

int SecondHigh;

int ThirdHigh;

float Rate=1.25; //5ms时的速度

float Count=4; //时间的倍数

/****************************************************************************** **\

** 全局函数实现区**

\****************************************************************************** **/

/*-------------------------------- 主函数------------------------------------*/

voidmain()

{

P01=0;

P02=0;

P03=0;

P04=0;

P31=1; //单片机复位,背光开

Delay(40); //延时等待LCD启动

LCDInit(); //初始化LCD

DisplayString(0x0,0," Starting... ");

DisplayString(0x0,1,"DesignedBy202");

Delay(300);

WriteCmd(LCD_CLS);

EA=1; //开总中断

EX0=1; //开INT0中断

IT0=1; //INTO边沿触发

EX1=1; //开INT1中断

IT1=1; //INT1边沿触发

SelectedAll=False; //开始模式和速度选择

/*------------------------------ 模式选择---------------------------------*/

DisplayString(0x0,0,"ChooseTheMode");

DisplayString(0x0,1,"youwant. ");

Delay(50);

WriteCmd(LCD_CLS);

IsSelectingMode=True;

while(1)

{

WriteCmd(LCD_CLS);

DisplayString(0x0,0," LineMode ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1) //不断检测中断,直到按确定键或是

NEXT键

{

if(Next==True) //如果按Next键则直接跳出

break;

if(ModeSelected==True) //如果按确定键则设置模式为Line并跳出

{

SelectedMode=Line;

break;

} //如果什么键都没有按下,那么一直

显示等待

}

if(ModeSelected==True) //按下了确定键,退出模式选择{

IsSelectingMode=False;

break;

}

if(Next==True) //按下了Next键,显示下一个菜单项

{

Next=False;

WriteCmd(LCD_CLS);

DisplayString(0x0,0," CurveMode ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1) //不断检测中断,直到按确定键或是

Next键

{

if(Next==True) //如果再一次按下Next键,则跳出break;

if(ModeSelected==True) //如果按下确定键,则设置模式为Curve,并跳出

{

SelectedMode=Curve;

break;

}

}

}

if(ModeSelected==True) //按下了确定键,退出模式选择

{

IsSelectingMode=False;

break;

}

if(Next==True) //再一次按下了Next键,则循环模式

选择

{

Next=False;

WriteCmd(LCD_CLS);

DisplayString(0x0,0," AutoMode ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1)

{

if(Next==True)

break;

if(ModeSelected==True)

{

AutoMode=1;

break;

}

}

}

if(ModeSelected==True)

{

IsSelectingMode=False;

break;

}

if(Next==True)

{

Next=False;

continue;

}

}

Delay(50);

WriteCmd(LCD_CLS);

/*------------------------------ 速度选择---------------------------------*/ if(SelectedMode==Line&&AutoMode==0)

{

DisplayString(0x0,0," NowChoosea ");

DisplayString(0x0,1," kindofSpeed");

Delay(50);

WriteCmd(LCD_CLS);

IsSelectingSpeed=True;

while(1)

{

WriteCmd(LCD_CLS);

DisplayString(0x0,0,"NormalSpeed ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1)

{

if(Next==True) //如果按Next键则直接跳出

break;

if(SpeedSelected==True) //如果按确定键则设置速度为Normal并跳出

{

Thx[0]=0xec;Tlx[0]=0x78; //5ms

Thx[1]=0xf0;Tlx[1]=0x60; //4ms

Thx[2]=0x8a;Tlx[2]=0xd0; //30ms

Thx[3]=0xf4;Tlx[3]=0x48; //3ms

SelectedSpeed=Normal;

break;

} //如果什么键都没有按下,那么一

直显示等待

}

if(SpeedSelected==True) //按下了确定键,退出速度选择{

IsSelectingSpeed=False;

break;

}

if(Next==True)

{

Next=False;

WriteCmd(LCD_CLS);

DisplayString(0x0,0," Low Speed ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1)

{

if(Next==True) //如果再一次按下Next键,则跳出break;

if(SpeedSelected==True) //如果按下确定键,则设置速度为Low,并跳出

{

SelectedSpeed=Low; //这里没有速度设置,因为默认

速度就是Low

break;

}

}

}

if(SpeedSelected==True) //按下了确定键,退出速度选择

{

IsSelectingSpeed=False;

break;

}

if(Next==True)

{

Next=False;

WriteCmd(LCD_CLS);

DisplayString(0x0,0," High Speed ");

DisplayString(0x0,1,"Next Yes");

Delay(300); //延时消除抖动

while(1)

{

if(Next==True) //如果再一次按下Next键,则跳出

break;

if(SpeedSelected==True) //如果按下确定键,则设置速度为High,并跳出

{

Thx[0]=0xe0;Tlx[0]=0xc0;//8ms

Thx[1]=0xe0;Tlx[1]=0xc0; //8ms

Thx[2]=0x63;Tlx[2]=0xc0; //40ms

Thx[3]=0xec;Tlx[3]=0x78; //5ms

SelectedSpeed=High;

break;

}

}

}

if(SpeedSelected==True) //按下了确定键,退出速度选择

{

IsSelectingSpeed=False;

break;

}

if(Next==True) //再一次按下了Next键,则循环速度

选择

{

Next=False;

continue;

}

}

SelectedAll=True; //标志模式选择和速度选择完毕

Running=True;

Delay(50);

WriteCmd(LCD_CLS);

/*------------------------- 显示所选择的模式和速度方案-------------------------*/ if(SelectedMode==Line)

{

DisplayString(0x0,0,"ChoosenModeis");

DisplayString(0x0,1," Line ");

Delay(50);

WriteCmd(LCD_CLS);

}

if(SelectedMode==Curve)

{

DisplayString(0x0,0,"ChoosenModeis");

DisplayString(0x0,1," Curve ");

Delay(50);

WriteCmd(LCD_CLS);

}

if(AutoMode==1)

{

DisplayString(0x0,0,"ChoosenModeis");

DisplayString(0x0,1," AutoMode ");

Delay(50);

WriteCmd(LCD_CLS);

}

if(SelectedMode==Line)

{

if(SelectedSpeed==Normal)

{

DisplayString(0x0,0,"ChoosenSpeedis");

DisplayString(0x0,1," Normal ");

Delay(50);

WriteCmd(LCD_CLS);

}

if(SelectedSpeed==Low)

{

DisplayString(0x0,0,"ChoosenSpeedis");

DisplayString(0x0,1," Low ");

Delay(50);

WriteCmd(LCD_CLS);

if(SelectedSpeed==High)

{

DisplayString(0x0,0,"ChoosenSpeedis"); DisplayString(0x0,1," High ");

Delay(50);

WriteCmd(LCD_CLS);

}

}

INTInit(); //初始化所有中断DisplayString(0x0,0,"LeftTimesToGo"); while(ReadyToGo--)

{

DisplaySingleChar(0x7,1,ReadyToGo+0x30); DisplaySingleChar(0x09,1,'s');

Delay(300);

}

WriteCmd(LCD_CLS);

DisplayString(0x05,0,"Go!!!");

Delay(100);

WriteCmd(LCD_CLS);

DisplayString(0x0,0," Living... "); DisplayString(0x0,1,"Designedby202");

if(SelectedMode==Line&&AutoMode==0) flag=Area0;

else

flag=1;

while(flag<5)

{

if(AutoMode==1) //自动模式

{

switch(PassLineID)

{

case0 :{

if(IsT0INT==1)

{P01=P02=P04=0;P03=1;}

else

{P01=P02=P03=P04=0;}

}break;

case1 :{

P01=P02=P03=0;P04=1;

}break;

case2 :{

P01=P02=P04=0;P03=1;

default:break;

}

}

else

{

if(SelectedMode==Line) //直线模式

{

flag=Area0;

if(IsT0INT==1)

{P03=1;P04=0;P01=P02=0;}

else

{P03=0;P04=0;P01=P02=0;}

}

else

{ //S型模式

if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0) {

if(Backid==1)

{P01=1;P02=0;P03=0;P04=1;}

else

{P01=0;P02=1;P03=0;P04=1;}

Back=1;

}

else

{

if(Round==0)

{

if(IsT0INT2==1)

{P01=0;P02=0;P03=1;P04=0;}

else

{P01=0;P02=0;P03=0;P04=0;}

}

else

{

if(P33==0)

{

if(IsT0INT2==1)

{P01=0;P02=0;P03=1;P04=0;}

else

{P01=0;P02=0;P03=0;P04=0;}

}

else

{

if(Round%2)

{

if(IsT0INT2==1)

{P01=1;P02=0;P03=1;P04=0;Backid=1;}

else

{P01=1;P02=0;P03=0;P04=0;}

}

else

{

if(IsT0INT2==1)

{P01=0;P02=1;P03=1;P04=0;Backid=0;}

else

{P01=0;P02=1;P03=0;P04=0;}

}

}

}

}

}

}

if(IsT1INT==1)

{

IsT1INT=0;

ComputeTime();

ComputeSpeedANDDistance();

}

}

//补中断路程,加上最后一次中断缺失的路程ComputeSpeedANDDistance();

P04=1;P03=0;P01=P02=0;Delay(90);

P03=0;P04=0; //行程结束,小车停止

P31=1; //行程结束,背光开

ET0=0x0; //关T0中断

ET1=0x0; //关T1中断

EX1=0x01; //开INT1中断

Running=False;

AutoDisplay=True; //默认情况下直线模式会自动显示各个区域经过的时间

WriteCmd(LCD_CLS);

if(SelectedMode==Line) //直线模式才显示

{

while(1)

{

if(GoToChoosingDisplay==True)

Delay(200);

WriteCmd(LCD_CLS);

Delay(200);

DisplayString(0,0,"LowSpeedArea1");

DisplayString(0,1,"Costed");

DisplaySingleChar(0x0C,1,'s');

LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime; DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);

if(LowSpeedArea1PassTime>9) //通过第一个低速区的时间超

过s

DisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);

if(GoToChoosingDisplay==True)

break;

Delay(200);

WriteCmd(LCD_CLS);

Delay(200);

DisplayString(0,0,"HighSpeedArea");

DisplayString(0,1,"Costed");

DisplaySingleChar(0x0C,1,'s');

HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime; DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);

if(HighSpeedAreaPassTime>9) //通过高速区的时间超过s

DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);

if(GoToChoosingDisplay==True)

break;

Delay(200);

WriteCmd(LCD_CLS);

Delay(200);

DisplayString(0,0,"LowSpeedArea2");

DisplayString(0,1,"Costed");

DisplaySingleChar(0x0C,1,'s');

LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime; DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);

if(LowSpeedArea2PassTime>9) //通过第二个低速区的时间超

过s

DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);

}

}

AutoDisplay=False;

/*---------------- 菜单选择你想要看的内容--总时间、总路程以及平均速度--------------*/ ChoosingDisplay=True;

WriteCmd(LCD_CLS);

/*首先显示主菜单,然后显示第一个选项*/

DisplayString(0x0,0,"NowChoosewhat");

DisplayString(0x0,1,"youwanttosee");

Delay(100);

while(1)

{

WriteCmd(LCD_CLS);

DisplayString(0x0,0," CostedTime ");

DisplayString(0x0,1,"Next Show");

Delay(250); //延时消除抖动

/*------------------------------------第一次按键--------------------------------------*/ /*不断检测确定键和Next键*/

while(1)

{

if(Next==True)

break;

if(SelectedShow==True)

break;

}

/*按下了确定键,显示第一个选项的内容*/

if(SelectedShow==True)

{

SelectedShow=False;

SelectedReturn=False;

Selected=False;

WriteCmd(LCD_CLS);

DisplayString(0,0,"CostedTimeis");

DisplayTime();

DisplayString(0x0A,1,"s");

ReturnSelection=True; //按下了确定键,那么这个时候开启返回

键的功能

A VGSpeedShow=False;

Delay(250); //延时消除抖动

}

/**按下了Next键,则显示第二个选项*/

if(Next==True) //按下Next键,显示A VGSpeed菜单项

{

Next=False;

WriteCmd(LCD_CLS);

DisplayString(0x0,0," A VGSpeed ");

DisplayString(0x0,1,"Next Show");

ReturnMain=False;

ReturnSelection=False; //按下了Next键,那么这个时候关闭返

回键的功能

A VGSpeedShow=True; //表明A VGSpeed选项已经显示过

Delay(250); //延时消除抖动

}

/*------------------------------------第二次按键--------------------------------------*/ /*显示第一个选项的内容后又不断检测返回键(确定键)和Next键*/ while(1)

{

if(Next==True)

break;

if(Selected==True)

break;

}

if(Next==True)

{

Next=False;

ReturnMain=False;

ReturnSelection=False; //按下了Next键,那么这个时候关闭返

回键的功能

if(A VGSpeedShow==False) //还没有显示A VGSpeed选项,显示它

{ //即第一次选择了确定键

WriteCmd(LCD_CLS);

DisplayString(0x0,0," A VGSpeed ");

DisplayString(0x0,1,"Next Show");

TotalDistanceShow=False; //显示了AVGSpeed,则表明TotalDistance还没有显示

Delay(250); //延时消除抖动

}

if(A VGSpeedShow==True) //已经显示过A VGSpeed选项了,则显示

下一个选项

{ //即第一次选择了Next键

WriteCmd(LCD_CLS);

DisplayString(0x0,0,"TotalDistance");

DisplayString(0x0,1,"Next Show");

TotalDistanceShow=True; //表明显示了TotalDistance

选项

Delay(250); //延时消除抖动

}

}

if(Selected==True) //按下了确定键或返回键

{

SelectedShow=False;

SelectedReturn=False;

Selected=False;

if(ReturnSelection==True) //第一次选择了确定键,故这次按下

的是返回键

ReturnMain=True;

if(ReturnSelection==False)

{

WriteCmd(LCD_CLS);

DisplayString(0,0,"TheA VGSpeedis");

DisplayA VGSpeed();

DisplayString(0x0A,1,"m/s");

ReturnSelection=True; //按下了确定键,那么这个时候开启返回

键的功能

Delay(250); //延时消除抖动

}

TotalDistanceShow=False;

}

if(ReturnMain==True) //按下了返回键,返回主菜单

{

ReturnMain=False;

continue;

}

/*------------------------------------第三次按键--------------------------------------*/ /*如果没有返回主菜单,则继续检测Next键和确定键*/

while(1)

{

if(Next==True)

break;

if(SelectedShow==True)

break;

}

/*按下Next键,显示下一个选项*/

if(Next==True)

{

Next=False;

ReturnMain=False;

ReturnSelection=False; //按下了Next键,那么这个时候关闭返

回键的功能

if(TotalDistanceShow==True)

ReturnMain=True;

if(TotalDistanceShow==False) //还没有显示TotalDistance选项,显示它{

WriteCmd(LCD_CLS);

DisplayString(0x0,0,"TotalDistance");

DisplayString(0x0,1,"Next Show");

TotalDistanceShow=True;

Delay(250); //延时消除抖动

智能小车单片机课程设计报告

题目: 智能小车设计 打开命令行终端的快捷方式: ctr+al+t:默认的路径在家目录 ctr+shift+n:默认的路径为上一次终端所处在的路径. linux@ubuntu:~$ linux:当前登录用户名. ubuntu:主机名 :和$之间:当前用户所处在的工作路径. windows下的工作路径如C:\Intel\Logs linux下的工作路径是:/.../..../ ~:代表的是/home/linux这个路径.(家目录). ls(list):列出当前路径下的文件名和目录名. ls -a(all):列出当前路径下的所有文件和目录名,包括了隐藏文件. .:当前路径 ..:上一级路径 ls -l:以横排的方式列出文件的详细信息 total 269464(当前这个路径总计所占空间的大小,单位是K) drwxr-xr-x 3 linux linux 4096 Dec 4 19:16 Desktop 第一个位置:代表的是文件的类型. linux系统下的文件类型有以下几种. b:块设备文件 c:字符设备文件 d:directory,目录 -:普通文件. l:连接文件. s:套接字文件. p:管道文件. rwxr-xr-x:权限 r:读权限-:没有相对应的权限 w:写权限

x:可执行权限 修改权限: chmod u-或者+r/w/x 文件名 chmod g-或者+r/w/x 文件名 chmod o-或者+r/w/x 文件名 第一组:用户权限 第二组:用户组的权限 第三组:其他用户的权限. chmod 三个数(权限) 文件名 首先根据你想要的权限生成二进制数,再根据二进制数转换成十进制的三位数 rwxr-x-wx 111101011 7 5 3 chmod 753 文件名 rwx--xr-x 第二个位置上的数字:对应目录下的子文件个数,如果是非目录,则数字是1 第三个位置:用户名(文件创造者). 第四个位置:用户组的名字(前边的用户所处在的用户组的名字). 第五个位置:对应文件所占的空间大小(单位为b) 第六~八个位置:Dec 4 19:16时间戳(最后一次修改文件的时间) 最后一个位置:文件名 操作文件: 1.创建一个普通文件:touch 文件名 2.删除一个文件:rm(remove) 文件名 3.新建一个目录:mkdir(make directory) 目录名 递归创建目录:mkdir -p 目录1/目录2/目录3 4.删除一个目录:rmdir 目录名.//仅删除一个空目录 rm -rf 目录名//删除一个非空目录 5.切换目录(change directory):cd 路径 linux下的路径分两种 相对路径:以.(当前路径)为起点. 绝对路径:以/(根目录)为起点, 用相对路径的方式进入Music:cd ./Music 用绝对路径的方式进入Desktop:cd /home/linux/Desktop 返回上一级:cd ..

智能循迹小车设计与实现

智能循迹小车设计与实现 摘要本文介绍的是基于单片机STC89C52控制智能循迹小车的设计。利用红外对光管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的运动,从而实现自动循迹避障的功能。其中小车的电机由LG9110驱动,整个系统的电路结构简单,可靠性高。 关键词STC89C52 LG9110 红外对光管循迹小车

The manufacture of intelligent tracking car Abstract This articale introduces the design of intelligent tracking car based on the STC89C52 single chip computer.Based infrared detection of black lines and the road obstacles,and use a STC89C52 MCU as the controlling core for the movement.A electronic drived,which can automatic track and avoid obstacle,was designed and fabricated.In which,the electric machinery of car is drived by the LG9110.The electric circuit stuction of whole system is simple,and the function is dependable. Keywords STC89C52 LG9110 Infrared emitting diode Tracking car

智能循迹小车程序

#include #define uchar unsigned char #define uint unsigned int //D0-D7:f,b,a,e,d,h,c,g 共阴依次编码 //74LS04反相器驱动数码管 uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示 uint j = 0; //计时的次数 uint time=0; //计时 uint pwm=16; //占空比 uint speed; //调制PWM波的当前的值 sbit R=P3^2; //右边传感器P3^2 sbit L=P3^3; //左边传感器P3^3 //电机驱动口定义 sbit E NB=P1^0; //前轮电机停止控制使能 sbit E NA=P1^1; //后轮控制调速控制端口 sbit I N1=P1^2; //前轮 sbit I N2=P1^3; //前轮 sbit I N3=P1^4; //后轮 sbit I N4=P1^5; //后轮 void Init() { TMOD = 0x12; //定时器0用方式2,定时器1用方式1 TH0=(256-200)/256; //pwm TL0=(256-200)/256; TH1 = 0x0F8; //定时2ms TL1 = 0x30; EA = 1; ET0 = 1; ET1 = 1; TR0 = 1; TR1 = 1; } void tim0(void) interrupt 1 //产生PWM { speed ++; if(speed <= pwm) //pwm 就相当于占100的比例 { ENA = 1; } else if(speed < 100) { ENA = 0; }

STM32智能小车主程序

//#include "delay.h" #include "usart1.h" //#include "remote.h" #include "PWM_OUT.h" //#include "Ultrasonic.h" #include "esp8266.h" #include "usart3.h" #include "HXD.h" #include "main.h" int main(void) { u16 i=0,x; u16 k,j; SystemInit(); USART1_Init();//串口1初始化 USART3_Init();//串口3初始化用于WIFI USART1_ONOFF(1); USART3_ONOFF(1); // Remote_Init();//初始化红外接收 // ULT_Init();//超声波初始化 HXD_Init(); PWM_Init();//初始化PWM(电机) WiFi_Init(); x=0; i=300; while(1) { USART_Work(); PWM_MoTo_Work(); huxiLED(i);

for (k=0;k<720;k++) { for(j=0;j<100;j++); } if((i>0)&&(x==0)){ i++; if(i==800)//灭 x=1; } if((i<801)&&(x==1)) { i--; if(i==500)// 亮 x=0; } // if(i>10) i=10; // if(Remote_Rdy)//处理红外遥控// { // // Remote_Work(); // } // if(PWM_Rdy)//处理电机PWM // { // PWM_MoTo_Work(); // } } }

基于STC89C52单片机-红外智能循迹小车 (1)

基于STC89C52单片机红外智能循迹小车 实验报告册 学院:电气工程学院 协会:电子科技协会 班级:电气1206 班 姓名:蔡申申 学号:201223910625 联系方式:151 **** ****

摘要 本报告论述了自己参加第八届河南工业大学科技创新大赛——基于STC89C52RC单片机红外智能循迹小车的方案论证、制作过程、调试过程。设计采用STC89C52RC单片机为核心控制器件,采用TCRT5000红外反射式开关传感器作为小车的循迹模块来识别白色路面中央的黑色引导线,采集信号并将信号转换为能被单片机识别的数字信号,单片机获取路面信息后,进行分析、处理,最后控制减速电机转动实现转向。实验表明:该系统抗干扰能力强、电路结构简单、制作成本低,运行平稳、可靠性好。 关键词:STC89C52单片机、反射式光电对管、PWM调速 减速电机

目录 摘要 (2) 1 绪论 (4) 1.1 智能循迹小车概述 (4) 1.1.1 循迹小车的发展历程回顾 (4) 1.1.2 智能循迹分类 (4) 1.1.3 智能循迹小车的应用 (5) 2 智能循迹小车总体设计方案 (5) 2.1 整体设计方案 (5) 2.1.1 系统设计步骤 (5) 2.1.2 系统基本组成 (5) 2.2 整体控制方案确定 (6) 3 系统的硬件设计 (6) 3.1 单片机电路的设计 (6) 3.1.1 单片机的功能特性描述 (6) 3.1.2 晶振电路 (7) 3.1.3 复位电路 (7) 3.2 光电传感器模块 (8) 3.2.1 传感器分布 (8) 3.3 电机驱动电路 (9) 3.3.1 L298N引脚结构 (9) 3.3.2 电机驱动原理 (9) 4 系统的软件设计 (10) 4.1 软件设计的流程 (10) 4.2 本系统的编译器 (10) 5 系统的总体调试 (11) 5.1 硬件的测试 (11) 5.2 系统的软件调试 (11) 结论 (11) 致谢 (11) 参考文献 (12) 附录A 原理图与模块电路图 (12) 附录B 程序代码 (13) 附录C 硬件实物图 (15)

智能小车源代码

#include 令狐采学 #include //#include"lcd.h" sbit TX=P2^7; sbit RX=P2^6; sbit PWM=P1^4; sbit Beep=P3^7; sbit led1=P3^3; sbit led2=P3^4; sbit led3=P3^5; /***********蓝牙切换按键**********/ sbit k1=P3^6; /***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/ #define leftdata 0x11 #define rightdata 0x22 #define forwarddata 0x33 #define backdata 0x44 #define stopdata 0x55 #define uchar unsigned char #define uint unsigned int

unsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration(); /***********电机端口定义************************/ sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转 /**************无线遥控模块定义****************/ sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端 void delay0(int a); void delay15us(void); void delay1ms(int z); void di(); //蜂鸣器函数声明 unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值 char flag =0; //量程溢出标志位 char f1,f2,f3,f4,n0; int a; int n;//运行次数判断标志 int s_left,s_right;

智能循迹小车C程序(完美-详尽)

-----------------------小车运行主程序------------------- -------------------------------------------------------- 简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口 直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮 单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。 这样小车便可在其上循迹运行。 @补充说明:该程序采取“右优先”的原则: 即右边有黑线向右转, 若无,前方有黑线,向前走, 若无,左边有黑线,向左转, 若全无,从右方向后转。 程序开头定义的变量的取值是根据我的小车所调试选择好的, 如果采用本程序,请自行调试适合自己小车的合适参数值。 编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级) 1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件 2.假定:遇到白线输出0,遇到黑线输出1; 如果实际电路是:遇到白线输出1,遇到黑线输出0, 这种情况下只需要将第四,第五句改成: #define m0 1 #define m1 0 即可。 3.说明1:直行---------------速度full_speed_left,full_speed_right. 转弯,调头速度------correct_speed_left,correct_speed_right. 微小校正时---------高速轮full_speed_left,full_speed_right; 低速轮correct_speed. 可以通过调节第六,七,八,九,十条程序,改变各个状态 下的占空比(Duty cycle ),以求达到合适的转弯,直行速度 4.lenth----------length检测到黑线到启动转动的时间间隔 5.width----------mid3在黑线上到脱离黑线的时间差 6.mid3-----------作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性, 常取其他对管的输出信号作为判断条件 7.check_right----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延

智能循迹小车总体设计方案

智能循迹小车总体设计方案 1.1 整体设计方案 本系统采用简单明了的设计方案。通过高发射功率红外光电二极管和高灵敏度光电晶体管组成的传感器循迹模块黑线路经,然后由AT89S52通过IO口控制L298N驱动模块改变两个直流电机的工作状态,最后实现小车循迹。 1.2系统设计步骤 (1)根据设计要求,确定控制方案; (2)将各个模块进行组装并进行简单调试; (3)画出程序流程图,使用C语言进行编程; (4)将程序烧录到单片机内; (5)进行调试以实现控制功能。 1.2.1系统基本组成 智能循迹小车主要由AT89S52单片机电路、循迹模块、L298N驱动模块、直流电机、小车底板、电源模块等组成。 (1)单片机电路:采用AT89S52芯片作为控制单元。AT89S52单片机具有低成本、高性能、抗干扰能力强、超低功耗、低电磁干扰,并且与传统的8051单片机程序兼容,无需改变硬件,支持在系统编程技术。使用ISP可不用编程器直接在PCB板上烧录程序,修改、调速都方便。 (2)循迹模块:采用脉冲调制反射红外发射接收器作为循迹传感器,调制信号带有交流分量,可减少外界的大量干扰。信号采集部分就相

当于智能循迹小车的眼睛,有它完成黑线识别并产生高、低平信号传送到控制单元,然后单片机生成指令来控制驱动模块来控制两个直流电机的工作状态,来完成自动循迹。 (3)L298N驱动模块:采用L298N作为点击驱动芯片。L298N具有高电压、大电流、响应频率高的全桥驱动芯片,一片L298N可以分别控制两个直流电机,并且带有控制使能端。该电机驱动芯片驱动能力强、操作方便、稳定性好,性能优良。L298N的使能端可以外接电平控制,也可以利用单片机进行软件控制,满足各种复杂电路的需要。另外,L298N的驱动功率较大,能够根据输入电压的大小输出不同的电压和功率,解决了负载能力不够的问题。

智能循迹小车详细制作过程

(穿山乙工作室)三天三十元做出智能车 基本设计思路: 1.基本车架(两个电机一体轮子+一 个万向轮) 2.单片机主控模块 3.电机驱动模块(内置5V电源输出) 4.黑白线循迹模块 0.准备所需基本元器件 1).基本二驱车体一台。(本课以穿山乙推出的基本车体为 例讲解) 2).5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红 色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40 个。 3).5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一 个;双孔接线柱三个、10u电解电容2个、排针12个、9110 驱动芯片2个。 4).5x7cm洞洞板、LM324比较器芯片各一个;红外对管三 对、4.7K电阻3个、330电阻三个、红色3mmLED三个。 一、组装车体

(图中显示的很清晰吧,照着上螺丝就行了) 二、制作单片机控制模块 材料:5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40个。 电路图如下,主要目的是把单片机的各个引脚用排针引出来,便于使用。我们也有焊接好的实物图供你参考。(如果你选用的是STC98系列的单片机在这里可以省掉复位电路不焊,仍能正常工作。我实物图中就没焊复位)

三、制作电机驱动模块 材料:5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一个;双孔接线柱三个、10u电解电容2个、排针12个、9110驱动芯片2个。 电路图如下,这里我们把电源模块与驱动模块含在了同一个电路板上。因为电机驱动模块所需的电压是+9V左右(6—15V 均可),而单片机主控和循迹模块所需电压均为+5V。 这里用了一个7805稳压芯片将+9V电压稳出+5V电压。

51红外循迹小车报告(舵机版)最终版

简易教程

前言 往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。 整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。系统分为检测、控制、驱动三个模块。首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。 智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。 个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。谢谢! 李学云王维 2016年7月27号

目录 前言 (1) 第一部分硬件设计 (1) 1.1 车模选择 (1) 1.2传感器选择 (1) 1.3 控制模块选择 (2) 第二部分软件设计及调试 (3) 2.1 开发环境 (3) 2.2总体框架 (3) 2.3 舵机程序设计与调试 (3) 2.3.1 程序设计 (3) 2.3.2 调试 (3) 2.3.3 程序代码 (4) 2.4 传感器调试 (5) 2.4.1 传感器好坏的检测 (5) 2.4.2 单片机能否识别信号并输出信号 (5) 2.5 综合调试 (7) 附录1 (9) 第一篇舵机(舵机及转向控制原理) (9) 1.1概述 (9) 1.2舵机的组成 (10) 1.3舵机工作原理 (11) 1.4舵机使用中应注意的事项 (12) 1.5如何利用程序实现转向 (12) 1.6舵机测试程序 (13) 附录2 (14) 第二篇光电红外传感器 (14) 2.1传感器的原理 (14) 2.2红外光电传感器ST188 结构图 (15) 2.3传感器的选择 (15) 2.4传感器的安装 (16) 2.5使用方法 (16) 2.7红外传感器输入输出调试程序 (17)

智能循迹小车分析方案

智能循迹小车设计 专业:自动化 班级:0804班 姓名: 指导老师: 2018年8月——2018年10月 摘要:

本课题是基于AT89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以 AT89S52 单片机为系统控制处理器;采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。 引言

当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。 作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车<特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。 无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛

智能小车源代码

#include #include //#include"lcd.h" sbit TX=P2^7; sbit RX=P2^6; sbit PWM=P1^4; sbit Beep=P3^7; sbit led1=P3^3; sbit led2=P3^4; sbit led3=P3^5; /***********蓝牙切换按键**********/ sbit k1=P3^6; /***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/ #define leftdata 0x11 #define rightdata 0x22 #define forwarddata 0x33 #define backdata 0x44 #define stopdata 0x55 #define uchar unsigned char #define uint unsigned int unsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration(); /***********电机端口定义************************/ sbit IN1=P1^0; //为高电平时,左电机后转 sbit IN2=P1^1; //为高电平时,左电机正转 sbit IN3=P1^2; //为高电平时,右电机正转 sbit IN4=P1^3; //为高电平时,右电机后转 /**************无线遥控模块定义****************/ sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端 void delay0(int a); void delay15us(void); void delay1ms(int z); void di(); //蜂鸣器函数声明

智能循迹小车C程序完美详尽

/*------------------------------------------------------ -----------------------小车运行主程序------------------- -------------------------------------------------------- 简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口 直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮 单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。 这样小车便可在其上循迹运行。 @补充说明:该程序采取“右优先”的原则: 即右边有黑线向右转, 若无,前方有黑线,向前走, 若无,左边有黑线,向左转, 若全无,从右方向后转。 程序开头定义的变量的取值是根据我的小车所调试选择好的, 如果采用本程序,请自行调试适合自己小车的合适参数值。 编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级) 1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件 2.假定:遇到白线输出0,遇到黑线输出1; 如果实际电路是:遇到白线输出1,遇到黑线输出0, 这种情况下只需要将第四,第五句改成: #define m0 1 #define m1 0 即可。 3.说明1:直行---------------速度full_speed_left,full_speed_right. 转弯,调头速度------correct_speed_left,correct_speed_right. 微小校正时---------高速轮full_speed_left,full_speed_right; 低速轮correct_speed. 可以通过调节第六,七,八,九,十条程序,改变各个状态 下的占空比(Duty cycle ),以求达到合适的转弯,直行速度 4.lenth----------length检测到黑线到启动转动的时间间隔 5.width----------mid3在黑线上到脱离黑线的时间差 6.mid3-----------作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性, 常取其他对管的输出信号作为判断条件 7.check_right----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延

智能循迹小车程序代码

/**************************************************************** ************ 硬件连接 P1_4接驱动模块ENA使能端,输入PWM信号调节速度 P1_5接驱动模块ENB使能端,输入PWM信号调节速度 P1_0 P1_1接IN1 IN2 当P1_0=1,P1_1=0; 时左电机正转驱动蓝色输出 端OUT1 OUT2接左电机 P1_0 P1_1接IN1 IN2 当P1_0=0,P1_1=1; 时左电机反转 P1_2 P1_3接IN3 IN4 当P1_2=1,P1_3=0; 时右电机正转驱动蓝色输出 端OUT3 OUT4接右电机 P1_2 P1_3接IN3 IN4 当P1_2=0,P1_3=1; 时右电机反转 P1_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1 P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2 P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3 P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4 八路寻迹传感器有信号(白线)为0 没有信号(黑线)为1 ***************************************************************** ***********/ #include #define Right_moto_pwm P1_4 //接驱动模块ENA使能端,输入PWM 信号调节速度 #define Left_moto_pwm P1_5 //接驱动模块ENB使能端,输入PWM 信号调节速度 #define Left_1_led P2_0 //四路寻迹模块接口第一路 #define Left_2_led P2_1 //四路寻迹模块接口第二路 #define Right_1_led P2_2 //四路寻迹模块接口第三路 #define Right_2_led P2_3 //四路寻迹模块接口第四路 #define Left_moto_go {P1_0=0,P1_1=1;} //左电机前进 #define Left_moto_back {P1_0=1,P1_1=0;} //左电机后退 #define Left_moto_stop {P1_0=1,P1_1=1;} //左电机停转 #define Right_moto_go {P1_2=0,P1_3=1;} //右电机前转

PWM调速+循迹__智能小车程序

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K 的上拉电阻。 /* 晶振采用12M,产生的PWM的频率约为100Hz */ #include #include #define uchar unsigned char #define uint unsigned int sbit en1=P3^4; /* L298的Enable A */ sbit en2=P3^5; /* L298的Enable B */ sbit s1=P1^0; /* L298的Input 1 */ sbit s2=P1^1; /* L298的Input 2 */ sbit s3=P1^3; /* L298的Input 3 */ sbit s4=P1^2; /* L298的Input 4 */ sbit R=P2^0; sbit C=P2^1; sbit L=P2^2; sbit key=P1^4; uchar t=0; /* 中断计数器*/ uchar m1=0; /* 电机1速度值*/ uchar m2=0; /* 电机2速度值*/ uchar tmp1,tmp2; /* 电机当前速度值*/ /* 电机控制函数index-电机号(1,2); speed-电机速度(0-100) */ void motor(uchar index, char speed) { if(speed<=100) { if(index==1) /* 电机1的处理*/ { m1=abs(speed); /* 取速度的绝对值*/ s1=1; s2=0; } if(index==2) /* 电机2的处理*/ { m2=abs(speed); /* 电机2的速度控制*/ s3=1; s4=0; } } } void Back(void) {

简易智能小车_源程序

简易智能小车——2003年全国大学生电子设计竞赛, c51源程序系统的单片机程序 #include "" #define det_Dist */ 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) 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0 { unsigned char i; P10=1; P2=((P2&240)|15); //停车 P07=1; delay(1000);//刹车制动 P07=0; Inter_EX0=1; cntIorn++; Display(cntIorn); for(i=0;i<40;i++) { P2=P2&249; delay(2);

P2=((P2&240)|15); delay(2); } P2=P2&249; delay(100); P2=((P2&240)|15); //停车 IornColor(); //判断铁片黑白,设置bkAim for(i=0;i<95;i++) { 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; }

智能循迹小车设计

智能循迹/避障小车研究 工作报告 一、智能循迹小车程序结构框图 二、Proteus仿真图 三、软件程序设计

一、智能循迹小车程序结构框图 经过几天在网上的查找,对智能循迹/避障小车有了大致的了 解, 一般有三个模块: 1、最基本的小车驱动模块,使用两个二相四线步进电机对小车的两个后轮分别进行驱动,前轮最好用万向轮,能使小车更好地转弯; 2、小车循迹模块,在小车底部有三个并排安装的红外对管,对黑色与白色的反射信号不同,经单片机处理后对小车进行相应处理; 3、避障模块,我写的程序中对于避障模块是用中断来处理的(即安装在小车车头的红外对管检测到有障碍物后,就会向单片机的P3_2口输出一个高电平或是低电平,这时中断程序将对小车进行预先设定好的避障处理),但是在程序结构框图中,我不太会表示中断处理方式,所以就用查询的方式画了。

N Y N Y 二、Proteus 仿真图 我用Proteus 大概地仿真了小车的运行状态。图中的两个二相四线步进电机就代表小车的左右轮(假定步进电机顺时针转动方向为小车前进方向),网上有很多种驱动芯片,在仿真时我只使用L298N 芯

片来驱动步进电机。用三个单刀双制开关模拟用于小车循迹的三个红外对管的输出信号,经一个与门与三极管开关连接到P3_3口,中断程序对P1_0, P1_1, P1_2三个口进行检测,并做出相应处理。同时因为避障模块的优先级高于循迹模块,所以将外部中断0用于避障,外部中断1用于循迹。P1_3口则用于检测小车是否到达终点。 1、小车驱动模块: 使用一片298芯片驱动一个二相四线步进电机,电机的电压为12V。

智能小车-电机源代码

直流电机控制Keil c51源代码 直流电机的开环控制Keil c51源代码 //-----------------------函数声明,变量定义-------------------------------------------------------- #include #include #include //-----------------------定义管脚-------------------------------------------------------- sbit PWM=P1^0; //PWM波形输出 sbit DR=P1^1; //方向控制 #define timer_data (256-100) //定时器预置值,12M时钟是,定时0.1ms #define PWM_T 100 //定义PWM的周期T为10ms unsigned char PWM_t; //PWM_t为脉冲宽度(0~100)时间为0~10ms unsigned char PWM_count; //输出PWM周期计数 unsigned char time_count; //定时计数 bit direction; //方向标志为 //-------------------------------------------------------------------------------------------------- // 函数名称:timer_init // 函数功能:初始化设施定时器 //-------------------------------------------------------------------------------------------------- void timer_init() { TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */ PCON=0x00; TF0=0; TH0=timer_data; //保证定时时长为0.1ms TL0=TH0; ET0=1; TR0=1; //开始计数 EA=1; //中断允许 } //-------------------------------------------------------------------------------------------------- // 函数名称:setting_PWM // 函数功能:设置PWM的脉冲宽度和设定方向 //-------------------------------------------------------------------------------------------------- void setting_PWM() { if(PWM_count==0) //初始设置 { PWM_t=20;

智能循迹小车程序

智能循迹小车程序 Document number:BGCG-0857-BTDO-0089-2022

#include<> #define uchar unsigned char #define uint unsigned int //D0-D7:f,b,a,e,d,h,c,g 共阴依次编码 //74LS04反相器驱动数码管 uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示uint j = 0; //计时的次数 uint time=0; //计时 uint pwm=16; //占空比 uint speed; //调制PWM波的当前的值 sbit R=P3^2; //右边传感器 P3^2 sbit L=P3^3; //左边传感器 P3^3 //电机驱动口定义 sbit ENB=P1^0; //前轮电机停止控制使能 sbit ENA=P1^1; //后轮控制调速控制端口 sbit IN1=P1^2; //前轮 sbit IN2=P1^3; //前轮 sbit IN3=P1^4; //后轮

sbit IN4=P1^5; //后轮 void Init() { TMOD = 0x12; //定时器0用方式2,定时器1用方式1 TH0=(256-200)/256; //pwm TL0=(256-200)/256; TH1 = 0x0F8; //定时2ms TL1 = 0x30; EA = 1; ET0 = 1; ET1 = 1; TR0 = 1; TR1 = 1; } void tim0(void) interrupt 1 //产生PWM { speed ++; if(speed <= pwm) //pwm 就相当于占100的比例{ ENA = 1; }

智能循迹小车详细源代码程序MSPID

巡线车程序(完整版) 1 #ifndef _Macro.h_ 2 #define _Macro.h_ 3 #include 4 #include 5 #define uchar unsigned char 6 #define uint unsigned int 7 #define one 11.11 8 #define LMAX 1999 9 #define RMAX 3999 10 #define CPU_F ((double)8000000) 11 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 12 13 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 14 #define PC 20 // 比例放大系数 15 #define IC 0 //积分放大系数 16 #define DC 85 //大系数 17 #define LEFTOUT TACCR1 18 #define RIGHTOUT TACCR2 19 #define SensorIn P5IN 20 #define F 5000//5000hz 21 #define Period (8000000/F) 22 #define EnableLeftPos P3OUT|=BIT1 23 #define UnenableLeftPos P3OUT&=~BIT1 24 25 #define EnableLeftNeg P3OUT|=BIT0 26 #define UnenableLeftNeg P3OUT&=~BIT0 27 28 #define EnableRightPos P3OUT|=BIT2 29 #define UnenableRightPos P3OUT&=~BIT2 30 31 #define EnableRightNeg P3OUT|=BIT3 32 #define UnenableRightNeg P3OUT&=~BIT3 33 34 #define Basic_Left 100//百分之八十 35 #define Basic_Right 100//Basic_Left 36 #define MAX (100) 37 #define MIN (-100) 38 #define foreward 1 39 #define backward 0

相关主题
文本预览
相关文档 最新文档