基于51单片机智能小车循迹程序

合集下载

基于51单片机智能小车循迹程序

基于51单片机智能小车循迹程序

#include <reg51.h>#include <stdio.h>#define uint unsigned int#define uchar unsigned char/**********************************/uchar led_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80}; uchar turn_count=0;bit end=0; //圈数跑完标志/*********************************/sbit xg0=P1^0; //左寻轨对管sbit xg1=P1^1; //中间寻轨对管sbit xg2=P1^2; //右寻轨对管sbit xz=P1^3; //感应挡板对管/*********************************/sbit Q_IN1=P2^0; //车前左轮控制sbit Q_IN2=P2^1;sbit Q_IN3=P2^2; //车前右轮控制sbit Q_IN4=P2^3;sbit H_IN1=P2^4; //车尾左轮控制sbit H_IN2=P2^5;sbit H_IN3=P2^6; //车尾右轮控制sbit H_IN4=P2^7;sbit Q_ENA=P3^0; //车前左轮使能,PWMsbit Q_ENB=P3^1; //车前右轮使能,sbit H_ENA=P3^6; //车尾左轮使能,sbit H_ENB=P3^7; //车尾右轮使能,/****************************************/#define stra_q_l 100 //直线行走时,四个轮子占空比调试#define stra_q_r 100#define stra_h_l 100#define stra_h_r 100#define turn_q_l 100 //转弯时四个轮子的占空比调试#define turn_q_r 100#define turn_h_l 100#define turn_h_r 100#define turnr_time 2900//右转弯时的延时常数#define turnl_time 3000 //左转弯时的延时常数#define dt_time 5800 //原地掉头时延时常数#define over_time 1000 //停止延时#define back_time 2500 //走完环形,回到直道延时转弯#define black_time 1500 //过黑线的时间#define correct_l_time 700 //左矫正时间#define correct_r_time 700 //右矫正时间#define hou_time 200/***************************************/uchar q_duty_l,q_duty_r,h_duty_l,h_duty_r,//车前后左右轮占空比i=0,j=0,k=0,m=0;/**************************************/void delay_cir(uint n){uchar x;while(n--){for(x=0; x<250;x++);};}/***********************************/void delay(uint ct) // 延时函数{uint t;t=ct;while(t--);}/***************************************/ void straight() //直走{q_duty_l=stra_q_l;q_duty_r=stra_q_r;h_duty_l=stra_h_l;h_duty_r=stra_h_r;Q_IN1=1;Q_IN2=0;Q_IN3=1;Q_IN4=0;H_IN1=1;H_IN2=0;H_IN3=1;H_IN4=0;}/***************************************/ void houtui() //后退{q_duty_l=stra_q_l;q_duty_r=stra_q_r;h_duty_l=stra_h_l;h_duty_r=stra_h_r;Q_IN1=0;Q_IN2=1;Q_IN3=0;Q_IN4=1;H_IN1=0;H_IN2=1;H_IN3=0;H_IN4=1;}/***************************************/ void turn_left() //左转{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(turnl_time);}/***********************************/ void turn_right() //右转{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_q_l;h_duty_r=turn_q_r;Q_IN1=1; //左轮正转Q_IN2=0;H_IN1=1;H_IN2=0;Q_IN3=0; //右轮反转Q_IN4=1;H_IN3=0;delay(turnr_time);}/**************************************************/ void turn_round() //原地掉头{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;H_IN2=1;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(dt_time);}/******************************************************/void over() //小车停止{Q_IN1=0;Q_IN2=0;Q_IN3=0;Q_IN4=0;H_IN1=0;H_IN2=0;H_IN3=0;H_IN4=0;}/*****************************************************/ void correct_right() //左偏,向右矫正{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_q_l;h_duty_r=turn_q_r;Q_IN1=1; //左轮正转Q_IN2=0;H_IN1=1;H_IN2=0;Q_IN3=0; //右轮反转Q_IN4=1;H_IN3=0;H_IN4=1;delay(correct_r_time);}void correct_left() //右偏,向左矫正{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;H_IN2=1;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(correct_l_time);}/*************************************/ void xunji(){if(xg1==1){turn_count++;over();delay(over_time);if(turn_count==1){straight();delay(black_time);}elseif(turn_count==2){houtui();delay(hou_time);turn_left();}elseif(turn_count==3) {houtui();delay(hou_time); turn_right();}elseif(turn_count==4) {houtui();delay(hou_time); turn_right();}elseif(turn_count==5) {straight();delay(black_time); }elseif(turn_count==6) {houtui();delay(hou_time); turn_right();}elseif(turn_count==7) {houtui();delay(hou_time); turn_right(); straight();delay(back_time); turn_left();}elseif(turn_count==8) {straight();delay(black_time); }elseif(turn_count==9) {houtui();delay(100);turn_round();}if(turn_count>=9){turn_count=0;cir_count++;circle--;}{end=1;over();delay(500);}}elseif((xg0==0)&&(xg1==0)&&(xg2==0)) {straight();}elseif((xg0==1)&&(xg1==0)&&(xg2==0)) {over();delay(over_time);houtui();delay(hou_time);correct_right();}//左偏,向右矫正elseif((xg0==0)&&(xg1==0)&&(xg2==1)){over();delay(over_time);houtui();delay(hou_time);correct_left();} //右偏,向左矫正}/***********************************************/ void int0(void) interrupt 0 //中断圈数设定{EX0=0;delay_cir(250);circle++;if(circle>8){circle=0;}P0=led_data[circle];EX0=1;}/*************************************/void time1(void) interrupt 3 //T1溢出中断,电机调速{i++;j++;k++;m++;if(i<q_duty_l)Q_ENA=1;else Q_ENA=0;if(i>100){Q_ENA=1;i=0;}if(j<q_duty_r)Q_ENB=1;else Q_ENB=0;if(j>100 ){Q_ENB=1;j=0;}if(k<h_duty_l)H_ENA=1;else H_ENA=0;if(k>100){H_ENA=1;k=0;}if(m<h_duty_r)H_ENB=1;else H_ENB=0;if(m>100){H_ENB=1;m=0;}P0=led_data[circle];TH1=0XFF;TL1=0XF6;}/*************************************/ void main(){P0=led_data[circle];P1=0xFF;P1=0XFF; //P1口做输入P2=0X00; //P2口初始化,小车禁止P3=0XFF;TMOD=0X11;//T0,T1,工作方式1TH1=0XFF; //T1中断一次10USTL1=0XF6;TR1=1;EX0=1;ET1=1;EA=1;while(1){while((xz==1)&&(end!=1)) //无挡板,扫描对管,前进{xunji();};};}。

