51单片机源程序,注释详细(4例),资源包括:避障、红外跟随程序、蓝牙控制程序、寻迹程序。非常适合为做智能小车参考资料。 截图: 循迹程序: #include<reg52.h> #define uint unsigned int#define uchar unsigned char uchar zkb_left1,zkb_right1,zkb_left2,zkb_right2,i1,j1,i2,j2; //占空比标志 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 xj_left=P3^5; //循迹端口sbit xj_mid=P3^6;sbit xj_right=P3^7; sbit zkba=P0^0; //占空比控制端sbit zkbb=P0^1;sbit zkbc=P0^2; //占空比控制端sbit zkbd=P0^3; //sbit fm=P2^5; void delay_ms(uint z) //延时函数{ uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--);} void init() //初始化函数{ TMOD=0x01; TH0=(65536-100)/256; TL0=(65536-100)%256 ; EA=1; ET0=1; TR0=1; zkba=1; zkbb=1; zkbc=1; zkbd=1;} void time0() interrupt 1 //中断服务函数{ i1++;j1++;i2++;j2++; //进入中断i,j自加1 if(i1<zkb_right1) {zkbb=1;} //如果i小于设定值,使能端置1,否则置0 else zkbb=0; if(i1==40) {zkbb=~zkbb;i1=0;} //如果i加到40;使能端取反,i置0 if(j1<zkb_left1) {zkba=1;} else zkba=0; if(j1==40) {zkba=~zkba;j1=0;} if(i2<zkb_right2) {zkbd=1;} //如果i小于设定值,使能端置1,否则置0 else zkbd=0; if(i2==40) {zkbd=~zkbd;i2=0;} //如果i加到40;使能端取反,i置0 if(j2<zkb_left2) {zkbc=1;} else zkbc=0; if(j2==40) {zkbc=~zkbc;j2=0;} TH0=(65536-100)/256; //定时器0重装初值 TL0=(65536-100)%256;} void go() //前进函数{ zkb_left1=8; zkb_right1=8; zkb_left2=8; zkb_right2=8; IN1=1; IN2=0; IN3=1; IN4=0; IN5=1; IN6=0; IN7=1; IN8=0;}void back() //后退函数{ zkb_left1=8; zkb_right1=8; zkb_left2=8; zkb_right2=8; IN1=0; IN2=1; IN3=0; IN4=1; IN5=0; IN6=1; IN7=0; IN8=1;}void left() //左转弯函数,{ zkb_left1=14; //设置一个速度 zkb_right1=14; zkb_left2=14; zkb_right2=14; IN1=0; IN2=1; // IN3=1; IN4=0; IN5=0; IN6=1; IN7=1; IN8=0;}void right() //右转弯函数{ zkb_left1=14; //设置一个速度 zkb_right1=14; zkb_left2=14; zkb_right2=14; IN1=1; IN2=0; // IN3=0; IN4=1; IN5=1; IN6=0; // IN7=0; IN8=1;}void stop() //停止函数{ IN1=0; IN2=0; IN3=0; IN4=0; IN5=0; IN6=0; IN7=0; IN8=0; } /*void bee() //蜂鸣器发声函数{ fm=1; delay_ms(50); fm=0; delay_ms(50);}*/ void xunji() //循迹函数{ uchar flag; //定义一个标志位,用于状态判断 if(xj_left==0 & xj_mid==0 & xj_right==0) //未检测到黑线 {flag=0;} else if(xj_left==0 & xj_mid==1 & xj_right==0) //中间寻迹检测到黑线 {flag=1;} else if(xj_left==1 & xj_mid==0 & xj_right==0) //左边检测到黑线 {flag=2;} else if(xj_left==1 & xj_mid==1 & xj_right==0) //左边和中间检测到黑线 {flag=3;} else if(xj_left==0 & xj_mid==0 & xj_right==1) //右边检测到黑线 {flag=4;} else if(xj_left==0 & xj_mid==1 & xj_right==1) //右边和中间检测到黑线 {flag=5;} else if(xj_left==1 & xj_mid==1 & xj_right==1) //全部检测到黑线 {flag=6;} else flag=7; //其他情况标志位置0 switch (flag) { case 0: go(); break; //情况0,前进 case 1: go(); break; //情况1,前进 case 2: left(); break; //情况2,左转 case 3: left(); break; // case 4: right(); break; //情况4,右转 case 5: right();break; // case 6: stop(); break; //情况6,停止 case 7: stop(); break; // default: stop(); break; // }} void main(){ init(); delay_ms(1); while(1) { xunji(); }} 复制代码 U客论坛下载-51单片机源程序,注释详细(4例):避障、红外跟随程序、蓝牙控制程序、.zip 文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-210707-1-1.html