总结流程:
1.对每个引脚位定义,后面好用
2.宏定义了红外传感器的2个引脚对应的名字
3.宏定义小车的速度speed,方便后期修改
4.对左右电机的pwm分别进行了宏定义
5.宏定义小车左右2个电机的转动方向
6.定义左右电机pwm_value用来调控电机的转速,设置drive_value用来接接收小车的speed
7.设置延时函数方便后期调用,设置小车行驶方式函数(以左转为例实际上就是让drive_value=speed,然后调用相应的宏定义,让左边电机向前或者向后转),注意以左边电机:时间上每个电机由3个引脚共同控制,假设px_1对应前转,px_2对应后转, px_3对应pwm,那么速度加实际上是pwm=1,速度会一直加,而px_1和px_2控制的是准备往前还是往后转。
8.设置电机pwm调节函数,这个函数由定时器0中断函数调用,函数内容是设置对应电机判断pwm_value是否大于dirve_value,如果pwm_value>drive_value就把对应电机的pwm置为0,如果pwm_value
10,设置定时器0中断函数,每次中断pwm_value++;然后调用pwm调节函数,控制小车速度;
#include//位定义 sbit P1_2=P1^2; sbit P1_3=P1^3; sbit P1_4=P1^4; sbit P1_5=P1^5; sbit P1_6=P1^6; sbit P1_7=P1^7; sbit P3_3=P3^3; sbit P3_4=P3^4; sbit P3_7=P3^7; //宏定义 #define uchar unsigned char #define uint unsigned int //左右红外传感器引脚 #define Left_IRSenor_Track P3_4 #define Right_IRSenor_Track P3_3 //速度值和左右电机PWM输入引脚 #define SPEED 10 //速度值0-20 #define Left_Motor_PWM P1_4 #define Right_Motor_PWM P1_5 //左右车轮运动方向 #define Left_Motor_Go {P1_2=0,P1_3=1;} #define Left_Motor_Back {P1_2=1,P1_3=0;} #define Left_Motor_Stop {P1_2=0,P1_3=0;} #define Right_Motor_Go {P1_6=1,P1_7=0;} #define Right_Motor_Back {P1_6=0,P1_7=1;} #define Right_Motor_Stop {P1_6=0,P1_7=0;} //左右电机PWM值调节变量 unsigned char Left_PWM_Value=0; unsigned char Left_Drive_Value=0; unsigned char Right_PWM_Value =0; unsigned char Right_Drive_Value=0; bit Left_moto_stop =1;//注意这里是小写,和上面的Left_Motor_Stop 区分;在这篇代码中用处就是实现if(1)判断 bit Right_moto_stop=1; //毫秒延时 static int len = 0; bit flag = 1; void delay_ms(unsigned int n) { unsigned int i,j; for(i=n; i>0; i--) for(j=114; j>0; j--); } //机器人向前行驶 void GoForward(void) { Left_Drive_Value=SPEED; Right_Drive_Value=SPEED; Left_Motor_Go; Right_Motor_Go; } //机器人向左转 void GoLeft(void) { Left_Drive_Value=SPEED; Right_Drive_Value=SPEED; Right_Motor_Go; Left_Motor_Back; } //机器人向右转 void GoRight(void) { Left_Drive_Value=SPEED; Right_Drive_Value=SPEED; Left_Motor_Go; Right_Motor_Back; } //机器人停止运行 void Stop(void) { Left_Motor_Stop; Right_Motor_Stop; } //调节左电机转速函数 void Left_Motor_PWM_Adjust(void) { if(Left_moto_stop) { if(Left_PWM_Value<=Left_Drive_Value) { Left_Motor_PWM=1; } else { Left_Motor_PWM=0; } if(Left_PWM_Value>=20) Left_PWM_Value=0; } else { Left_Motor_PWM=0; } } //调节右电机转速函数 void Right_Motor_PWM_Adjust(void) { if(Right_moto_stop) { if(Right_PWM_Value<=Right_Drive_Value) { Right_Motor_PWM=1; } else { Right_Motor_PWM=0; } if(Right_PWM_Value>=20) Right_PWM_Value=0; } else { Right_Motor_PWM=0; } } void cont() { delay_ms(1); if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1) flag = !flag; GoForward(); } void cont_number(void) { len++; while(1) { if(!(Left_IRSenor_Track==1&&Right_IRSenor_Track==1)) { flag = !flag; break; } } } //机器人采集红外循迹传感器数据控制电机智能循迹运行 void Track(void) { if(Left_IRSenor_Track==0&&Right_IRSenor_Track==0) { GoForward(); } if(Left_IRSenor_Track==0&&Right_IRSenor_Track==1) { GoRight(); } if(Left_IRSenor_Track==1&&Right_IRSenor_Track==0) { GoLeft(); } if(Left_IRSenor_Track==1&&Right_IRSenor_Track==1) { GoForward(); delay_ms(9); cont();// } } //定时器0初始化 void TIMER0_Init(void) { TMOD=0x01; TH0=0xFC; TL0=0x18; TR0=1; ET0=1; EA=1; } //智能循迹沿黑线前进 void main(void) { unsigned char i=0; P1=0xF0; //关电机 //机器人按键启动 while(1) { if(P3_7!=1) { delay_ms(50); if(P3_7!=1) break; } } delay_ms(50); TIMER0_Init(); while(1) { while(flag == 1) Track(); while(flag == 0) cont_number();//计数 if(len == 9) { while(1){ Stop(); } } delay_ms(1); } } //定时器0中断函数完成PWM对电机速度调节 void TIMER0_IRQHandler(void) interrupt 1 using 2 { TH0=0xFC; TL0=0x18; Left_PWM_Value++; Right_PWM_Value++; Left_Motor_PWM_Adjust(); Right_Motor_PWM_Adjust(); }



