单片机的循迹小车程序
基于51单片机智能小车循迹程序
#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();}}。
基于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();};};}。
单片机小车黑线循迹程序
单片机小车黑线循迹程序一、前言单片机小车是一种常见的电子制作项目,它可以通过编程控制小车的运动,实现多种功能。
其中,黑线循迹程序是单片机小车中常见的一个程序,它可以让小车自动沿着黑线行驶。
本文将详细介绍单片机小车黑线循迹程序的实现方法。
二、硬件准备在编写黑线循迹程序之前,需要先准备好相应的硬件设备。
下面是所需材料:1. 单片机板:可以使用STC89C52、AT89S52等型号。
2. 直流电机:需要两个。
3. 驱动电路:可以使用L298N等型号。
4. 红外传感器模块:需要三个,用于检测黑线位置。
5. 电源:需要12V直流电源。
三、软件准备在硬件准备完成之后,需要将相应的软件安装到计算机上。
下面是所需软件:1. Keil C51编译器:用于编写和调试单片机程序。
2. Proteus仿真软件:用于模拟单片机板和其他硬件设备的工作情况。
四、程序实现1. 程序框架首先,在Keil C51中新建一个工程,并创建一个空白的C文件。
然后,可以按照以下框架编写程序:#include <reg52.h>sbit IN1 = P1^0;sbit IN2 = P1^1;sbit IN3 = P1^2;sbit IN4 = P1^3;void delay(unsigned int i){while(i--);}void main(){while(1){// 循迹程序// 控制电机运动}}2. 循迹程序在程序框架中,需要编写循迹程序,用于检测黑线位置并控制小车的运动。
循迹程序的实现方法如下:// 定义红外传感器引脚sbit LEFT_SENSOR = P2^0;sbit MIDDLE_SENSOR = P2^1;sbit RIGHT_SENSOR = P2^2;void track(){if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 0) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 1) // 左偏{IN1 = 0;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 1 && RIGHT_SENSOR == 0) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 0 && MIDDLE_SENSOR == 1 && RIGHT_SENSOR == 1) // 直行{IN1 = 1;IN2 = 0;IN3 = 1;IN4 = 0;}else if(LEFT_SENSOR == 1 && MIDDLE_SENSOR == 0 && RIGHT_SENSOR == 0) // 右偏{IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 0;}else if(LEFT_SENSOR == 1 && MIDDLE_SENSOR == 0 &&RIGHT_SENSOR == 1) // 右偏{IN1 = 1;IN2 = 0;IN3 = 0;IN4 = 0;}}循迹程序中,通过读取红外传感器的状态来判断黑线位置,并控制电机的运动。
自动循迹小车(附有程序)
大学生电子设计竞赛自动循迹小车目录摘要 (1)1.方案论证 (2)1.1方案描述 (2)1.2单片机方案的比较与论证 (2)1.3编码器选择与论证 (2)1.4 LDC1000与LDC1314选择与论证 (3)1.5 OLED显示方案 (3)1.6蜂鸣器发声方案 (3)2.理论分析与计算 (3)2.1速度增量式PID计算 (3)2.2舵机位置式PID算法 (3)3.电路与程序设计 (4)3.1系统组成 (4)3.2系统流程图 (5)4.测试方案与测试结果 (5)4.1测试方案 (5)4.1.1舵机测试方案 (6)4.1.2电机测试方案 (6)4.2系统测试结果分析 (6)5.结论 (6)6.参考文献 (7)摘要本循迹小车以单片机XS128为控制核心,主要由LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及小车组成。
跑道的标识为一根直径0.6~0.9mm的细铁丝,小车在规定的平面跑道自动按顺时针方向循迹前进。
在任意直线段铁丝上放置4个直径约19mm的镀镍钢芯硬币(第五套人民币的1角硬币),硬币边缘紧贴铁丝。
实验结果表明,在直线区任意指定一起点(终点),小车都能够依据跑道上设置的铁丝标识,能够自动绕跑道跑完一圈,而且时间不超过10分钟,小车运行时始终保持轨迹铁丝位于小车垂直投影之下,小车路过硬币时能够发现并发出声音提示,显示屏上能够实时显示小车行驶的距离和运行时间。
关键词:自动循迹 LDC1314 实时显示自动循迹小车1.方案论证1.1方案描述自动循迹小车依据电磁感应原理,由单片机XS128控制,控制系统是由XS128控制模块、LDC1314感应模块、稳压模块、液晶显示模块、驱动控制模块、蜂鸣器模块、编码器、舵机以及电动小车组成的闭环控制系统。
LDC1314感应模块采集小车在跑道上位置与角度信息,利用XS128单片机处理位置与角度数据后调节舵机打角并通过PID精确算法调整后轮速度。
循迹小车的C语言程序(带注释)
/************ ******** *
第二部分 电机控制子函数 ************* ******** ******* /
void forward1()// { IN1=0; IN2=1; }
电机
1
前进
void forward2()// { IN3=0; IN4=1; }
电机
2
前进
void back1()// { IN1=1; IN2=0; }
当第一、二个 LED 检测到黑线时,小车左转
if(RP1==0&&RP2==0&&RP3==0&&RP4==1) turn(count1,0,coun t2,200); // 0001
当第一、二、三个 LED 检测到黑线时, 小车
左大转
/************ ******** ***
小车右转*******************************/
当最右边的 LED 检测到黑线时,小车左转
if(RP1==1&&RP2==0&&RP3==1&&RP4==1)
turn(count1,80,coun t2,150); // 1011
当第二个 LED 检测到黑线时,小车偏左转
if(RP1==0&&RP2==0&&RP3==1&&RP4==1) turn(count1,0,coun t2,100); // 0011
void time0()interrupt 1 { TH0=(65536-1000)/256;// TL0=(65536-1000)%256; count1++; count2++; if(count1>=500)// count1=0; if(count2>=500)// count2=0; }
四路循迹小车单片机代码
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit p0_0=P0^0;sbit p0_7=P0^7;sbit p1_7=P0^7;sbit EN1=P1^2;//m1脉冲输入sbit EN2=P1^5;//m2脉冲输入//*****************************sbit HW1=P2^0;//加建sbit HW2=P2^1;//减键m1//***************************sbit p2_2=P2^2;sbit p2_3=P2^3; // m2//*********************sbit p1_3=P1^3;sbit p1_4=P1^4;//M2转向组合//******************************sbit p1_1=P1^1;sbit p1_0=P1^0;//M1转向组合//*****M1***********************************************uint t=100;//载波周期uint time0; // 低电平可按键调整量我这里是把周期和低电平设为一个是程序内可调,一个是程序外可调而高电平是死的,也可以反之是一样的uint time1; // 高点平基准量uint timeing0;//立即低电平动态变量uint timeing1; //立即高电平动态变量//*****M2****************//uint t=500;//载波周期uint time_0; // 低电平可按键调整量我这里是把周期和低电平设为一个是程序内可调,一个是程序外可调而高电平是死的,也可以反之是一样的uint time_1; // 高点平基准量uint timeing_0;//立即低电平动态变量uint timeing_1; //立即高电平动态变量//********传感器中间变量定义****************************uchar middate,middate1,middate2;//********************************//void delay(uint z) //延时1ms程序//{//uint x,a,b;//for (x=0;x<z;x++)//{//for(b=120;b>0;b--)//{//for(a=3;a>0;a--);// }// }//// }void stop() //停止函停止HW1=HW2=0;{EA=0;//禁止中断EN1=0;EN2=0;}void goon()//直着走HW1=1=HW2;{EA=1;time0=50;time_0=50;time1=50;time_1=50;}void left()//向左转弯HW1=1;HW2=0; 修改定时数据,实现实时PWM调制{EA=1;//********* time_0=50;time_1=50;// //通过调整左轮的转速来调整转弯力度,这里要配合传感器实时采集才行time0=(time0-1);time1=(t-time0);//***********************timeing0=0;timeing1=0;}void right()//向右转弯HW1=0;HW2=1;{EA=1;//***************time0=50;time1=50;//通过调整右轮的转速来调整转弯力度,这里要配合传感器实时采集才行time_0=(time_0-1);time_1=(t-time_0);//******************timeing_0=0;timeing_1=0;//太关键了!这一步,因为不加的话,当再一次的time0被修改时timeing0,和timeing1不为0//所以才会发生错误,表现为波形时断时续,而且有尖锋脉冲,这都是没有在刷新TIME0的同时刷新tineing的后果//没想到很简单的一点事竟差点酿成PWM做不出来!真是有有教训了//}void InitTimer0(void) //10us 定时器初始化设置函数{TMOD = 0x01;TH0 =0xff;TL0 =0xf7;EA = 1;ET0 = 1;TR0 = 1;}void main(void)//主函数{P2=0x0f;InitTimer0(); //10 us(可变啊,根据不同的精准度和频率要求)//************p1_0=0;p1_1=1;//M2//决策转向p1_3=1;p1_4=0;//M1//************time0=50;//***************************************************************************** *********************************//time1=50; ////time_0=50; ////time_1=50; //通知////L293B的8脚是要接>5V的,16脚要接5V,但是别人的不是这样的,我是看了手册,和失败后这样做的//////这里我用了周期是1000us的但是我的定时器是10us一次的所以我这里取t=100;表示我把周期分成100份////占空比(q)=高电平(time1)/周期(t);故而time1/100=占空比;////电压(u)=占空比*最大电压(Um)故而我的输出电压函数为:U0=Um*q =time1/100*5V(这里我用的是5v电压=Um)// // 根据上述公式可以算出MCU输出电压:例如:我要输出1.5V电压只要让time1=30即可,当然time0=70(保证频率不变) ///我要输出3V只要让time1=60,tim0=40;即可呵呵呵呵// //大概这也就是数模转换的原理吧/////2010年10月24日下午与天津第四项目部宿舍////***************************************************************************** *********************************//while(1) //主循环{//***********************middate=0x00;middate1=0x00;middate2=0x00;middate1=HW1;//传感器信号采集后处理middate2=HW2;CY=0;middate2=(middate2<<1) ;middate=(middate1+middate2) ;// ****************************switch(middate)//转向关键步函数{case 3:{stop();break;}//停止>>>>>>>>>>>>>>HW1=0=HW2;case 1:{left();break;}//左转>>>>>>>>>>>>>>HW1=1;HW2=0;case 2:{right();break;}//右转>>>>>>>>>>>>>>HW1=0;HW2=1;case 0:{goon();break;}//直行>>>>>>>>>>>>>>HW1=1=HW2;}}}void Timer0Interrupt(void) interrupt 1/定时器中断函数生成PWM,接口单元为:time0(PWM1号低电平时间),time1(PWM1号高电平时间),time_0(PWM2号低电平时间),time_1(PWM2号高电平时间),t(周期){//MCU:P1.2是第一路PWM,P1.5是第二路PWMif(time0==timeing0){if(time1!=timeing1){//高电平时间段TH0 =0xff;TL0 =0xf7;EN1=1;timeing1++;}//中断子函数(定时器参量修改)}elseif(time0!=timeing0){TH0 =0xff;EN1=0;//低电平时间段timeing0++;}if(time0==timeing0){if(time1==timeing1){timeing0=0;timeing1=0;}}//****************M2的******************************************************************************* *****************************************************************************if(time_0==timeing_0){if(time_1!=timeing_1){//高电平时间段TH0 =0xff;TL0 =0xf7;EN2=1;timeing_1++;}//中断子函数(定时器参量修改)}elseif(time_0!=timeing_0){TH0 =0xff;TL0 =0xf7;EN2=0;//低电平时间段timeing_0++;}if(time_0==timeing_0){if(time_1==timeing_1){timeing_1=0; }}。
循迹小车程序代码(带解释说明)
int Left_motor_go=6; //左电机前进(IN1)int Left_motor_back=7; //左电机后退(IN2)int Right_motor_go=9; // 右电机前进(IN3)int Right_motor_back=10; // 右电机后退(IN4)const int SensorRight = 3; //右循迹红外传感器(P3.2 OUT1)const int SensorLeft = 4; //左循迹红外传感器(P3.3 OUT2)int SL; //左循迹红外传感器状态int SR; //右循迹红外传感器状态void setup(){//初始化电机驱动IO为输出方式pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM)pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入}//=======================智能小车的基本动作========================= //void run(int time) // 前进void run(){digitalWrite(Right_motor_go,HIGH); // 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,20);//PWM比例0~255调速,左右轮差异略增减analogWrite(Right_motor_back,0);digitalWrite(Left_motor_go,LOW); // 左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);//PWM比例0~255调速,左右轮差异略增减analogWrite(Left_motor_back,127 );//delay(time * 100); //执行时间,可以调整}//void brake(int time) //刹车,停车void brake(){digitalWrite(Right_motor_go,LOW);digitalWrite(Right_motor_back,LOW);digitalWrite(Left_motor_go,LOW);digitalWrite(Left_motor_back,LOW);//delay(time * 100);//执行时间,可以调整}//void left(int time) //左转(左轮不动,右轮前进) void left(){digitalWrite(Right_motor_go,HIGH);// 右电机前进digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_go,1);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,0);//PWM比例0~255调速//delay(time * 100);//执行时间,可以调整}void right(){digitalWrite(Right_motor_go,LOW); //右电机后退digitalWrite(Right_motor_back,LOW);analogWrite(Right_motor_back,0);//PWM比例0~255调速digitalWrite(Left_motor_go,LOW);//左电机前进digitalWrite(Left_motor_back,HIGH);analogWrite(Left_motor_go,0);analogWrite(Left_motor_back,127);//delay(time * 100);//执行时间,可以调整}void back(int time){digitalWrite(Right_motor_go,LOW); //右轮后退digitalWrite(Right_motor_back,HIGH);analogWrite(Right_motor_go,0);analogWrite(Right_motor_back,60);//PWM比例0~255调速digitalWrite(Left_motor_go,HIGH); //左轮后退digitalWrite(Left_motor_back,LOW);analogWrite(Left_motor_go,60);analogWrite(Left_motor_back,0);//PWM比例0~255调速delay(time * 100); //执行时间,可以调整}//==========================================================void loop(){//有信号为LOW 没有信号为HIGH 检测到黑线输出高检测到白色区域输出低SR = digitalRead(SensorRight);//有信号表明在白色区域,车子底板上L1亮;没信号表明压在黑线上,车子底板上L1灭SL = digitalRead(SensorLeft);//有信号表明在白色区域,车子底板上L2亮;没信号表明压在黑线上,车子底板上L2灭if (SL == LOW&&SR==LOW)run(); //调用前进函数else if (SL == HIGH & SR == LOW)// 左循迹红外传感器,检测到信号,车子向右偏离轨道,向左转left();else if (SR == HIGH & SL == LOW) // 右循迹红外传感器,检测到信号,车子向左偏离轨道,向右转right();else // 都是黑色, 停止brake();}。
寻迹避障小车51程序(绝版模块化程序)
M a i n.c #include "common.h"#include "motor.h"#include "timer.h"uchar speed_l;uchar speed_r;sbit out = P3^7;void main(){P1 = 0xff;flag_l = 0;flag_r = 0;sensor_ldata = 0;sensor_rdata = 0;avoid_keyfunc = 0;findline_keyfunc = 0;motor_stop();timerinit();while(1){/*********************************************************循迹功能*********************************************************/while(findline_keyfunc){/**************************************************************** 正常情况下前进****************************************************************/ if(sensor == 0x27){motor_go();speed_l = 50;speed_r = 47;}/****************************************************************如果小车偏左****************************************************************/if((sensor == 0x37) || (sensor == 0x17) || (sensor == 0x0f) || (sensor == 0x1f) || (sensor == 0x3f)){motor_r();speed_l = 45;speed_r--;if(speed_r == 30){speed_r = 31;}}/**************************************************************** 如果小车偏右****************************************************************/if((sensor == 0x67) || (sensor == 0x47) || (sensor == 0x87) || (sensor == 0xc7) ||(sensor == 0xe7)){motor_l();speed_r = 45;speed_l--;if(speed_l == 30){speed_l = 31;}}}/////////////////////////////////////////////////////////////////// /////****************************************************************** * 避障功能******************************************************************* / while(avoid_keyfunc){/*********************************************************** 如果没有检测到有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 1)){motor_go();speed_l = 48;speed_r = 50;}/*********************************************************** 如果检测到右边有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 0)){motor_go();speed_l--;speed_r = 100;if(speed_l == 10){speed_l = 11;}}/****************************************************** 如果左边检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 1)){motor_go();speed_r--;speed_l = 100;if(speed_r == 10){speed_r = 11;}}/****************************************************** 如果都检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 0)){motor_go();speed_r = 100;speed_l = 10;}//////////////////////////////////////}/////////////////////////////////////motor_stop();}}MAIN.H#ifndef MAIN_H#define MAIN_Hextern uchar speed_l;extern uchar speed_r;#endifMotor.c#include "common.h"#include "timer.h"sbit in1 = P2^0;sbit in2 = P2^1; //左电机sbit in3 = P2^2;sbit in4 = P2^3;//右电机sbit ENA = P2^4; //只有当ENA=1时左电机才能转sbit ENB = P2^5; // 只有。
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传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。
阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。
方案二:使用光电传感器来采集路面信息。
基于单片机控制的循迹小车设计设计
摘要本循迹小车采用现在较为流行的8位单片机作为系统大脑,以STC89C52单片机为控制核心。
用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势控制简单、方便、快捷。
40脚的DIP封装使它拥有32个完全IO(GPIO-通用输入输出)端口,通过这些端口加以信号输入电路,将各传感器的信号传至单片机分析处理,从而控制L293D电机驱动,控制小车。
利用红外对管检测黑线,通过循迹模块里的红外对管是否寻到黑线产生的电平信号返回到单片机红外对管来实现循迹功能。
单片机根据程序设计的要求做出相应的判断送给电机驱动模块。
让小车来实现前进,左转,右转,停车等基本功能。
集成红外线传感器即光电开关进行避障。
整个系统的电路结构简单,可靠性能高。
根据小车各部分功能,分析硬件电路,并调试电路。
将调试成功的各个模块逐个地融合成整体,再进行软件编程调试,直至完成。
关键词:循迹小车STC89C52单片机红外对管 L293D电机驱动AbstractThis tracking car adopts the now popular 8-bit single chip microcomputer as the system of the brain, with the STC89C52 single-chip microcomputer as the core. To control the traveling car with it, in order to realize the given performance index. Full analysis of our system, the key is to achieve the automatic control cars, but at this point, single-chip microcomputer control will show its advantage is simple, convenient and fast. 40 feet DIP package makes it has 32 completely IO (GPIO - general input/output port, signal input circuit, through these ports will transmit the signals to single chip microcomputer analysis of each sensor to control L293D motor drive and control the car. The use of infrared for detecting tube black line, through infrared tracking module for tube whether find level signal produced by the black thread returns to the SCM infrared tube to realize tracking function. SCM according to the requirement of the program design make the corresponding judgment for motor driver module. Let the car to achieve forward, turn left, turn right, the basic function such as parking. Integrated infrared sensor photoelectric switch for obstacle avoidance. The circuit of the whole system structure is simple, reliable performance is high. According to the function of car parts, analyze the hardware circuit, and debug the circuit. Debugging success of each module individually merged into a whole, and then software programming and debugging, until completion.KEY WORDS: STC89C52 dc motor infrared sensors the pipe tracing cars L293D motor drive目录第一章绪论 (1)第二章方案设计与论证 (2)第一节主控系统 (2)第二节电机驱动模块 (3)第三节循迹模块 (5)第四节避障模块 (6)第五节机械系统和电源模块 (6)第六节电源模块 (6)第三章硬件设计 (8)第一节总体设计 (8)第二节信号检测模块 (11)第四章软件设计 (13)第一节小车运行主程序流程图 (13)第二节电机驱动程序 (14)第三节循迹模块 (15)第五章制作安装与调试 (18)结论 (19)致谢 (20)参考文献 (21)第一章绪论自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
循迹小车完整程序
程序# include <reg51.h>//********驱动芯片L298管脚位声明*****sbit IN1= P1^0;sbit PWM1= P1^1;sbit IN2= P1^2;sbit IN3= P1^3;sbit PWM2= P1^4;sbit IN4= P1^5;//********传感器TCRT5000管脚位声明****sbit XL= P1^6; //左侧第一个传感器sbit XR= P1^7; //右侧第一个传感器sbit YL= P2^0; //左侧第二个传感器sbit YR= P2^1; //右侧第二个传感器//********用于定时计数的两个全局变量位声明****** int count1=0;int count2=0;//********左边电机前进*******void forward_turn1(){IN1=0;IN2=0;}//*********左边电机后退******void reverse_tuen1(){IN1=1;IN2=0;}//*********右边电机前进*******void forward_turn2(){IN3=0;IN4=1;}//**********右边电机后退********void reverse_turn2(){IN3=1;IN4=0;}//***********左边电机速度控制函数******void speed1(int ct,int sd){if(ct<=sd)PWM1=1;elsePWM1=0;}//************右边电机速度控制函数******viod speed2(int ct,int sd){if (ct<=sd)PWM2=1;elsePWM2=0;//*************小车直线前进函数*********void advance (int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**********小车左转********void left_turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//************小车右转*********viod riht_ turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**************主函数**********main(){TMOD=ox11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;EA=1;ET1=1;TR1=1;while(1){if(XL==0&&XR==0&&YL==0&&YR==0) //传感器未检测到直线,小车直行{advance(count1,500,count2,500);}if(XL==1&&XR==0&&YL==0&&YR==0) //左边内侧传感器检测到黑线,小左转 {Left_turn1(count1,200,count2,500);}if(XL==0&&XR==0&&YL==1&&YR==0) //左边外侧传感器检测到黑线,大左转{Left_turn1(count1,200,count2,700);}if(XL==0&&XR==1&&YL==0&&YR==0) //右边内侧传感器检测到黑线,小右转{right_turn1(count1,500,count2,200);}if(XL==0&&XR==0&&YL==0&&YR=1) //右边外侧传感器检测到黑线,大右转{right_turn1(count1,700,count2,200);}if(XL==1&&XR==0&&YL==1&&YR=0) //左侧两个传感器均检测到黑线,中左转{Left_turn1(count1,200,count2,600);}if(XL==0&&XR==1&&YL==0&&YR=1) //右侧两个传感器均检测到黑线,中右转{right_turn1(count1,600,count2,200);}}}//******中断服务程序*******viod time0() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if (count1>=1000)count1=0}viod time1() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if (count2>=1000)count2=0}。
循迹小车设计(附代码)
if(d5==1&&d6==0&&d7==0)
turn_left2();
}
void init()//初始化函数;
{
TMOD=0X01;
TH0=(65536-100)/256; //设置计时时间长度100us
TL0=(65536-100)%256;
ET0=1;
EA=1;
TR0=1;
基于单片机的智能寻迹小车
一.方案设计与论证
1.1控制模块采用STC89C52单片机
设计中采用了一款十分常用的51系列单片机作为处理器,特点是价格低廉、使用方便,且可与其他处理器进行通讯。
系统时钟:晶振频率1/12,本设计采用12M晶振,因此系统时钟为1us。
I/O口资源:4个通用8位准双向I/O口(P0、P1、P2、P3,其中P3为特殊功能口)。
{
d0=0;
d1=1;
d2=0;
d3=0;
zkb1=30;
zkb2=0;
}
void turn_right2()//2级右转
{
d0=0;
d1=1;
d2=0;
d3=0;
zkb1=50;
zkb2=0;
}
void xunji() /*检测到黑线输出为高电平1,检测到白色为低电平0*/
{
if((d5==1&&d6==1&&d7==1)||(d5==0&&d6==1&&d7==0))
#define uint unsigned int
uchar x3,x4;
uint zkb1,zkb2,t=0;
sbit d0=P1^0; /*d1到d3为控制电机的输出口*/
单片机小车黑线循迹程序
单片机小车黑线循迹程序引言单片机小车是一种通过程序控制的四轮驱动智能小车,在许多应用中具有广泛的用途。
黑线循迹程序是单片机小车的基本功能之一,它通过检测地面上的黑线来自主移动。
本文将详细讨论单片机小车黑线循迹程序的原理、实现方法和注意事项。
原理黑线循迹程序的原理是基于光电传感器的工作原理。
光电传感器是一种能够将光信号转化为电信号的设备。
当光线照射到光电传感器的表面时,光电传感器会生成电信号。
在黑线循迹程序中,光电传感器被安装在单片机小车的底部,用来检测地面上的黑线。
黑线循迹程序的实现基于以下原理:1.当光电传感器检测到黑线时,电信号的强度会发生变化。
2.单片机通过读取光电传感器的电信号,判断车辆是否偏离黑线,并做出相应的动作来保持在黑线上。
实现方法硬件准备在编写黑线循迹程序之前,我们首先需要准备以下硬件:1.单片机开发板:例如Arduino、Raspberry Pi等。
2.电机驱动模块:用于控制小车的轮子转动。
3.电源模块:为小车提供电力。
4.光电传感器模块:用于检测地面上的黑线。
5.电机:驱动小车前进、后退和转向。
接线将光电传感器模块连接到单片机开发板上,确保接线正确。
接线方法可以参考传感器模块的说明书或参考相关文档。
编写程序接下来,我们需要编写黑线循迹程序来控制单片机小车。
1.初始化程序:在程序开始时,需要对相关变量和引脚进行初始化。
2.读取传感器数据:通过读取光电传感器的电信号,获取地面上的黑线信息。
3.判断位置:根据传感器数据判断车辆的位置,判断是否偏离黑线。
4.控制动作:根据车辆位置的判断结果,控制电机驱动模块来让车辆保持在黑线上。
5.循环执行:以上步骤需要不断重复执行,以实时响应地面上的黑线变化。
注意事项在编写和使用黑线循迹程序时,需要注意以下事项:1.传感器校准:在使用光电传感器之前,需要对传感器进行校准,以确保其正常工作。
校准步骤可以参考传感器的说明书或相关文档。
2.环境适应:地面上的黑线可能会受到光照、颜色和宽度等因素的影响。
单片机循迹小车课程设计
循迹小车介绍:AT89C52单片机为循迹小车的检测和控制中心,实习小车的自动检测路径,正确循迹.系统通过I0口控制小车的前进及转向.循迹是小车在黑色地板上沿着白色线行驶,采用光电二极管进行信号采集,若光敏二极管检测到黑线时输出低电平,当有光时产生高电平,信号传送给单片机,来控制小车的转向,从而达到自动循迹的功能.一设计要求:(1)循迹:按预先设定的轨迹自动行驶.(2)完成单片机最小系统的设计.(3)完成外围应用电路的设计和实现.(4)完成软件对硬件的检测和调试.小车行驶路线图:发车区二循迹原理:循迹是小车在黑色地板上演着白线行走,采用光电探测器,系统电路发光二极管发出可见光照射到黑带时,光线被吸收,呈现高阻态,输出为低电平.当照射到白线时,光线被反射回来被光敏二极管检测到,其阻抗会减小,输出高电平.三系统模块方案的确定:1 光电传感器进行循迹2 采用AT89C52单片机作为主控制器3 L293D作为电机驱动芯片4 LED作动态显示四硬件系统的设计1单片机最小系统的设计:2 检测电路的设计:检测电路用红外发光管和高敏光电二极管将光信号转换成电信号.3 LED显示电路的设计:LED显示电路4 电机驱动电路的设计:采用L293D芯片, L293D通过内部逻辑生成使能信号,H桥电路的输入量可以用来设置马达的转向,使能信号可以用于脉宽的调整(pwm)电机驱动电路5 电源模块的设计:LM7805开关电压调节器是降压型电源管理单片机集成电路,能够输出3A的驱动电流同时具有良好的线性和负载调节特性.四软件系统的设计:1 系统程序流程图:图3.1系统程序流程图2 光电检测子程序:图3.2检测子程序流程图 3 驱动电机子程序:4 LED显示子程序:六系统程序清单:ORG 0HENY EQU P1.3ENZ EQU P1.6YQ EQU P1.7ZH EQU P1.5ZQ EQU P1.4YH EQU P1.2SL EQU 30HSH EQU 31HML EQU 32HKEY EQU 33HSED EQU P2.7AJMP MAINORG 03HAJMP INTT0ORG 0BHAJMP TT0ORG 13HAJMP INTT1MAIN:MOV SP,#67H JNB P0.4,DD1 AJMP YAODD1:AJMP DDYAO:MOV KEY,00H MOV P1,00HSETB ENZSETB ENYMOV P0,00HCLR P2.0INT:JB SED,$LCALL DELAYJB SED,INTMOV R5,#05HTT3:DJNZ R5,TT5AJMP EXIT1TT5:MOV DPL,#00HMOV DPH,#00HJNB SED,$TT6:NOPNOPNOPNOPINC DPTRJB SED,TT6MOV A,DPHCLR CSUBB A,KEYCLR CRRC AMOV KEY,AAJMP TT3TT7:MOV A,KEYSETB CRRC AMOV KEY,AAJMP TT3EXIT1: MOV A,KEYSWAP AANL A,#0FHCJNE A,#02H,DD2 SETB ZQLACALL DELAYCLRZQAJMP INTDD4: CJNE A,#04H,INT SETB ZHSETB YHLACALL DELAYCLR ZHCLR YHAJMP INT DELAY:MOV R7,#70LL:MOV R6,#50DJNZ R6,$DJNZ R7,LLRETDD: CLR AMOV SL,AMOV SH,AMOV ML,AMOV P1,#00HMOV TMOD,#01H MOV TL0,#0AFH MOV TH0,#03CH MOV R7,#20SETB ET0SETB EX0CLR EX1SETB IT0SETB IT1SETB EASETB ENZSETB ENYSETB ZQSETB YQSETB TR0PP:LCALL DISAJMP PPINTT0:PUSH ACCPUSH PSWJNB P3.1,LL1 JNB P3.0,LL2 AJMP EXITLL1:CLR ZQKK1:JNB P3.0,HOUJNB P3.0,LL2 AJMP EXITLL2:CLR YQJNB P3.1,HOU KK2:JNB P3.0,KK2SETB YQAJMP EXITHOU:MOV P1,#00HSETB ZHSETB YHCLR EX0SETB EX1AJMP EXIT INTT1:PUSH ACCPUSH PSWJNB P3.4,LL8 JNB P3.5,LL9 AJMP EXITLL8:CLR ZHKK3:JNB P3.4,$SETB ZHAJMP EXITLL9:CLR YHKK4:JNB,P3.5,$SETB YHAJMP EXIT EXIT:POP PSWPOP ACCRETIDEL:MOV R2,#5LL5:MOV R3,#80DJNZ R3,$DJNZ R2,LL5RETDEL1:MOV R4,#10 KK:MOV R5,#100LCALL DELDJNZ R5,$DJNZ R4,KKRETTT0:PUSH ACCPUSH PSWDJNZ R7,EXTMOV R7,#20INC SLMOV A,SLCJNE A,#10,EXT MOV SL,#00HINC SHMOV A,SHCJNE A,#6,EXT MOV SH,#00HINC SHMOV A,SHCJNE A,#6,EXT MOV SH,#00HINC MLMOV A,MLCJNE A,#10,EXT MOV ML,#00H EXT:MOV TL0,#0AFHMOV TH0,#3CHPOP PSWPOP ACCRETIDIS:MOV DPTR,#TABMOV A,SLMOVC A,@A+DPTR MOV P2,ACLR P0.2MOV A,SHMOVC A,@A+DPTR MOV P2,ACLR P0.1LCALL DELSETB P0.1MOV A,MLMOVC A,@A+DPTRMOV P2,ACLR P0.0LCALL DELSETB P0.0RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND五参考文献:1 郭文川.MCS-51单片机原理.接口及应用.电子工业出版社,2012年2 宋文年.自动检测技术.北京:高等教育出版社,2004年3 杨素行.模拟电子技术简明教程.北京:高等教育出版社,2003年4 余孟尝.数字电子技术基础简明教程.北京:高等叫出版社5 211TC中国电子网6 万方数据资源统一服务系统。