#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit IN1=P1^0; sbit IN2=P1^1; sbit IN3=P1^2; sbit IN4=P1^3; sbit IN5=P1^4; sbit IN6=P1^5; sbit IN7=P1^6; sbit IN8=P1^7; sbit L_PWM=P3^4; //左轮调速,接驱动模块ENA使能端,在这里输入PWM信号 sbit R_PWM=P3^5; //右轮调速,接驱动模块ENB使能端,在这里输入PWM信号 sbit jd=P0^0; void send_char(); unsigned char txd; uchar buf; #define L_go IN1=1; IN2=0;//左前//左后轮前进 #define L_back IN1=0; IN2=1; //左轮后退 #define L_stop IN1=0; IN2=0; //左轮停止,两个输出1也可以 #define R_go IN3=1;IN4=0; //右后轮前进 #define R_back IN3=0;IN4=1; //右轮后退 #define R_stop IN3=0;IN4=0; //右轮停止,两个输出1也可以 #define leftzhuan IN7=1;IN8=0; #define rightzhuan IN7=0;IN8=1; #define stopzhuan IN7=0;IN8=0; #define shangyang IN5=0;IN6=1; #define xiayang IN5=1;IN6=0; #define stopyang IN5=0;IN6=0; #define car_go L_go;R_go; //小车前进 #define car_back L_back;R_back //小车后退 #define car_left R_go;L_stop //小车左转弯 #define car_right L_go;R_stop //小车右转弯 #define car_stop L_stop;R_stop //小车停车 #define car_left_360 R_go;L_back //小车向左360度转,也可以认为是大转弯 #define car_right_360 L_go;R_back //小车向右360度转,也可以认为是大转弯 unsigned char l_tt=0; //定时器计数用 unsigned char l_Lpwm=0; //左轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速 //右轮PWM占空比值,我们设计10个格,0-9,0为停止,9为全速 void timer0()interrupt 1 using 2 { TH0=0XFC; //定时1毫秒,10格调速,为100HZ频率,此频率下效果比较好,过大有噪声,过小振动大 TL0=0X17; l_tt++; if(l_tt>30)l_tt=0; //比较用,10格调速 if(l_tt<=l_Lpwm){//左调速,占空比数值越大,输出高电平时间越宽,电机转速越高,我们设计10个格,0-9,0为停止,9为全速 L_PWM=1; } else{ L_PWM=0; } } void delayms(unsigned int xms) { unsigned i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void main (void) { SCON=0x50;//????????01010000 PCON=0x00; TMOD=0x20; EA=1; ES=1; TL1=0xfd; TH1=0xfd; TR1=1; jd=0; while (1) { } } void serial() interrupt 4 { ES=0; if(RI==1) { RI=0; buf=SBUF; send_char(); switch (buf) { //以下是字符型 依次是1 2 3 4 5 6 7 8 a b c d e case 0x31: car_go; break; case 0x32: car_back; break; case 0x33: car_stop; break; case 0x34: car_left_360; break; case 0x35: car_right_360; break; case 0x36: l_Lpwm=3;shangyang; break; case 0x37: l_Lpwm=3;stopyang; break ; case 0x38: l_Lpwm=3;xiayang ; break ; case 0x61: leftzhuan ; break ; case 0x62: stopzhuan ;break ; case 0x63: rightzhuan ;break; case 0x64: jd=1;break; case 0x65: jd=0;break; } ES=1; } } void send_char() { SBUF = buf; while(!TI); // ?????? TI = 0; // ???????? }
|