基于51单片机的无线控制循迹壁障循光小车

基于51单片机的无线控制循迹壁障循光小车

项目总结-----循迹壁障循光小车程序如下所示:系统1(上):#include"reg52.h"#include"intrins.h"#define uchar unsigned char#define uint unsigned intuchar Rem_Code[3];uint TimeCount;sbit Get_Rem=P2^0;sbit AO= P2^4;sbit BO = P2^5;sbit CO = P2^6;sbit DO= P2^7;void delay_ms(int z){int i,j;for(i=z;i>=0;i--)for(j=110;j>=0;j--);}void delay8(uint t){while(--t);}void Delay100us(void){delay8(13); //8-18}void Remote_Process(void){uchar i,j,Count=0;Delay100us();if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0{ //等于0后表示按键释放TimeCount--;}if(Get_Rem==0)//如果有低电平就进入解码{for(Count=0;Count<100;Count++) //判断12毫秒左右的引导码{Delay100us(); //100us*100=10msif(Get_Rem==1) //如果在延时10毫秒期间有高电平出现就是干扰信号退出解码{return;}}while(Get_Rem==0);//等待低电平结束for(j=0;j<3;j++) //8位地址码+ 4位数据码{for(i=0;i<8;i++){Count=0;do{Delay100us();Count++;if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码{ //理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差return;}}while(Get_Rem==1);//计算高平时间并等待结束Count=0;do{Delay100us();Count++;if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码{return;}}while(Get_Rem==0);//计算低电平时间并等待结束Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位if(Count<8) //如果低电平时间小于800毫秒认为该位为1如果不加,则为0{Rem_Code[j]++;}}}ACC=Rem_Code[2];if(ACC==0xc0){AO = 1;BO = 0;CO = 1;DO = 1;delay_ms(10);BO = 1;}if(ACC==0x30){AO = 1;BO = 1;CO = 1;DO = 0;delay_ms(10);DO = 1;}if(ACC==0x0c) {AO = 0;BO = 1;CO = 1;DO = 1;delay_ms(10);AO = 1;}if(ACC==0x03) {AO = 1;BO = 1;CO = 0;DO = 1;delay_ms(8);CO = 1;}if(TimeCount==0)TimeCount=1000;//按键按下标志}}void main(){while(1){Remote_Process();//遥控处理}}1.系统2(下):/************************************************ 按键A:壁障模式按键B:循迹模式按键C:循光模式按键D:停止************************************************/#include"AT89x52.h"//#include"global.h"#include"intrins.h"//#include"51hei.H"#define uchar unsigned char#define uint unsigned int//uchar Rem_Code[3];//uint TimeCount;//sbit Get_Rem=P2^7;//sbit sb = P3^2; //外部中断sbit AO= P2^4; //与上面的单片机连接的端口sbit BO = P2^5; //与上面的单片机连接的端口sbit CO = P2^6; //与上面的单片机连接的端口sbit DO= P2^7; // 与上面的单片机连接的端口sbit hw1 = P1^1; //后外端口sbit hw2 = P1^2;sbit hw3 = P1^0;sbit gm1 = P0^6;sbit gm2 = P0^7;sbit IB1=P1^5; //驱动端口sbit IA1=P1^6;sbit IB2=P1^3;sbit IA2=P1^4;sbit ENA=P2^2;sbit ENB=P2^3;sbit Led_on=P0^0;int n=0;int m=0;int ms_100_you=100; //占空比的时间片int ms_100_zuo=100; // 占空比的时间片//int ms_10 = 12;int ms_houtui_200 = 300; //超声波壁障时后退的时间片int ms_hwled = 1000; //红外的流水灯的时间片int ms_hwbee_50 = 50;sbit bee = P0^5;sbit ECHO = P2^1; //超声波的端口sbit TRIG = P2^0;unsigned int time = 0;unsigned int timer = 0;unsigned char hw_flag;unsigned long S = 0;int ceshi_time=200;int Flag=0;//void Remote_Process();void qian_jin_fast() //快速前进{if (ms_100_zuo<=100 && ms_100_zuo>58) //左轮速度{IA2=0;IB2=1;}else if(ms_100_zuo<=58&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>10) //右轮速度{IA1=1;IB1=0;}else if(ms_100_you<=10 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void qian_jin_slow() //慢速前进{if (ms_100_you<=100 && ms_100_you>65){IA1=1;IB1=0;}else if(ms_100_you<=65 && ms_100_you>0) // 15 {IA2=1;IB2=1;}else if (ms_100_you<=0){ms_100_you=100;}if (ms_100_zuo<=100 && ms_100_zuo>35){IA2=0;IB2=1;}else if(ms_100_zuo<=35 && ms_100_zuo>0) // 15 {IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}}void hou_tui_fast() //快速后退{if (ms_100_zuo<=100 && ms_100_zuo>65) //左轮速度{IA2=1;IB2=0;}else if(ms_100_zuo<=65&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>14) //右轮速度{IA1=0;IB1=1;}else if(ms_100_you<=14 && ms_100_you>0) // 15{IA1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void hou_tui_slow() //慢速后退{if (ms_100_zuo<=100 && ms_100_zuo>75){IA2=1;IB2=0;}else if(ms_100_zuo<=75 && ms_100_zuo>0) // 15 {IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>65){IB1=1;}else if(ms_100_you<=65 && ms_100_you>0) // 15{IA2=1;IB2=1;}else if (ms_100_you<=0){ms_100_you=100;}}void zuo_zhuan() //左转{if (ms_100_zuo<=100 && ms_100_zuo>65) //左轮速度{IA2=1;IB2=0;}else if(ms_100_zuo<=65&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0)ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>8) //右轮速度{IA1=1;IB1=0;}else if(ms_100_you<=8 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void you_zhuan() //右转{if (ms_100_zuo<=100 && ms_100_zuo>56) //左轮速度{IA2=0;IB2=1;else if(ms_100_zuo<=56&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>10) //右轮速度{IA1=0;IB1=1;}else if(ms_100_you<=10 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void stop_zhuan(){IA1=1;IB1=1;IA2=1;IB2=1;}/******************************光敏控制的函数*********************************************/void gm_judge(){if (gm1 == 1 && gm2 == 0) zuo_zhuan();else if(gm1 == 0 && gm2 == 1) you_zhuan();else qian_jin_fast();}/*************************************红外控制函数**********************************************/void hw_judge(){if((hw1==0 && hw2==0) || (hw1!=0 && hw2!=0 && hw3==1)) qian_jin_fast();//前else if(hw1==0 && hw2!=0) you_zhuan(); // 右else if(hw1!=0 && hw2==0) zuo_zhuan(); //做else if(hw1!=0 && hw2!=0 && hw3==0) stop_zhuan(); //停}/************************************超声波计算距离的函数******************************************************/void Conut(void){time = TH0 * 256 + TL0;TH0 = 0;TL0 = 0;S=(time * 1.7) / 100;//算出来是CMif(S<=10&&S>0){P0=0xe0;}else if(S>10&&S<=20){P0=0xf0;}else if(S>20&&S<=30){P0=0xf8;}else if (S>30&&S<=40){P0=0xfc;}else{P0=0xff;}}/********************************超声波信号发送和接收函数**********************************************/void chaoshengbo(){switch(m){case 0:if (ECHO!=0) {TR0=1;m=1;}else if(ECHO==0) {TR0=0;m=0;} break;case 1: {if (ECHO!=0) {m=1;}else if(ECHO==0){TR0=0;m=2;}} break;case 2:{Conut();m=0;} break;}}//void delay8(uint t)//{//while(--t);//}////void Delay100us(void)//{//delay8(13); //8-18//}//////因为他的格式是00表示"0"11表示"1"01表示"F"所以我们要把12位乘以2等于24位刚好是3个字节////第一二个字节是地址码,第三个字节是数据码////发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射////遥控我们全部默认地址码是FFFFFFFF 单片机解码出来就是0x55 0x55////遥控处理函数//void Remote_Process(void)//{// uchar i,j,Count=0;// Delay100us();// if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0// {//等于0后表示按键释放// TimeCount--;// }//// if(Get_Rem==0)//如果有低电平就进入解码// {// for(Count=0;Count<100;Count++)//判断12毫秒左右的引导码// {// Delay100us();//100us*100=10ms// if(Get_Rem==1)//如果在延时10毫秒期间有高电平出现就是干扰信号退出解码// {// return;// }// }// while(Get_Rem==0);//等待低电平结束// for(j=0;j<3;j++)//8位地址码加4位数据码// {// for(i=0;i<8;i++)// {// Count=0;// do// {// Delay100us();// Count++;// if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码// {//理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差// return;// }// }while(Get_Rem==1);//计算高平时间并等待结束// Count=0;// do// {// Delay100us();// Count++;// if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码// {// return;// }// }while(Get_Rem==0);//计算低电平时间并等待结束// Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位// if(Count<8)//如果低电平时间小于800毫秒认为该位为1// {// Rem_Code[j]++;// }// }// }// //huqin// ACC=Rem_Code[2];// if(ACC==0x0c) //a// {// Flag=1;// delay8(5);// }// if(ACC==0xc0) //b// {// Flag=2;// delay8(5);// }// if(ACC==0x03) // c// {// Flag=3;// delay8(5);// }// if(ACC==0x30) //d// {// Flag=4;// delay8(5);// }//// if(TimeCount==0)//为0表示是新的一次按下对其进行处理// {//如过该值大于0表示已经按下不在处理,保证按下一次只做一次处理// // if((Rem_Code[0]==Addr_Code_H)&&(Rem_Code[0]==Addr_Code_L)) // // {//// if(Rem_Code[2]==Key_A)//如果数据与A键的值相等表示A键按下对其处理// // {//试验用A键来控制继电器的开关// // Com_Relay;//继电器取反// // Nokia3310();//显示继电器的状态// // Bz_Out();//蜂鸣器响一声// // }// // }// //P2_2=0;// }// TimeCount=1000;//按键按下标志// }//}// void hw_judge()//{// if((hw1==0&&hw2==0)||(hw1!=0&&hw2!=0&&hw3==1)) hw_flag=1; //前// else if(hw1==0&&hw2!=0) hw_flag=2; // 右// else if(hw1!=0&&hw2==0) hw_flag=3; //左// else if(hw1!=0&&hw2!=0&&hw3==0) hw_flag=4; //停//}////void hw_movement()//{// switch(hw_flag)// {// case 1: qian_jin_fast();break;// case 2: you_zhuan();break;// case 3: zuo_zhuan();break;// case 4: stop_zhuan();break;// }// }/*****************************主函数******************************************/void main(){TMOD=0x11; //设T0为方式1,GATE=1;TH0 = 0;TL0 = 0;TH1 = (65536-1000)/256;TL1 = (65536-1000)%256;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断Led_on = 1;ENA=1;ENB=1;// IT0 = 0;// EX0 = 1;while(1){while (Flag==1){chaoshengbo();}while(Flag==5){qian_jin_fast();}while(Flag==2){hw_judge();bee=1;}while(Flag==3){gm_judge();bee=1;}while(Flag==4){stop_zhuan();bee=1;}while (Flag==0){stop_zhuan();}}}//void zd0() interrupt 0 //{// Remote_Process(); // ms_10 = 12;// sb = 1;//}/**定时器1***/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{int i = 0;TH1 = (65536-1000) / 256;TL1 = (65536-1000) % 256;/****************************端口信号处理*******************************************/if(AO == 0)Flag = 1;else if(BO == 0)Flag = 2;else if(CO == 0)Flag = 3;else if(DO == 0)Flag = 4;//// ms_10--;// if(ms_10<=0)// {// sb = 0;// // ms_10 = 12;// }ms_100_zuo--;ms_100_you--;// if (Flag==4)// {// bee = 1;// ceshi_time--;// if (ceshi_time<=0)// {// Flag=5;// ceshi_time=300;// }// }/*************************红外的流水灯效果*****************************************/if (Flag==2){ms_hwled--;if (ms_hwled<=1000&& ms_hwled>750){P0=0xfc;}else if ( ms_hwled<=750 && ms_hwled>500){P0=0xfa;}else if ( ms_hwled<=500 && ms_hwled>250){P0=0xf6;}else if ( ms_hwled<=250 && ms_hwled>0){P0=0xee;}else if ( ms_hwled<=0)ms_hwled=1000;}}// else if(Flag == 2)// {// bee = 1;// }// else if(Flag==1)// {// if(S<=35 && S>0)// {// ms_houtui--;// if (ms_houtui<=100)// {// hou_tui_fast();// }// else if (ms_houtui<=50)// { n=n%2;// switch (n)// {//// case 0:you_zhuan();bee=0;break; //// case 1:zuo_zhuan();bee=0;break; // case 0:you_zhuan();break;// case 1:zuo_zhuan();break;// }//// }// }// else// qian_jin_fast();// bee=1;// ms_houtui=100;// }/*************************超声波壁障效果********************************************/else if(Flag==1){Led_on = 0;if(S<=30 && S>0){ms_houtui_200--;hou_tui_fast();if(ms_houtui_200<=0){n=n%2;switch (n){case 0:you_zhuan();bee=0;break;case 1:zuo_zhuan();bee=0;break;}// ms_houtui = 100;}}else{ ms_houtui_200=300;qian_jin_fast();bee=1;}timer++;if(timer>= 800){n++;timer=0;TRIG=1; //800MS 启动一次模块i = 0;for(;i<20;i++)_nop_();TRIG=0;}}}。

