简介:本文介绍了c51做智能小车 的程序代码
/**********飞思卡尔智能汽车程序***/ //资源分配如下 //舵机用定时器0频率为50HZ //直流用定时器1频率为10KHZ //测速用外部中断0周期为50ms #include #defineucharunsigned char #defineuint unsigned int sbit PWM_Steer=P1^0; sbit PWM_IN1=P1^2; sbit PWM_IN2=P1^3; //****舵机控制量************ //====f=24MHz ucharangle=8; /* uchar Low_Angle_L[]={0x6d,0xdc,0x4b,0xba,0x29,0x98,0x07,0x77,0xe6, 0x55,0xc4,0x34,0xa2,0x11,0x80}; uchar High_Angle_L[]={0x6c,0x6c,0x6d,0x6d,0x6e,0x6e,0x6f,0x6f,0x6f,0x70,0x70,0x71,0x71,0x72,0x72}; uchar Low_Angle_H[]={0x50,0xe1,0x72,0x03,0x94,0x25,0xb6,0x47,0xd7,0x68,0xf9,0x8a,0x1b,0xac,0x3d}; uchar High_Angle_H[]={0xf7,0xf6,0xf6,0xf6,0xf5,0xf5,0xf4,0xf4,0xf3,0xf3,0xf2,0xf2,0xf2,0xf1,0xf1}; */ //===f=11.0592 uchar Low_Angle_L[]={0x00,0x33,0x66,0x99,0xcc,0x00,0x33,0x66,0x99,0xcc,0x00,0x33,0x66,0x99,0xcc}; uchar High_Angle_L[]={0xbc,0xbc,0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbd,0xbd,0xbe,0xbe,0xbe,0xbe,0xbe}; uchar Low_Angle_H[]={0x00,0xcc,0x99,0x66,0x33,0x00,0xcc,0x99,0x66,0x33,0x00,0xcc,0x99,0x66,0x33}; uchar High_Angle_H[]={0xfc,0xfb,0xfb,0xfb,0xfb,0xfa,0xfa,0xfa,0xfa,0xfa,0xf9,0xfb,0xf9,0xf9,0xf9}; /* //****直流电机控制量******** uchar code speed_hope[]={52,78,104,130,130,156,182,208,182,156,130,130,104,78,52}; //期望的速度值 uchar PWM_H_D=0x00; uchar PWM_L_D=0xff; //PID运算之后 uchar last_error=0,pre_error=0; uchartimes_stopline=0; ucharstop=0; */ //******子程序************* voidInit(); voidRoute_Detect(); voidStart_Delay(uchar); //******主程序************* void main() { PWM_IN1=1; PWM_IN2=0; Init(); Start_Delay(2); while(1) { Route_Detect(); } } //*********初始化************************ voidInit() { IE=0X8b; TMOD=0X11; TH0=0XF4; TL0=0X48; TH1=0X38; PWM_IN1=1; PWM_IN2=0; TCON=0X53; } //********路径检测***************** void Route_Detect() { uchar led1,led2; led1=P0; led2=P2; if(((led1==0xf3)||(led1==0xfb)||(led1==0xfc)||(led1==0xfe)||(led1==0xfd)||(led1==0xf9))&&(led2==0xff)) angle=0; //-35 else if((led1==0xf7)&&(led2==0xff)) angle=1; //-30 else if((led1==0xe7)&&(led2==0xff)) angle=2; //-25 else if((led1==0xef)&&(led2==0xff)) angle=3; //-20 else if((led1==0xcf)&&(led2==0xff)) angle=4; //-15 else if((led1==0xdf)&&(led2==0xff)) angle=5; //-10 else if((led1==0x9f)&&(led2==0xff)) angle=6; //-5 else if((led1==0xbf)&&(led2==0xff)) angle=7; //0 else if((led1==0x3f)&&(led2==0xff)) angle=8; //5 else if((led1==0x7f)&&(led2==0xff)) angle=9; //10 else if((led1==0x7f)&&(led2==0xfe)) angle=10; //15 else if((led1==0xff)&&(led2==0xfe)) angle=11; //20 else if((led1==0xff)&&(led2==0xfc)) angle=12; //25 else if((led1==0xff)&&(led2==0xfd)) angle=13; //30 else if((led1==0xff)&&((led2==0xf9)||(led2==0xfb)||(led2==0xf3)||(led2==0xf7)||(led2==0xef)||(led2==0xe7))) angle=14; //35 else angle=9; } //********舵机控制***************** voidSteer_Control() interrupt 1 { if(PWM_Steer==1) { TL0=Low_Angle_L[angle]; TH0=High_Angle_L[angle]; PWM_Steer=0; } else { TL0=Low_Angle_H[angle]; TH0=High_Angle_H[angle]; PWM_Steer=1; } } /* //*******速度检测*************** voidSpeed_Test()interrupt 0 { speed_count++; } //********速度运算***************** voidspeed_cal() { if(speed_t>=100) { EX0=0; speed=26*speed_count;//(cm/s) speed_count=0; EX0=1; } } //*********PID运算****************** void PID() { int PID; int error; int derror; int pre_derror; error=speed_hope[angle]-speed; derror=error-last_error; pre_derror=last_error-pre_error; PID=PID_P*derror+PID_I*error+PID_D*(derror-pre_error); PWM_H_D=256-(PWM_H_D+PID); PWM_L_D=256-(PWM_L_D-PID); pre_error=last_error; last_error=error; } //************************* void Motor_Contol() interrupt 3 { speed_t++; if(stop==1) //当停车标志为1时给直流电机制动脉冲 { if(PWM_IN2==0) { TH1=trig_H_TH1; TL1=trig_H_TL1; PWM_IN2=1; PWM_IN1=0; } else { TH1=trig_L_TH1; TL1=trig_L_TL1; PWM_IN2=0; PWM_IN1=0; } if(speed<=0) //当速度减少到0时停车 { TR1=0; PWM_IN1=0; PWM_IN2=0; } } else { if(((angle>=11)||(angle<=3))&&(speed_hope[angle]{ if(PWM_IN2==1) { TL1=speed_d_l; TH1=0xff; PWM_IN1=0; PWM_IN2=0; } else { TL1=speed_d_h; TH1=0xff; PWM_IN1=0; PWM_IN2=1; } } else { if(PWM_IN1==1) { TH1=0XFF; TL1=0x38; PWM_IN1=0; PWM_IN2=0; } else { TH1=0XFF; TL1=0xff; PWM_IN1=1; PWM_IN2=0; } } } } */ //=========== void Start_Delay(uchar k) { int i=4000; //当K为1时定时1S int j=1000; for(;k>=0;k--) for(;i>=0;i--) for(;j>=0;j--) ; }