不涉及路口判断
单片机源程序如下:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- //占空比标志
- u8 ZKB_QZ,ZKB_QY,ZKB_HZ,ZKB_HY,Q_Z,Q_Y,H_Z,H_Y;
- //电机控制端口 P1
- sbit IN1=P1^0; //前 左 反转
- sbit IN2=P1^1; //前 左 正转
- sbit IN3=P1^2; //前 右 正转
- sbit IN4=P1^3; //前 右 反转
- sbit IN11=P1^4; //后 右 反转
- sbit IN22=P1^5; //后 右 正转
- sbit IN33=P1^6; //后 左 正转
- sbit IN44=P1^7; //后 左 反转
- //红外传感器 P3
- sbit hw_left=P3^7;
- sbit hw_mid=P3^6;
- sbit hw_right=P3^5;
- //PWM调速端口 P0
- sbit PWM_QZ=P0^1; //前 左
- sbit PWM_QY=P0^2; //前 右
- sbit PWM_HZ=P0^3; //后 左
- sbit PWM_HY=P0^4; //后 右
- //延时函数
- void delay(u16 num)
- {
- u16 x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--)
- {
- ;
- }
- }
- //定时器 初始化函数
- void Z_D()
- {
- TMOD=0x01;
- TH0=(65536-100)/256;
- TL0=(65536-100)%256 ;
- EA=1;
- ET0=1;
- TR0=1;
- PWM_QZ=1;
- PWM_QY=1;
- PWM_HZ=1;
- PWM_HY=1;
- }
- //中断服务函数
- void time_service(void) interrupt 1
- {
- Q_Z++,Q_Y++,H_Z++,H_Y++; //进入中断自加
- //前 右
- if(Q_Y<ZKB_QY) //如果小于设定值,使能端置1,否则置0
- {
- PWM_QY=1;
- }
- else {PWM_QY=0;}
- if(Q_Y==40) //如果i加到40;使能端取反,i置0
- {
- PWM_QY=~PWM_QY;
- Q_Y=0;
- }
-
- //前 左
- if(Q_Z<ZKB_QZ) //如果小于设定值,使能端置1,否则置0
- {
- PWM_QZ=1;
- }
- else {PWM_QZ=0;}
- if(Q_Z==40) //如果i加到40;使能端取反,i置0
- {
- PWM_QZ=~PWM_QZ;
- Q_Z=0;
- }
-
- //后 右
- if(H_Y<ZKB_HY) //如果小于设定值,使能端置1,否则置0
- {
- PWM_HY=1;
- }
- else {PWM_HY=0;}
- if(H_Y==40) //如果i加到40;使能端取反,i置0
- {
- PWM_HY=~PWM_HY;
- H_Y=0;
- }
-
- //后 左
- if(H_Z<ZKB_HZ) //如果小于设定值,使能端置1,否则置0
- {
- PWM_HZ=1;
- }
- else {PWM_HZ=0;}
- if(H_Z==40) //如果i加到40;使能端取反,i置0
- {
- PWM_HZ=~PWM_HZ;
- H_Z=0;
- }
- //定时器0重装初值
- TH0=(65536-100)/256;
- TL0=(65536-100)%256;
- }
- //前进
- void go()
- {
- ZKB_QZ=13;
- ZKB_QY=8;
- ZKB_HZ=15;
- ZKB_HY=8;
-
- IN2=1; //前 左 正转
- IN3=1; //前 右 正转
- IN22=0; //后 右 正转
- IN33=0; //后 左 正转
-
- IN1=0; //前 左 反转
- IN4=0; //前 右 反转
- IN11=1; //后 右 反转
- IN44=1; //后 左 反转
- }
- //后退
- void back()
- {
- ZKB_QZ=6;
- ZKB_QY=6;
- ZKB_HZ=6;
- ZKB_HY=6;
-
- IN2=0; //前 左 正转
- IN3=0; //前 右 正转
- IN22=1; //后 右 正转
- IN33=1; //后 左 正转
-
- IN1=1; //前 左 反转
- IN4=1; //前 右 反转
- IN11=0; //后 右 反转
- IN44=0; //后 左 反转
- }
- //右转
- void right()
- {
- do
- {
- ZKB_QZ=15;
- ZKB_QY=35;
- ZKB_HZ=15;
- ZKB_HY=35;
-
- IN2=0; //前 左 反转
- IN3=1; //前 右 反转
- IN22=0; //后 右 反转
- IN33=1; //后 左 反转
-
- IN1=1; //前 左 正转
- IN4=0; //前 右 正转
- IN11=1; //后 右 正转
- IN44=0; //后 左 正转
- }
- while(hw_mid==1);
- }
- //左转
- void left()
- {
- do
- {
- ZKB_QZ=15;
- ZKB_QY=35;
- ZKB_HZ=15;
- ZKB_HY=35;
-
- IN2=1; //前 左 反转
- IN3=0; //前 右 反转
- IN22=1; //后 右 反转
- IN33=0; //后 左 反转
-
- IN1=0; //前 左 正转
- IN4=1; //前 右 正转
- IN11=0; //后 右 正转
- IN44=1; //后 左 正转
- }
- while(hw_mid==1);
- }
- void stop() //停止函数
- {
- IN2=0; //前 左 正转
- IN3=0; //前 右 正转
- IN22=0; //后 右 正转
- IN33=0; //后 左 正转
-
- IN1=0; //前 左 反转
- IN4=0; //前 右 反转
- IN11=0; //后 右 反转
- IN44=0; //后 左 反转
- }
- void go_rignt()
- {
- ZKB_QZ=5;
- ZKB_QY=5;
- ZKB_HZ=5;
- ZKB_HY=5;
-
- IN2=1; //前 左 反转
- IN3=0; //前 右 反转
- IN22=1; //后 右 反转
- IN33=0; //后 左 反转
-
- IN1=0; //前 左 正转
- IN4=1; //前 右 正转
- IN11=0; //后 右 正转
- IN44=1; //后 左 正转
- }
- void go_left()
- {
- ZKB_QZ=5;
- ZKB_QY=5;
- ZKB_HZ=5;
- ZKB_HY=5;
-
- IN2=0; //前 左 反转
- IN3=1; //前 右 反转
- IN22=0; //后 右 反转
- IN33=1; //后 左 反转
-
- IN1=1; //前 左 正转
- IN4=0; //前 右 正转
- IN11=1; //后 右 正转
- IN44=0; //后 左 正转
- }
- void huigui()
- {
- u8 num;
- for(num=2;num>0;num--)
- {
- if(hw_left==0 & hw_mid==1 & hw_right==1)
- {
- go_rignt();
- }
- if(hw_left==1 & hw_mid==1 & hw_right==0)
- {
- go_left();
- }
-
- }
- }
- void X_J() //循迹函数
- {
- u8 P_D; //定义判断
- //未检测到黑线
- if(hw_left==1 & hw_mid==1 & hw_right==1)
- {
- P_D=0;
- }
- //中间检测到黑线
- if(hw_left==1 & hw_mid==0 & hw_right==1)
- {
- P_D=1;
- }
- //左面检测到黑线
- if(hw_left==0 & hw_mid==1 & hw_right==1)
- {
- P_D=2;
- }
- //右面检测到黑线
- if(hw_left==1 & hw_mid==1 & hw_right==0)
- {
- P_D=3;
- }
- //全部都检测到黑线后退
- if(hw_left==0 & hw_mid==0 & hw_right==0)
- {
- P_D=4;
- }
- //中间和左面检测到黑线
- if(hw_left==0 & hw_mid==0 & hw_right==1)
- {
- P_D=5;
- }
- //中间和右面检测到黑线
- if(hw_left==1 & hw_mid==0 & hw_right==0)
- {
- P_D=6;
- }
- switch (P_D)
- {
- case 0: huigui();break; //情况0,停止
- case 1: go(); break; //情况1,前进
- case 2: left(); break; //情况2,左转
- case 3: right(); break; //情况3,右转
- case 4: back(); break; //情况4,后退
- case 5: left(); break; //情况5,左转
- case 6: right(); break; //情况6,右转
- }
- }
- //主函数
- void main()
- {
- Z_D();
- delay(5);
- while(1)
- {
- X_J();
- }
- }
复制代码
所有资料51hei提供下载:
main.zip
(1.73 KB, 下载次数: 17)
|