51单片机循迹小车程序

51单片机循迹小车程序
//函数名称:
//功能:左边边时候检测到黑线测试程序
voidcheck_left()

if(xjmk_l==0)//检测右边得传感器就是否感应到黑线
{
delay_50us(1);//延时,去除机械振动
_nop_();
if(xjmk_l==0)//再次检测
{
delay_50us(1);//延时,去除机械振动
/*功能:寻迹小车
使用芯片:AT89S52 或者STC89C52或AT89S51STC89C51
晶振:12MHZ
编译环境:Keil
作者:MH~ﻩ*/
#include<reg51、h>//引用标准库得头文件
#include <intrins、h>
#defineucharunsignedchar
#defineuintunsigned int
sbitxjmk_r=P3^2;//右边寻迹模块检测口INT0
sbitxjmk_l= P3^3;//左边寻迹模块检测口INT1
void check_righet();//右边时候检测到黑线测试程序
voidcheck_left();//左边时候检测到黑线测试程序
void delay_50us(uint
ucharr_count;//右边传感器检测到得次数计数单元
ucharl_count;
uint time;
//***********************主程序******************************
main()
{
time=50;
dianji_r=0;//上电时右侧电机运行
{
r_count=5;
dianji_r=1;

51单片机有时间显示的循迹小车程序

51单片机有时间显示的循迹小车程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar left,right,i,j,num=0,n=0;//左右占空比PWMuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit in1=P2^1;sbit in2=P2^2;//右轮sbit in3=P2^3;sbit in4=P2^4;//左轮sbit en1=P2^5;sbit en2=P2^6;//两个直流电机控制端sbit sheng=P2^0;sbit wei2=P3^5; //左边第二个sbit wei1=P3^4; //左边第一个数码管sbit in10=P0^0;sbit in20=P0^1;sbit in30=P0^2;sbit in40=P0^3;sbit in50=P0^4;//五个探头横着一字排开间隔不能超过黑线宽度P1^0是最右边的void init();//初始化函数void infrared();//寻迹void straight();//直线void turn_left();//左转void turn_right();//右转void turn_back();//后退void display();//显示函数void delay(uint x);//延时函数void main() //主函数{sheng=0;init();while(1){display();infrared();//寻迹函数}}void init(){P0=0x1f; // 白线是0检测端口P2=0x7f;P3=0xff;P1=0xff;TMOD=0x11;//定时器0方式1TH0=(65536-100)/256;TL0=(65536-100)%256;TH1=(65536-45872)/256;TL1=(65536-45872)%256;EA=1;ET0=1;TR0=1;ET1=1;TR1=1;}void time_0() interrupt 1 {i++;j++;if(i<=right) en1=1;else en1=0;if(i==40) {en1=~en1;i=0;}if(j<=left) en2=1;else en2=0;if(j==40) {en2=~en2;j=0;}TH0=(65535-100)/256;TL0=(65535-100)%256;}void time_1() interrupt 3{TH1=(65536-45872)/256;TL1=(65536-45872)%256;n++;if(n==20) {num++;n=0;}if(num==60) num=0;}//显示函数void display(){ uchar shi,ge;shi=num/10;ge=num%10;P1=table[ge];wei2=0;delay(2);wei2=1;P1=0xff;P1=table[shi];wei1=0;delay(2);wei1=1;}//延时函数void delay(uint x){ uint i,j;for(i=0;i<x;i++)for(j=0;j<110;j++); }//直线void straight() { right=34;left=34;in1=1;//接电机正极in2=0;in3=1;//接电机正极in4=0;}//左转void turn_left(){ right=39;left=9;in1=1;in2=0;in3=1;in4=0;}//右转void turn_right(){ right=9;left=39;in1=1;in2=0;in3=1;in4=0;}//后转void turn_back(){right=30;left=30;in1=0;in2=1;in3=0;in4=1;}//寻迹void infrared(){uchar flag=P0;switch(flag){case 0x0c:case 0x08:case 0x18:case 0x10:turn_left();break;//左转case 0x06:case 0x20:case 0x03:case 0x01:turn_right();break;//右转case 0x04:case 0x1f:straight();break;//直线case 0x00:turn_back(); //后退}}。

51单片机小车循迹避障原理

51单片机小车循迹避障原理

51单片机小车循迹避障原理
51单片机小车循迹避障的原理主要包括以下步骤:
1. 传感器检测:小车通过安装的传感器检测路径和障碍物。

寻迹传感器利用黑色对光线的反射率小这个特点,当检测到黑线时,传感器上的开关指示灯会熄灭,输出的是高电平。

如果没有经过黑线,一直保持低电平。

红外传感器在有障碍物时灯会亮,所以有障碍物代表低电平,没有障碍物高电平。

2. 信息处理:51单片机接收并处理传感器的信号。

根据传感器的信号,单片机判断出小车是否偏离了预定路径,或者前方是否有障碍物。

3. 电机控制:根据信息处理的结果,单片机控制电机转动。

例如,如果检测到小车偏离了预定路径,单片机将发送信号使电机转动,使小车回到正确的路径上。

如果检测到前方有障碍物,单片机将发送信号使电机停止转动,避免小车撞到障碍物。

4. 循环检测:小车在行进过程中不断重复上述步骤,确保能够持续地沿着预定路径行进并避开障碍物。

这就是51单片机小车循迹避障的基本原理。

实际的实现可能会更复杂,可能需要更多的传感器和控制逻辑来确保小车的稳定和安全运行。

51循迹小车程序实验报告

51循迹小车程序实验报告

竭诚为您提供优质文档/双击可除51循迹小车程序实验报告篇一:智能循迹小车实验报告摘要本设计主要有单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。

本次设计采用sTc公司的89c52单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由L298n芯片和两个直流电机构成,组成了智能车的动力系统,电源采用7.2V的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。

关键词智能小车单片机红外光对管sTc89c52L298n1绪论随着科学技术的发展,机器人的设计越来越精细,功能越来越复杂,智能小车作为其的一个分支,也在不断发展。

在近几年的电子设计大赛中,关于小车的智能化功能的实现也多种多样,因此本次我们也打算设计一智能小车,使其能自动识别预制道路,按照设计的道路自行寻迹。

2设计任务与要求采用mcs-51单片机为控制芯片(也可采用其他的芯片),红外对管为识别器件、步进电机为行进部件,设计出一个能够识别以白底为道路色,宽度10mm左右的黑色胶带制作的不规则的封闭曲线为引导轨迹并能沿该轨迹行进的智能寻迹机器小车。

3方案设计与方案选择3.1硬件部分可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。

3.1.1单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。

由于以前自己开发板使用的是ATmeL公司的sTc89c52,所以让然选择这个芯片作为控制核心部件。

sTc89c52是一种低损耗、高性能、cmos八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。

其程序和数据存储是分开的。

3.1.2传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。

阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。

方案二:使用光电传感器来采集路面信息。

基于单片机的智能小车避障循迹系统设计

基于单片机的智能小车避障循迹系统设计

基于单片机的智能小车避障循迹系统设计
随着技术的不断发展,智能小车成为人们生活中不可或缺的一部分。

本文主要介绍一款基于单片机的智能小车避障循迹系统设计。

一、系统的硬件设计
本智能小车的硬件设计包括控制模块、电源模块、驱动模块和传感器模块。

其中,控制模块采用C51单片机,电源模块采
用锂电池,驱动模块通过直流电机实现小车的前进、后退、左右转弯等各项动作,而传感器模块则包括超声波传感器、巡线传感器和红外线传感器。

二、系统的软件设计
本智能小车的软件设计包括控制程序和驱动程序。

控制程序主要实现通过巡线传感器和超声波传感器来检测路面情况,从而确定小车行驶方向和速度,同时通过红外线传感器来检测障碍物,从而进行避障。

驱动程序主要用于实现小车的前进、后退、左右转等动作。

三、系统的操作流程
小车启动时,控制程序首先检测巡线传感器和超声波传感器所处位置,从而确定小车行驶方向和速度。

接着,红外线传感器开始检测障碍物,并且在检测到障碍物时,自动转弯避免碰撞。

当小车行驶过程中检测到黑色线条时,巡线传感器将自动控制
小车前进或后退,从而使小车保持在线条上行驶。

四、系统的优点和应用
基于C51单片机的智能小车避障循迹系统具有高度自动化、低成本、易于维护等优点。

该系统可广泛应用于自动化物流、智能家居、机器人等领域。

总之,随着科技的不断发展,传感器技术和单片机技术等已经得到了广泛的应用和推广。

未来,智能小车必将在各个领域发挥更大的作用,创造更多的价值。

基于51单片机的智能循迹避障小车C源程序

基于51单片机的智能循迹避障小车C源程序

项目名称:智能小车系别:信息工程系专业:11电气工程及其自动化姓名:刘亮、崔占闯、韩康指导教师:王蕾崔占闯联系邮箱:目录摘要: ...............................................................................................3关键词: (3)绪论: (3)一、系统设计 (4)1.一、任务及要求 (4)1.2车体方案认证与选择 (4)二、硬件设计及说明 (5)2.1循迹+避障模块 (5)2.2主控模块 (6)2.3电机驱动模块 (6)2.4机械模块 (7)2.5 电源模块 (7)三、自动循迹避障小车整体设计 (7)四、软件设计及说明 (8)4.1系统软件流程图 (9)4.2系统程序 (9)五、系统测试进程 (12)六、总结 (13)七、附录:系统元器件 (13)摘要本设计要紧有三个模块包括信号检测模块、主控模块、电机驱动模块。

信号检测模块采纳红外光对管,用以对有无障碍与黑线进行检测。

主控电路采纳宏晶公司的8051核心的STC89C52单片机为操纵芯片。

电机驱动模块采纳意法半导体的L298N专用电机驱动芯片,单片操纵与传统分立元件电路相较,使整个系统有专门好的稳固性。

信号检测模块将搜集到的路况信号传入STC89C52单片机,经单片机处置事后对L298N发出指令进行相应的调整。

通过有无光线接收来操纵电动小车的转向,从而实现自动循迹避障的功能。

关键词:智能循迹避障小车,STC89C52单片机,L298N驱动芯片,信号检测模块,循迹避障绪论(一)智能小车的作用和意义自第一台工业机械人诞生以来,机械人的进展已经遍及机械、电子、冶金、交通、宇航、国防等领域。

最近几年来机械人的智能水平不断提高,而且迅速地改变着人们的生活方式。

人们在不断探讨、改造、熟悉自然的进程中,制造能替代人劳动的机械一直是人类的妄图。

随着科学技术的进展,机械人的感系统,关于视觉的各类技术而言图像处置技术已相当发达,而基于图像的明白得技术还很掉队,机械视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。

基于单片机循迹小车的设计

基于单片机循迹小车的设计

基于单片机循迹小车的设计
一、硬件结构设计
(1)外观设计
该循迹小车采用4轮驱动底盘,使小车有较强的稳定性,小车安装有
一个带调光功能的LED头灯,可以缩短小车行驶的距离,以及一个用于采
集道路信息的循迹模块。

四个车轮上安装有电机,以及一个用于驱动小车
的电源,主控器采用的是51单片机。

(2)基础硬件设计
1)电源:采用12V锂电池,通过一个5V调整稳压电路改变输出电压,并调整电流大小以供电源的可靠性;
2)车轮电机:采用马达,可提供足够的动力,能够拉动小车行驶,
同时通过电路来控制马达的速度;
3)主控器:采用51单片机,作为小车的主控单元,可实现小车的运
动控制、数据采集等功能;
4)循迹模块:采用模拟循迹模块,用于采集道路信息,根据采集的
信息以及灰度传感器的反馈信息,调整小车的运动方向;
5)头灯:采用LED头灯,可实现可调光的功能,使得车子在夜晚的
黑暗环境中也能保持安全的运行;
6)电路板:依据小车的硬件结构设计出合理的路径,实现电路图和
实际的车路径的一一匹配,以此实现对小车运行的控制。

