#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; // ???????? }
|