不涉及路口判斷
單片機(jī)源程序如下:
- #include<reg52.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- //占空比標(biāo)志
- u8 ZKB_QZ,ZKB_QY,ZKB_HZ,ZKB_HY,Q_Z,Q_Y,H_Z,H_Y;
- //電機(jī)控制端口 P1
- sbit IN1=P1^0; //前 左 反轉(zhuǎn)
- sbit IN2=P1^1; //前 左 正轉(zhuǎn)
- sbit IN3=P1^2; //前 右 正轉(zhuǎn)
- sbit IN4=P1^3; //前 右 反轉(zhuǎn)
- sbit IN11=P1^4; //后 右 反轉(zhuǎn)
- sbit IN22=P1^5; //后 右 正轉(zhuǎn)
- sbit IN33=P1^6; //后 左 正轉(zhuǎn)
- sbit IN44=P1^7; //后 左 反轉(zhuǎn)
- //紅外傳感器 P3
- sbit hw_left=P3^7;
- sbit hw_mid=P3^6;
- sbit hw_right=P3^5;
- //PWM調(diào)速端口 P0
- sbit PWM_QZ=P0^1; //前 左
- sbit PWM_QY=P0^2; //前 右
- sbit PWM_HZ=P0^3; //后 左
- sbit PWM_HY=P0^4; //后 右
- //延時函數(shù)
- void delay(u16 num)
- {
- u16 x,y;
- for(x=num;x>0;x--)
- for(y=110;y>0;y--)
- {
- ;
- }
- }
- //定時器 初始化函數(shù)
- 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;
- }
- //中斷服務(wù)函數(shù)
- void time_service(void) interrupt 1
- {
- Q_Z++,Q_Y++,H_Z++,H_Y++; //進(jìn)入中斷自加
- //前 右
- if(Q_Y<ZKB_QY) //如果小于設(shè)定值,使能端置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) //如果小于設(shè)定值,使能端置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) //如果小于設(shè)定值,使能端置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) //如果小于設(shè)定值,使能端置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;
- }
- //前進(jìn)
- void go()
- {
- ZKB_QZ=13;
- ZKB_QY=8;
- ZKB_HZ=15;
- ZKB_HY=8;
-
- IN2=1; //前 左 正轉(zhuǎn)
- IN3=1; //前 右 正轉(zhuǎn)
- IN22=0; //后 右 正轉(zhuǎn)
- IN33=0; //后 左 正轉(zhuǎn)
-
- IN1=0; //前 左 反轉(zhuǎn)
- IN4=0; //前 右 反轉(zhuǎn)
- IN11=1; //后 右 反轉(zhuǎn)
- IN44=1; //后 左 反轉(zhuǎn)
- }
- //后退
- void back()
- {
- ZKB_QZ=6;
- ZKB_QY=6;
- ZKB_HZ=6;
- ZKB_HY=6;
-
- IN2=0; //前 左 正轉(zhuǎn)
- IN3=0; //前 右 正轉(zhuǎn)
- IN22=1; //后 右 正轉(zhuǎn)
- IN33=1; //后 左 正轉(zhuǎn)
-
- IN1=1; //前 左 反轉(zhuǎn)
- IN4=1; //前 右 反轉(zhuǎn)
- IN11=0; //后 右 反轉(zhuǎn)
- IN44=0; //后 左 反轉(zhuǎn)
- }
- //右轉(zhuǎn)
- void right()
- {
- do
- {
- ZKB_QZ=15;
- ZKB_QY=35;
- ZKB_HZ=15;
- ZKB_HY=35;
-
- IN2=0; //前 左 反轉(zhuǎn)
- IN3=1; //前 右 反轉(zhuǎn)
- IN22=0; //后 右 反轉(zhuǎn)
- IN33=1; //后 左 反轉(zhuǎn)
-
- IN1=1; //前 左 正轉(zhuǎn)
- IN4=0; //前 右 正轉(zhuǎn)
- IN11=1; //后 右 正轉(zhuǎn)
- IN44=0; //后 左 正轉(zhuǎn)
- }
- while(hw_mid==1);
- }
- //左轉(zhuǎn)
- void left()
- {
- do
- {
- ZKB_QZ=15;
- ZKB_QY=35;
- ZKB_HZ=15;
- ZKB_HY=35;
-
- IN2=1; //前 左 反轉(zhuǎn)
- IN3=0; //前 右 反轉(zhuǎn)
- IN22=1; //后 右 反轉(zhuǎn)
- IN33=0; //后 左 反轉(zhuǎn)
-
- IN1=0; //前 左 正轉(zhuǎn)
- IN4=1; //前 右 正轉(zhuǎn)
- IN11=0; //后 右 正轉(zhuǎn)
- IN44=1; //后 左 正轉(zhuǎn)
- }
- while(hw_mid==1);
- }
- void stop() //停止函數(shù)
- {
- IN2=0; //前 左 正轉(zhuǎn)
- IN3=0; //前 右 正轉(zhuǎn)
- IN22=0; //后 右 正轉(zhuǎn)
- IN33=0; //后 左 正轉(zhuǎn)
-
- IN1=0; //前 左 反轉(zhuǎn)
- IN4=0; //前 右 反轉(zhuǎn)
- IN11=0; //后 右 反轉(zhuǎn)
- IN44=0; //后 左 反轉(zhuǎn)
- }
- void go_rignt()
- {
- ZKB_QZ=5;
- ZKB_QY=5;
- ZKB_HZ=5;
- ZKB_HY=5;
-
- IN2=1; //前 左 反轉(zhuǎn)
- IN3=0; //前 右 反轉(zhuǎn)
- IN22=1; //后 右 反轉(zhuǎn)
- IN33=0; //后 左 反轉(zhuǎn)
-
- IN1=0; //前 左 正轉(zhuǎn)
- IN4=1; //前 右 正轉(zhuǎn)
- IN11=0; //后 右 正轉(zhuǎn)
- IN44=1; //后 左 正轉(zhuǎn)
- }
- void go_left()
- {
- ZKB_QZ=5;
- ZKB_QY=5;
- ZKB_HZ=5;
- ZKB_HY=5;
-
- IN2=0; //前 左 反轉(zhuǎn)
- IN3=1; //前 右 反轉(zhuǎn)
- IN22=0; //后 右 反轉(zhuǎn)
- IN33=1; //后 左 反轉(zhuǎn)
-
- IN1=1; //前 左 正轉(zhuǎn)
- IN4=0; //前 右 正轉(zhuǎn)
- IN11=1; //后 右 正轉(zhuǎn)
- IN44=0; //后 左 正轉(zhuǎn)
- }
- 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() //循跡函數(shù)
- {
- 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,前進(jìn)
- case 2: left(); break; //情況2,左轉(zhuǎn)
- case 3: right(); break; //情況3,右轉(zhuǎn)
- case 4: back(); break; //情況4,后退
- case 5: left(); break; //情況5,左轉(zhuǎn)
- case 6: right(); break; //情況6,右轉(zhuǎn)
- }
- }
- //主函數(shù)
- void main()
- {
- Z_D();
- delay(5);
- while(1)
- {
- X_J();
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
main.zip
(1.73 KB, 下載次數(shù): 17)
2019-3-18 20:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|