二、软件程序设计
(1)程序流程设计。

单片机的智能循迹小车

单片机的智能循迹小车
多次测试:在实际环境中进行多次测试,以验证程序的稳定性和可靠性
调试方法
A
总之,基于 51单片机的 智能循迹小 车是一种简 单实用的智 能控制系统
B
通过合理的 硬件设计和 软件编程, 可以实现小 车的自动循
迹功能
C
在调试过程中, 需要逐步排查 问题,不断优 化程序,以提 高系统的性能
和稳定性
感/谢/聆/听
以及调试方法
1
原理
原理
1Байду номын сангаас
基于51单片机的智能循迹小车通过传感器检测小车与路径之间的距 离,将检测到的信号转换为电平信号,然后通过单片机进行处理
单片机根据接收到的信号控制电机驱动模块,从而控制小车的运动 方向和速度
2
3
通过不断调整小车的运动方向和速度,使得小车能够沿着指定的路 径进行运动
2
硬件组成
51单片机的智能 循迹小车
-
01
原理
02 硬件组成
03 软件设计 04 调试方法
51单片机的智能循迹小车
1
智能循迹小车是一种自动 控制系统,能够沿着指定
的路径进行运动
2
基于51单片机的智能循迹 小车是一种使用51单片机 作为主控制器的智能循迹
小车
3
下面将详细介绍基于51单 片机的智能循迹小车的原 理、硬件组成、软件设计
4
调试方法
调试方法
基于51单片机的智能循迹小车的调试方法主要包括以下几个步骤
硬件调试:检查硬件连接是否正确,确保电源、传感器、电机驱动模块等设备 能够正常工作
软件调试:通过调试器或仿真器对程序进行调试,检查程序是否存在语法错误 或逻辑错误
实际环境测试:将调试好的程序下载到单片机中,然后在实际环境中进行测试 。观察小车的运动情况,如果存在偏差或问题,需要对程序进行调整和优化

