PWM调速+循迹智能小车程序Word文档格式.docx

上传人:b****5 文档编号:20846845 上传时间:2023-01-26 格式:DOCX 页数:50 大小:24.37KB
下载 相关 举报
PWM调速+循迹智能小车程序Word文档格式.docx_第1页
第1页 / 共50页
PWM调速+循迹智能小车程序Word文档格式.docx_第2页
第2页 / 共50页
PWM调速+循迹智能小车程序Word文档格式.docx_第3页
第3页 / 共50页
PWM调速+循迹智能小车程序Word文档格式.docx_第4页
第4页 / 共50页
PWM调速+循迹智能小车程序Word文档格式.docx_第5页
第5页 / 共50页
点击查看更多>>
下载资源
资源描述

PWM调速+循迹智能小车程序Word文档格式.docx

《PWM调速+循迹智能小车程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《PWM调速+循迹智能小车程序Word文档格式.docx(50页珍藏版)》请在冰豆网上搜索。

PWM调速+循迹智能小车程序Word文档格式.docx

s1=1;

s2=0;

}

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

m2=abs(speed);

/*电机2的速度控制*/

s3=1;

s4=0;

}

voidBack(void)

s1=0;

s2=1;

s3=1;

s4=0;

voidGO(void)

s1=1;

s2=0;

voidTL(void)

s3=0;

s4=1;

voidTR(void)

voidSTOP(void)

/*

voiddelay(uintj)/*简易延时函数*/

{

for(j;

j>

0;

j--);

}*/

voiddelay(uintz)

uintx,y;

for(x=z;

x>

x--)

for(y=110;

y>

y--);

voidmain()

uchari=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();

}

EA=0;

{

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

STOP();

if(L&

R)

GO();

if(L==0)

{

while(C)

{

TL();

}

}

if(R==0)

{

TR();

}

}

voidtimer0()interrupt1/*T0中断服务程序*/

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

{tmp1=m1;

tmp2=m2;

if(t<

tmp1)en1=1;

elseen1=0;

/*产生电机1的PWM信号*/

tmp2)en2=1;

elseen2=0;

/*产生电机2的PWM信号*/

t++;

if(t>

=100)t=0;

/*1个PWM信号由100次中断产生*/

 

intrins.h>

AT89X52.h>

/******************************************************************************

**\

**宏定义区

**

\******************************************************************************

**/

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

#defineLCD_RWP2_6//读写控制端

#defineLCD_RSP2_7//数据命令选择端

#defineLCD_EP2_5//执行使能端

#defineLCD_DataP1//P1口

#defineWrite0x00//低电平写入

#defineRead0x01//高电平读出

#defineData0x01//高电平选择数据

#defineCmd0x00//低电平选择命令

#defineEnable0x00//跃变到低电平时执行命令

#defineDisable0x01

#defineTrue0x01

#defineFalse0x00

#defineLCD_Init0x38//初始化模式

#defineLCD_DispCtr0x0C//开显示及光标设置

#defineLCD_CloseCtr0x08//关显示

#defineLCD_CLS0x01//清屏幕

#defineLCD_EnterSet0x06//显示光标

#defineBusyP1_7//忙信号

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

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

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

#defineP03P0_3//后电机

#defineP04P0_4//后电机

#defineP01P0_1//前电机

#defineP02P0_2//前电机

#defineP31P0_5//控制液晶背光

#defineP33P3_3

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

#defineLine0x00//0代表直线模式

#defineCurve0x01//1代表S型模式

#defineNormal0x00//0代表正常速度

#defineLow0x01//1代表低速

#defineHigh0x02//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);

//延时子程序

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

**全局变量区

floatSpeedCount=0;

//测速计数脉冲

floatSpeed=0.0;

floatDistance=0.0;

charTime1INTCount=0;

//T1中断时间计时

floatPassTime=0.00;

//小车行走的时间

shortIsT0INT=1;

bitIsT1INT;

//判断T1是否已经响应中断

shortIsT0INT2=1;

charThx[5]={0xf4,0xf4,0xc5,0xf4,0xff};

//3ms,3ms,15ms,3ms

charTlx[5]={0x48,0x48,0x68,0x48,0xff};

charThx0=0xd8;

charTlx0=0xf0;

charThx1=0xb1;

//20ms

charTlx1=0xe0;

shortRound=0;

shortBack=0;

shortBack0=0;

bitBackid;

bitStop=0;

charArea0=0;

charArea1=0;

//区域变量

charLowSpeedArea1StartTime;

charLowSpeedArea1EndTime;

charHighSpeedAreaEndTime;

charLowSpeedArea2EndTime;

charLowSpeedArea1PassTime=0;

//第一个低速区通过时间

charHighSpeedAreaPassTime=0;

//高速区通过时间

charLowSpeedArea2PassTime=0;

//第二个低速区通过时间

charReadyToGo=4;

//倒计时

charflag;

bitRoundid=0;

charNocurve=0;

charChangeFlag;

charMode;

bitRunning;

bitSelectedAll;

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

bitIsSelectingMode;

//模式选择标志

bitIsSelectingSpeed;

//速度选择标志

bitModeSelected;

//已经被选择的模式标志

charSelectedMode=10;

//模式选择是否完毕标志

bitNext;

//Next键标志

bitSpeedSelected;

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

charSelectedSpeed;

//速度选择是否完毕标志

bitChoosingDisplay;

//人工选择菜单开始标志

bitSelectedShow;

//显示选择标志

bitSelectedReturn;

//返回选择标志

bitSelected;

//确定/返回键选择标志

bitReturnSelection;

//返回键启用标志

bitAVGSpeedShow;

//平均速度显示标志

bitTotalDistanceShow;

//总路程显示标志

bitReturnMain;

//返回主菜单标志

bitAutoDisplay;

//自动显示标志

bitGoToChoosingDisplay;

//人工选择标志

bitAutoMode=0;

charPassLineID=0;

charPassLine=0;

floatPrepareDistance;

floatFirstDistance;

floatSecondDistance;

floatThirdDistance;

intFirstHigh;

intSecondHigh;

intThirdHigh;

floatRate=1.25;

//5ms时的速度

floatCount=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);

//开总中断

EX0=1;

//开INT0中断

IT0=1;

//INTO边沿触发

EX1=1;

//开INT1中断

IT1=1;

//INT1边沿触发

SelectedAll=False;

//开始模式和速度选择

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

ChooseTheMode"

youwant."

Delay(50);

IsSelectingMode=True;

LineMode"

NextYes"

//延时消除抖动

while

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

NEXT键

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

break;

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

Line并跳出

SelectedMode=Line;

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

显示等待

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

IsSelectingMode=False;

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

Next=False;

CurveMode"

Next键

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

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

Curve,并跳出

SelectedMode=Curve;

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

选择

AutoMode"

if(Next==True)

if(ModeSelected==True)

AutoMode=1;

continue;

/*------------------------------速度选择---------------------------------*/

if(SelectedMode==Line&

&

AutoMode==0)

NowChoosea"

kindofSpeed"

IsSelectingSpeed=True;

NormalSpeed"

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;

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

直显示等待

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

IsSelectingSpeed=False;

LowSpeed"

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

Low,并跳出

SelectedSpeed=Low;

//这里没有速度设置,因为默认

速度就是Low

HighSpeed"

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1