//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K的上拉电阻。/*晶振采用12M,产生的PWM的频率约为100Hz*/#includereg51.h#includemath.h#defineucharunsignedchar#defineuintunsignedintsbiten1=P3^4;/*L298的EnableA*/sbiten2=P3^5;/*L298的EnableB*/sbits1=P1^0;/*L298的Input1*/sbits2=P1^1;/*L298的Input2*/sbits3=P1^3;/*L298的Input3*/sbits4=P1^2;/*L298的Input4*/sbitR=P2^0;sbitC=P2^1;sbitL=P2^2;sbitkey=P1^4;uchart=0;/*中断计数器*/ucharm1=0;/*电机1速度值*/ucharm2=0;/*电机2速度值*/uchartmp1,tmp2;/*电机当前速度值*//*电机控制函数index-电机号(1,2);speed-电机速度(0-100)*/voidmotor(ucharindex,charspeed){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;}}}voidBack(void){s1=0;s2=1;s3=1;s4=0;}voidGO(void){s1=1;s2=0;s3=1;s4=0;}voidTL(void){s1=1;s2=0;s3=0;s4=1;}voidTR(void){s1=0;s2=1;s3=1;s4=0;}voidSTOP(void){s1=1;s2=1;s3=1;s4=1;}/*voiddelay(uintj)/*简易延时函数*/{for(j;j0;j--);}*/voiddelay(uintz){uintx,y;for(x=z;x0;x--)for(y=110;y0;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();}}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();}}}}}}voidtimer0()interrupt1/*T0中断服务程序*/{if(t==0)/*1个PWM周期完成后才会接受新数值*/{tmp1=m1;tmp2=m2;}if(ttmp1)en1=1;elseen1=0;/*产生电机1的PWM信号*/if(ttmp2)en2=1;elseen2=0;/*产生电机2的PWM信号*/t++;if(t=100)t=0;/*1个PWM信号由100次中断产生*/}#includeintrins.h#includeAT89X52.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,3mscharTlx[5]={0x48,0x48,0x68,0x48,0xff};charThx0=0xd8;charTlx0=0xf0;charThx1=0xb1;//20mscharTlx1=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键标志bitSpeedSelec