基于51单片机控制的自动循迹小车技术指标要求

基于51单片机控制的自动循迹小车技术指标要求

基于51单片机控制的自动循迹小车技术指标要求1.引言1.1 概述概述部分:在现代科技的发展中,自动化技术逐渐成为人们生活和工作中不可或缺的一部分。

自动循迹小车作为自动化技术的一种重要应用,广泛应用于工业生产、仓储物流、无人驾驶和教育领域等各个领域。

本文将以基于51单片机的自动循迹小车为研究对象,探讨其技术指标要求及实现原理。

通过对循迹传感器原理和控制算法原理的介绍,将带领读者深入了解自动循迹小车的核心技术。

在循迹传感器原理方面,本文将介绍如何通过光电传感器进行光线检测,并利用检测结果来实现对小车运动方向的控制。

同时,在控制算法原理方面,本文将详细介绍基于51单片机的控制算法的设计思路和实现方法。

在硬件要求和软件要求部分,本文将分别列举并详细说明自动循迹小车各个功能模块的需求和实现方法。

通过对硬件和软件的需求分析,读者将了解到自动循迹小车技术研究和开发过程中的具体要求和实现方式。

通过本文的阅读,读者将能够全面了解基于51单片机控制的自动循迹小车的技术指标要求及实现原理。

