1、 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;void TL(void)s3=0;s4=1;void TR(void)void STOP(void)/*void delay(uint j) /* 简易延时函数 */ for(j;j0;j-); */void delay(uint z) uint x,y; for(x=z;xx-) for(y=110;yy-);void
2、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+;elseGO(); EA=0; if(L|C|R)=0)
3、STOP(); if(L&R) GO(); if(L=0) while(C) TL(); if(R=0) TR(); void timer0() interrupt 1 /* T0中断服务程序 */ if(t=0) /* 1个PWM周期完成后才会接受新数值 */ tmp1=m1;tmp2=m2;if(t=100) t=0; /* 1个PWM信号由100次中断产生 */ intrins.hAT89X52.h/* 宏定义区*/*- LCD模块-*/#defineLCD_RW P2_6 /读写控制端#defineLCD_RS P2_7 /数据命令选择端#defineLCD_E P2_5 /执行使能端
4、#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 /关显示#defineLC
5、D_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代表直线模式#defineCu
6、rve 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); /写数据voidExecu
7、teCmd(void); /执行命令voidSetXY(charx,chary); /定位显示地址voidDisplaySingleChar(charx,chary,charcchar); /显示单个字符voidDisplayString(charx,chary,char*str); /显示一段字符串voidDelay(unsignedinttime); /延时主程序voidDelayUs(unsignedinttime); /延时子程序bit IsBusy(void); /判断忙标志函数voidDisplayTime(void); /显示时间voidDisplayAVGSpeed(void)
8、; /显示平均速度voidDisplayDistance(void); /显示路程voidINTInit(void); /所有中断初始化voidSpeedINT(void); /测速中断voidComputeTime(void);voidComputeSpeedANDDistance(void); /计算速度和距离voidCtrSpeedINT(void); /控速中断voidTime0INT(void);voidTime1INT(void); /控速单位时间中断voidClock0_Init(void); /时钟中断初始化voidClock1_Init(void);voidCtrSpeed(
9、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 Thx5=0xf4,0xf4,0xc5,0xf4,0xff; /3ms,3ms,15ms,3mschar Tlx5=0x48,0x48,0x68,0x48,0xff;char Thx0=0xd8;cha
10、r Tlx0=0xf0;char Thx1=0xb1; /20mschar 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 HighS
11、peedAreaPassTime=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 SelectedMo
12、de=10; /模式选择是否完毕标志bit Next; /Next键标志bit SpeedSelected; /已经被选中的速度方案标志char SelectedSpeed; /速度选择是否完毕标志bit ChoosingDisplay; /人工选择菜单开始标志bit SelectedShow; /显示选择标志bit SelectedReturn; /返回选择标志bit Selected; /确定/返回键选择标志bit ReturnSelection; /返回键启用标志bit AVGSpeedShow; /平均速度显示标志bit TotalDistanceShow; /总路程显示标志bit R
13、eturnMain; /返回主菜单标志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; /时间的倍数* 全局
14、函数实现区 */*- 主函数-*/voidmain()P01=0;P02=0;P03=0;P04=0;P31=1; /单片机复位,背光开Delay(40); /延时等待LCD启动LCDInit(); /初始化LCDDisplayString(0x0,0, Starting. );DisplayString(0x0,1,DesignedBy202Delay(300);WriteCmd(LCD_CLS); /开总中断EX0=1; /开INT0中断IT0=1; /INTO边沿触发EX1=1; /开INT1中断IT1=1; /INT1边沿触发SelectedAll=False; /开始模式和速度选择/
15、*- 模式选择-*/ChooseTheModeyouwant. Delay(50);IsSelectingMode=True; LineMode Next Yes /延时消除抖动while(1) /不断检测中断,直到按确定键或是NEXT键if(Next=True) /如果按Next键则直接跳出break;if(ModeSelected=True) /如果按确定键则设置模式为Line并跳出SelectedMode=Line; /如果什么键都没有按下,那么一直显示等待if(ModeSelected=True) /按下了确定键,退出模式选择IsSelectingMode=False;if(Next=
16、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
17、kindofSpeedIsSelectingSpeed=True;NormalSpeed if(SpeedSelected=True) /如果按确定键则设置速度为Normal并跳出Thx0=0xec;Tlx0=0x78; /5msThx1=0xf0;Tlx1=0x60; /4msThx2=0x8a;Tlx2=0xd0; /30msThx3=0xf4;Tlx3=0x48; /3msSelectedSpeed=Normal; /如果什么键都没有按下,那么一直显示等待if(SpeedSelected=True) /按下了确定键,退出速度选择IsSelectingSpeed=False; Low Speed if(SpeedSelected=True) /如果按下确定键,则设置速度为Low,并跳出SelectedSpeed=Low; /这里没有速度设置,因为默认速度就是Low High Speed if(SpeedSelected=True) /如果按下确定键,则设置速度为Hig
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1