同时,本文还将总结研究结果并展望未来自动循迹小车技术的发展方向,希望能够为相关领域的工程应用和学术研究提供有益的参考和借鉴。

1.2文章结构文章结构本文将详细介绍基于51单片机控制的自动循迹小车技术指标要求。

文章结构如下所述。

引言部分概述了本文的内容和目的。

首先,对自动循迹小车的技术指标要求进行了概述,包括硬件要求和软件要求。

然后,介绍了基于51单片机的控制原理,包括循迹传感器原理和控制算法原理。

正文部分将详细讨论技术指标要求。

首先,对硬件要求进行了分析和说明,包括所需的传感器、电机、微控制器等。

其次,对软件要求进行了介绍,包括编程语言、开发环境和控制算法等。

接下来,详细介绍基于51单片机的控制原理。

首先,解释了循迹传感器原理,包括红外线传感器的工作原理和信号处理方法。

其次,探讨了控制算法原理,包括循迹算法的设计和实现。

结论部分对全文进行总结,并展望了未来可能的研究方向。

基于单片机的调速寻迹小车

基于单片机的调速寻迹小车
电机驱动模块:将PWM信号转 换为适当的电压以驱动电机
光电传感器或红外传感器: 用于检测寻迹路径,并将检 测到的信号传递给51单片机
小车底盘和电机:用于实际 运动和执行PWM调速
基于51单片机的PWM调速寻迹小车
二、PWM调速原 理
PWM调速的原理是基 于调节电压的平均值 。通过改变脉冲宽度 ,我们可以改变电压 的平均值,从而控制 电机的转速。例如, 较宽的脉冲会产生较 高的平均电压,导致 电机以更高的速度旋 转
-
THE END
感谢您的观看
THANK 迹小车
三、软件实现
为了实现PWM调速和寻迹功能,我们需要编写相应的软件代码。以下是一个简化的伪代码 示例
这个示例代码使用了简单的占空比调节来实现PWM调速。在实际应用中,我们可能需要使 用更复杂的算法来优化速度和转向控制。此外,根据实际硬件配置和电机类型,可能还需 要调整PWM模块和电机驱动模块的参数以达到最佳性能
模拟信号的电压值
基于51单片机的PWM调速寻迹小车
一、硬件配置
首先,我们需要为51单片机连接适当的硬件以实现PWM控制和寻迹功能。以下是一个基本 的硬件配置列表
51单片机:作为主控制器,负责处理PWM信号和控制逻辑 PWM驱动模块:用于生成可调脉宽的PWM信号,以控制小车的速度
基于51单片机的PWM调速寻迹小车
xxxxxxxxx
基于51单片机的 PWM调速寻迹小车
xxxxxx:xxx
xxxxxxxxx
-
目录
CONTENTS
1
一、硬件配置
2
二、PWM调速原理
3
三、软件实现
2
基于51单片机的PWM调速寻迹小车
1
在本文中,我们将探讨 如何使用51单片机(MCU) 来控制PWM调速以实现寻

基于51单片机循迹智能小车

基于51单片机循迹智能小车

小车走翘翘板摘要本次设计的简易智能电动车采用简单的人工智能技术,使用AT89C52作为小车的检测和控制核心。

根据题目设定的行进及具体要求,分别采用红外传感器进行寻迹行驶、黑带采集及变速行驶,采用霍尔元件对小车行驶过程中的速度进行测量,并在终点进行行驶路程的测量,采用直流减速电机对小车实行较精确定位,由LCD显示出各项功能知识。

由数码管进行行驶时间显示,由蜂鸣器及LED构成声光提示电路。

最后,小车的运行过程中的各种自动化过程由单片机通过编程实现。

关键词:AT89C52 红外传感器减速电机光电管霍尔元件一、方案比较1.轨迹探测模块设计与比较方案一:用光敏电阻组成光敏探测器。

光敏电阻的阻值可以跟随周围环境光线的变化而变化。

当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。

因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。

将阻值的变化值经过比较器就可以输出高低电平。

但是这种方案受光照影响很大,不能够稳定的工作。

方案二:红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。

单片机就是通过接收到的高低电平为依据来确定黑线的位置和小车的行走路线。

对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。

经测试,此种方法简单可靠。

经反复对比后,采用方案二。

1、控制电机方案比较方案一:利用步进电机的准确定长步进性能方便的实现调速和方向的偏转,且能准确的测量速度、路程以及时间,简化编程和硬件连接的工作量。

但是步进电机在与机械配合的小车改装上难度极大,非短时间所能完成。

该方案实现较困难。

方案二:用玩具小车上自带的双直流电机,只需对后轮电机进行简单改造,加上一个齿轮减速装置即可,两电机分别负责小汽车的驱动和转向的功能,依据外围红外反射传感器所采集到的信息可以补足直流电机定位不准的缺点,同时红外反射传感器的使用还能实现比较准确的寻迹行驶,用较好的控制算法及特色硬件来提高小车的整体性能,可具有很高的性能/价格比。

基于51单片机的智能循迹小车设计

基于51单片机的智能循迹小车设计

基于51单片机的智能循迹小车设计**********************************************参赛学校:******************参赛队号:******************参赛题目:(a题)智能小车掌控参赛学生:*******************指导教师:*******************参赛日期:2021.7.18~2021.7.22第1页共23页智能小车掌控摘要智能做为现代的新发明,就是以后的发展方向,它可以按照预先预设的模式在一个环境里自动的运作,不须要人为的管理,可以应用于科学勘探等用途。

我们通过软件编程同时实现它的前进、绕障、暂停的准确掌控以及遇障次数的表明,并再次找寻至原来的轨道。

第2页共23页一、功能表明1、基本功能:小车能够在设计的线路上完成寻迹功能;2、拓展功能:在循迹线路上设置障碍物,小车遇到障碍物能够自动绕道行驶,完成避障功能;二、方案论证方案一:以at89s51单片机为核心的控制电路,采用模块化的设计方案,运用传感器检测电路,实现小车在行驶中自动寻迹、躲避障碍物的功能。

并将循迹过程中遇障次数等数据传至单片机进行处理,然后由单片机根据所检测数据实现对电动小车的智能化控制。

方案二:使用各类数字电路去共同组成电动小车的控制系统。

使用数字电路对外围观测轨迹信号,避障信号展开处置。

但对输入输出都就是模拟量的小装置,如果使用数字化方案,则必须先用a/d转换器和d/a转换器同时实现数字量与模拟量之间的切换。

这样必然增添低成本、电路繁杂等缺点。

因此,本方案灵活性不低,效率高,有利于电动小车智能化的拓展。

同时,对各路信号处理也比较困难。

比较以上两种方案的优缺点,方案一简洁、灵活、可扩展性好,能达到设计要求,因此本设计采用方案一来实现。

三、各模块设计电路分为电源模块、单片机系统模块、电机驱动板、寻迹模块、避障模块。

智能小车运转基本原理框图见到图1。

基于51单片机控制的循迹小车

基于51单片机控制的循迹小车

毕业设计(论文)课题名称:基于单片机控制的循迹小车指导教师:系别:专业:班级:姓名:摘要本文论述了基于单片机的智能循迹小车的控制过程。

智能循迹是基于自动引导机器人系统,用以实现小车自动识别路线,以及选择正确的路线。

智能循迹小车是一个运用传感器、单片机、电机驱动及自动控制等技术来实现按照预先设定的模式下,不受人为管理时能够自动实现循迹导航的高新科技。

该技术已经应用于无人驾驶机动车,无人工厂,仓库,服务机器人等多种领域。

本设计采用89C52单片机作为小车的控制核心;采用RPR220红外反射式开关传感器作为小车的循迹模块来识别白色路面中央的黑色引导线,采集信号并将信号转换为能被单片机识别的数字信号;采用驱动芯片L298N构成双H桥控制直流电机,其中软件系统采用C程序,本设计的电路结构简单,容易实现,可靠性高目录摘要 (1)目录 (1)第1章绪论 (2)1.1课题背景 (2)1.2课题研究的目的和意义 (3)1.3 本设计的意义 (4)第二章方案论证 (4)2.1 控制器方案论证 (4)2.2 供电单元方案论证 (5)2.3 智能循迹小车电源模块的选择 (5)2.4智能循迹小车电机驱动电路的选择 (5)2.5 检测循迹模块 (5)2.5 显示模块论证 (6)第三章智能循迹小车硬件部分 (6)3.1 系统总体方案 (6)3.2 单片机最小系统 (7)3.3 电源模块 (8)3.4 电机驱动模块 (9)3.5 循迹单元电路 (10)3.6测速模块电路 (13)3.7 显示模块电路 (13)第四章循迹小车项目软件流程图 (14)4.1 总体软件流程图 (14)4.2小车循迹流程图 (15)4.3中断程序流程图 (16)第五章总结 (17)第六章致谢 (18)第七章参考文献 (18)附图设计总体图 (19)封底.................................................................................................................... 错误!未定义书签。

基于51单片机的蓝牙循迹小车

基于51单片机的蓝牙循迹小车

基于51单⽚机的蓝⽛循迹⼩车51单⽚机课程设计做了辆蓝⽛⼩车,下⾯是对课程设计内容的⼀些总结基于51单⽚机的蓝⽛循迹⼩车硬件模块L298N具体如图所⽰:⼯作原理简介:可以直接驱动两路 3-16V 直流电机,并提供了 5V 输出接⼝(输⼊最低只要 6V),可以给 5V 单⽚机电路系统供电。

输⼊电压最好是7v以上,输⼊电压低了会导致⼀系列问题,在后⾯有具体实践总结具体应⽤:可以⽅便的控制直流电机速度和⽅向,也可以控制 2 相步进电机,5 线 4 相步进电机。

管脚应⽤可以参考如图所⽰:①板载5V输出使能:如果跳线帽接上,则5v端⼦可以输出电压,若跳线帽没有街上,则12v输⼊端⼦没有作⽤,只能5v输⼊⼝输⼊(如果不接上直接废了,5v 输⼊基本不能使电机模块正常⼯作)②AB通道使能:端⼦接在上⾯表⽰AB通道⼀直保持⾼电平,处于使能状态,并且电压和5v输⼊端⼝电压相同;若处于没有使能状态,直接影响到输⼊端,让其⽆法⼯作!③单⽚机IO控制输⼊ + 马达AB输出 :顾名思义,四个IO输⼊端⼝和单⽚机四个IO⼝相连,然后通过电机驱动模块(双H桥电路)马达AB输出,以获得更⼤的驱动直流减速电机的能⼒,带动电机转动!B站直接搜L298N电机驱动模块,有视频详情介绍问题以及解决⽅案下⾯是⼀些使⽤L298N驱动电机的⼀些问题以及解决⽅法总结问题:1.直流减速电机不能正常转动,⼀个轮⼦只能单⽅向转动2.使能端⼝帽摘下来后,pwm信号输⼊问题3.供电问题解决:1.起初⽤4节南孚电池供电,⽤万⽤表测电压⼩于4.8v(电池快没啥电了),更换四节电池后⽤万⽤表测得4.9v+,上⾯出现的问题解决了2.输⼊端电压⼩于7v(⽤得四节南孚电池6v不到供电),使能电压和5v输⼊端⼦的电压相同,经测量5v端⼝电压只有3.8v左右,故使能电压就只有3.8v左右了,对PWM输出使能有⼀定影响3.L298N电机驱动中有稳压降压模块,如果供电⾜够⼤(⼤于7v),那么稳压降压模块会发挥作⽤,使得5v输⼊端⼦、使能端⼦、马达电机都能有稳定的5v⾼电平输出。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
////电机驱动模块位定义////
sbit M11=P0^0;//左轮
sbit M12=P0^1;
sbit M23=P0^2;//右轮
sbit M24=P0^3;
sbit ENA=P0^4;//左轮使能PWM输入改变dj1数值控制转速sbit ENB=P0^5;//右轮使能PWM输入改变dj2数值控制转速////占空比变量定义////
unsigned char dj1=0;
unsigned char dj2=0;
uchar t=0;
////红外对管位定义////
sbit HW1=P1^0;//左前方
sbit HW2=P1^1;//右前方
sbit HW3=P1^2;//左后方
sbit HW4=P1^3;//右后方
////小车前进////
void qianjin()
{
M11=1;//左轮
M12=0;//
M23=1;//右轮
M24=0;//
dj1=50;
dj2=50;
}
////向左微调////
void turnleft2()
{
M11=1;
M12=0;
M23=1;
M24=0;
dj1=7;//左轮
dj2=50;//右轮
}
////向右微调////
void turnright2()
{
M11=1;
M12=0;
M23=1;
M24=0;
dj1=50;
dj2=7;
}
////向左大调////
void left()
{
M11=0;
M12=1;
M23=1;
M24=0;
dj1=7;
dj2=80;
}
////向右大调////
void right()
{
M11=1;
M12=0;
M23=0;
M24=1;
dj1=80;
dj2=7;
}
////循迹动作子函数////
void xj()
{
if(HW1==0&&HW2==0&&HW3==0&&HW4==0)//前进逻辑
{
qianjin();
}
if(HW1==1&&HW2==0&&HW3==0&&HW4==0)//左右微调
{
turnleft2();
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==0)
{
turnright2();
}
if(HW1==1&&HW2==0&&HW3==1&&HW4==0)//左右大调
{
left();
}
if(HW1==0&&HW2==1&&HW3==0&&HW4==1)
{
right();
}
}
////初始化////
void init()
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
EA=1;
ET0=1;
TR0=1;
}
////定时器0中断////
void timer0() interrupt 1 using 1
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
t++;
if(t<dj1)ENA=1;
else ENA=0;
if(t<dj2)ENB=1;
else ENB=0;
if(t>=50)
{
t=0;
}
}
void main()
{
init();
P1=0Xff;
while(1)
{
/////////////////循迹模式/////////////////////
xj();
}
}。

相关文档
最新文档