小车循迹 计时 测速综合程序
- 格式:pdf
- 大小:93.22 KB
- 文档页数:4
#include<reg51.h>#define uchar unsigned char#define uint unsigned intunsigned char NUM=0 ;sbit LSEN1=P2^0;sbit LSEN2=P2^1;sbit MSEN1=P2^2;sbit RSEN1=P2^3;sbit RSEN2=P2^4;//**传感器***/sbit IN1=P1^0;sbit IN2=P1^1;sbit IN3=P1^2;sbit IN4=P1^3;sbit ENA=P1^4;sbit ENB=P1^5;void qianjin();void turn_left();void turn_right();//******************直行******************// void qianjin(){IN1=1;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;}//***************左转函数***************// void turn_left(){IN1=0;IN2=0;IN3=1;IN4=0;ENA=1;ENB=1;}//***************右转函数***************// void turn_right(){IN1=1;IN2=0;IN3=0;IN4=0;ENA=1;ENB=1;}//***************循迹函数*****************//void xunji(){uchar flag;if((RSEN1==1)&&(RSEN2==1)&&(MSEN1==0)&&(LSEN1==1)&&(LSEN2==1)) { flag=0; }//*******直行*******//elseif((RSEN2==0)&&(RSEN1==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=1;} //***左偏1,小右转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==1)) { flag=2; } //***右偏1,小左转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==1)) { flag=3; } //***右偏2,大左转***//elseif((RSEN2==1)&&(RSEN1==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=4;} //***左偏2,大右转***//elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==1)) { flag=5; } //***右偏3,中左转***//elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==1)) { flag=6; } //***左偏3,中右转***//elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==0)) { flag=7; }elseif((RSEN1==0)&&(RSEN2==0)&&(LSEN1==1)&&(LSEN2==0)&&(MSEN1==0)) { flag=8; }elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==0)) { flag=9;}elseif((RSEN1==1)&&(RSEN2==0)&&(LSEN1==0)&&(LSEN2==0)&&(MSEN1==0)){ flag=10;}elseif((RSEN1==0)&&(RSEN2==1)&&(LSEN1==1)&&(LSEN2==1)&&(MSEN1==0)) { flag=11;}elseif((RSEN1==1)&&(RSEN2==1)&&(LSEN1==0)&&(LSEN2==1)&&(MSEN1==0)) { flag=12;}switch (flag){ case 0:qianjin();break;case 1:turn_right();break;case 2:turn_left();break;case 3:turn_left();break;case 4:turn_right();break;case 5:turn_left();break;case 6:turn_right();break;case 7:turn_right();break;case 8:turn_right();break;case 9:turn_left();break;case 10:turn_left();break;case 11:qianjin();break;case 12:qianjin();break;default: break; }}//****************主程序****************// void main(){qianjin();while(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;}}循迹程序中,通过读取红外传感器的状态来判断黑线位置,并控制电机的运动。
智能小车程序(共三个)第一个:#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++)P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}第二个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit moto1=P1^5;sbit moto2=P1^6;sbit moto3=P2^0;sbit moto4=P2^1;sbit en1=P1^7;sbit en2=P2^2;//*循迹口七个红外传感器*///////////////sbit left1=P1^0;//*左边传感器*//sbit left2=P1^1;sbit left3=P1^2;sbit mid=P1^3;//*黑线位置*//sbit right1=P1^4;sbit right2=P2^3;sbit right3=P2^4;//*右边传感器*//////////////// sbit hled=P0^0;sbit bled=P0^1;sbit lled=P0^2;sbit rled=P0^3;sbit bizhang=P2^5;uchar pro_head;uchar pro_back;uchar i;uchar j; //前后占空比标志void delay(uint z){uchar i;while(z--){for(i=0;i<121;i++);}}/********初始化定时器,中断************/ void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;TR0=1;en1=1;en2=1;}void time0(void) interrupt 1{i++;j++;if(i<=pro_back){en1=1;}else{en1=0;}if(i==40){en1=~en1;i=0;}if(j<=pro_head){en2=1;}else{en2=0;}if(j==40){en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}void qianjin()//*直行*///////////////////// {pro_back=15;pro_head=5;moto1=0;moto2=0;moto4=0;lled=1;rled=1;bled=1;}void turn_right1()//*右转1函数*//{pro_back=10;pro_head=15;moto1=0;moto2=1;moto3=1;moto4=0;}。
//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K 的上拉电阻。
/*晶振采纳12M, 产生的 PWM 的频次约为100Hz */#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit en1=P3^4; /* L298的 Enable A */sbit en2=P3^5; /* L298的 Enable B */sbit s1=P1^0; /* L298的 Input 1 */sbit s2=P1^1; /* L298的 Input 2 */sbit s3=P1^3; /* L298的 Input 3 */sbit s4=P1^2; /* L298的 Input 4 */sbit R=P2^0;sbit C=P2^1;sbit L=P2^2;sbit key=P1^4;uchar t=0; /*中止计数器 */uchar m1=0; /*电机 1速度值 */uchar m2=0; /*电机 2速度值 */uchar tmp1,tmp2; /*电机目前速度值 *//*电机控制函数index- 电机号 (1,2); speed-电机速度(0-100) */ void motor(uchar index, char speed){if(speed<=100){if(index==1) /*电机1的办理*/{m1=abs(speed); /*取速度的绝对值*/s1=1;s2=0;}if(index==2) /*电机2的办理*/{m2=abs(speed); /*电机2的速度控制*/s3=1;s4=0;}}}void Back(void){s1=0;s2=1;s3=1;s4=0;}void GO(void){s1=1;s2=0;s3=1;s4=0;}void TL(void) {s1=1;s2=0;s3=0;s4=1;}void TR(void){s1=0;s2=1;s3=1;s4=0;}void STOP(void){s1=1;s2=1;s3=1;s4=1;}/*void delay(uint j) /*简略延时函数*/ {for( j;j>0;j--);}*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar i=0,j=0;TMOD=0x02; /*设定T0的工作模式为 2 ,8 位自动重置准时器,每过几个机器周期,计数器加一 */TH0=0x9B; /*装入准时器的初值,计数100 次溢出*/TL0=0x9B; /*装入时间常数*/EA=1; /*开中止*/ET0=1; /*准时器0同意中止*/TR0=1; /*启动准时器0 */while(1){if(key==1){/*电机实质控制演示*/if(i<=100) //正转加快{motor(1,i);motor(2,i);delay(5000);i++;}else{GO();}}else{EA=0;while(1){if((L|C|R)==0)STOP();if(L&R)GO();if(L==0){while(C){TL();}}if(R==0){while(C){TR();}}}}}}void timer0() interrupt 1 /* T0中止服务程序*/{if(t==0) /* 1个PWM周期达成后才会接受新数值*/ { tmp1=m1;tmp2=m2;}if(t<tmp1) en1=1; else en1=0; /*产生电机 1 的 PWM 信号*/ if(t<tmp2) en2=1; else en2=0; /*产生电机 2 的 PWM 信号*/ t++;if(t>=100) t=0; /* 1个PWM信号由100次中止产生*/}#include<intrins.h>#include<AT89X52.h>/********************************************************************************\**宏定义区**\********************************************************************************//*-------------------------------LCD模块 ------------------------------------*/ #defineLCD_RW P2_6 //读写控制端#defineLCD_RS P2_7 //数据命令选择端#defineLCD_E P2_5 //履履行能端#defineLCD_Data P1 //P1口#defineWrite 0x00 //低电平写入#defineRead 0x01 //高电平读出#defineData 0x01 //高电平选择数据#defineCmd 0x00 //低电平选择命令#defineEnable 0x00 //跃变到低电平常履行命令#defineDisable 0x01#defineTrue 0x01#defineFalse 0x00#defineLCD_Init 0x38 //初始化模式#defineLCD_DispCtr 0x0C //开显示及光标设置#defineLCD_CloseCtr 0x08 //关显示#defineLCD_CLS 0x01 //清屏幕#defineLCD_EnterSet 0x06 //显示光标#defineBusy P1_7 //忙信号/*--------------------------测速 / 测距 / 测时模块 -------------------------------*/ #defineCircleLength 0.132 //小车转一轮的长度为.132m/*--------------------------------控速模块 -----------------------------------*/ #defineP03 P0_3 //后电机#defineP04 P0_4 //后电机#defineP01 P0_1 //前电机#defineP02 P0_2 //前电机#defineP31 P0_5 //控制液晶背光#defineP33 P3_3/*------------------------------菜单项选择择模块 ---------------------------------*/#defineLine 0x00 //0代表直线模式#defineCurve 0x01 //1代表 S 型模式#defineNormal 0x00 //0代表正常速度#defineLow 0x01 //1代表低速#defineHigh 0x02 //2代表高速/****************************************************************************** ***\**全局函数申明区**\*********************************************************************************//*-------------------------------LCD模块 -------------------------------------*/ voidLCDInit(void); //LCD初始化voidSetWriteCmd(void); //设置写命令模式voidSetReadCmd(void); //设置读命令模式voidSetWriteData(void); //设置写数据模式voidWriteCmd(charcmd); //写命令voidWriteData(charddata); //写数据voidExecuteCmd(void); //履行命令voidSetXY(charx,chary); //定位显示地点voidDisplaySingleChar(charx,chary,charcchar); //显示单个字符voidDisplayString(charx,chary,char*str); //显示一段字符串voidDelay(unsignedinttime); //延时主程序voidDelayUs(unsignedinttime); //延时子程序bit IsBusy(void); //判断忙标记函数voidDisplayTime(void); //显示时间voidDisplayAVGSpeed(void); //显示均匀速度voidDisplayDistance(void); //显示行程/*--------------------------测速 / 测距 / 测时模块-------------------------------*/ voidINTInit(void); //全部中止初始化voidSpeedINT(void); //测速中止voidComputeTime(void);voidComputeSpeedANDDistance(void); //计算速度和距离/*--------------------------------控速模块-----------------------------------*/ voidCtrSpeedINT(void); //控速中止voidTime0INT(void);voidTime1INT(void); //控速单位时间中止voidClock0_Init(void); //时钟中止初始化voidClock1_Init(void); //时钟中止初始化voidCtrSpeed(void);/********************************************************************************\**全局变量区**\********************************************************************************/float SpeedCount=0; //测速计数脉冲float Speed=0.0;float Distance=0.0;char Time1INTCount=0; //T1中止时间计时float PassTime=0.00; //小车行走的时间short IsT0INT=1;bit IsT1INT; //判断T1能否已经响应中止short IsT0INT2=1;char Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff}; //3ms,3ms,15ms,3ms char Tlx[5]={0x48,0x48,0x68,0x48,0xff};char Thx0=0xd8;char Tlx0=0xf0;char Thx1=0xb1; //20mschar Tlx1=0xe0;short Round=0;short Back=0;short Back0=0;bit Backid;bit Stop=0;char Area0=0;char Area1=0; //地区变量char LowSpeedArea1StartTime;char LowSpeedArea1EndTime;char HighSpeedAreaEndTime;char LowSpeedArea2EndTime;char LowSpeedArea1PassTime=0; //第一个低速区经过时间char HighSpeedAreaPassTime=0; //高速区经过时间char LowSpeedArea2PassTime=0; //第二个低速区经过时间char ReadyToGo=4; //倒计时char flag;bit Roundid=0;char Nocurve=0;char ChangeFlag;char Mode;bit Running;bit SelectedAll; //模式和速度能否选择完成标记bit IsSelectingMode; //模式选择标记bit IsSelectingSpeed; //速度选择标记bit ModeSelected; //已经被选择的模式标记char SelectedMode=10; //模式选择能否完成标记bit Next; //Next键标记bit SpeedSelected; //已经被选中的速度方案标记char SelectedSpeed; //速度选择能否完成标记bit ChoosingDisplay; //人工选择菜单开始标记bit SelectedShow; //显示选择标记bit SelectedReturn; //返回选择标记bit Selected; //确立/返回键选择标记bit ReturnSelection; //返回键启用标记bit AVGSpeedShow; //均匀速度显示标记bit TotalDistanceShow; //总行程显示标记bit ReturnMain; //返回主菜单标记bit AutoDisplay; //自动显示标记bit GoToChoosingDisplay; //人工选择标记bit AutoMode=0;char PassLineID=0;char PassLine=0;float PrepareDistance;float FirstDistance;float SecondDistance;float ThirdDistance;int FirstHigh;int SecondHigh;int ThirdHigh;float Rate=1.25; //5ms时的速度float Count=4; //时间的倍数/********************************************************************************\**全局函数实现区**\********************************************************************************//*--------------------------------主函数------------------------------------*/ voidmain(){P01=0;P02=0;P03=0;P04=0;P31=1; //单片机复位,背光开Delay(40); //延时等候LCD 启动LCDInit(); //初始化LCDDisplayString(0x0,0," Starting... ");DisplayString(0x0,1,"DesignedBy202");Delay(300);WriteCmd(LCD_CLS);EA=1; //开总中止EX0=1; //开INT0中止IT0=1; //INTO边缘触发EX1=1; //开INT1中止IT1=1; //INT1边缘触发SelectedAll=False; //开始模式和速度选择/*------------------------------模式选择---------------------------------*/ DisplayString(0x0,0,"ChooseTheMode");DisplayString(0x0,1,"youwant. ");Delay(50);WriteCmd(LCD_CLS);IsSelectingMode=True;while(1){WriteCmd(LCD_CLS);DisplayString(0x0,0," LineMode ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1) //不停检测中止,直到按确立键或是NEXT 键{if(Next==True) //假如按Next键则直接跳出break;if(ModeSelected==True) //假如按确立键则设置模式为Line 并跳出{SelectedMode=Line;break;} // 假如什么键都没有按下,那么向来显示等候}if(ModeSelected==True) //按下了确立键,退出模式选择{IsSelectingMode=False;break;}if(Next==True) //按下了Next键,显示下一个菜单项{Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0," CurveMode ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1) //不停检测中止,直到按确立键或是Next 键{if(Next==True) //假如再一次按下Next键,则跳出break;if(ModeSelected==True) //假如按下确立键,则设置模式为Curve ,并跳出{SelectedMode=Curve;break;}}}if(ModeSelected==True) //按下了确立键,退出模式选择{IsSelectingMode=False;break;}if(Next==True) //再一次按下了Next 键,则循环模式选择{Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0," AutoMode ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1){if(Next==True)break;if(ModeSelected==True){AutoMode=1;break;}}}if(ModeSelected==True){IsSelectingMode=False;break;}if(Next==True){Next=False;continue;}}Delay(50);WriteCmd(LCD_CLS);/*------------------------------速度选择---------------------------------*/ if(SelectedMode==Line&&AutoMode==0){DisplayString(0x0,0," NowChoosea ");DisplayString(0x0,1," kindofSpeed");Delay(50);WriteCmd(LCD_CLS);IsSelectingSpeed=True;while(1){WriteCmd(LCD_CLS);DisplayString(0x0,0,"NormalSpeed ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1){if(Next==True) //假如按Next键则直接跳出break;if(SpeedSelected==True) //假如按确立键则设置速度为Normal并跳出{Thx[0]=0xec;Tlx[0]=0x78; //5msThx[1]=0xf0;Tlx[1]=0x60; //4msThx[2]=0x8a;Tlx[2]=0xd0; //30msThx[3]=0xf4;Tlx[3]=0x48; //3msSelectedSpeed=Normal;break;} // 假如什么键都没有按下,那么向来显示等候}if(SpeedSelected==True) //按下了确立键,退出速度选择{IsSelectingSpeed=False;break;}if(Next==True){Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0," Low Speed ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1){if(Next==True) //假如再一次按下Next键,则跳出break;if(SpeedSelected==True) //假如按下确立键,则设置速度为Low ,并跳出{SelectedSpeed=Low; //这里没有速度设置,由于默认速度就是Lowbreak;}}}if(SpeedSelected==True) //按下了确立键,退出速度选择{IsSelectingSpeed=False;break;}if(Next==True){Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0," High Speed ");DisplayString(0x0,1,"Next Yes");Delay(300); //延时除去颤动while(1){if(Next==True) //假如再一次按下Next键,则跳出break;if(SpeedSelected==True) //假如按下确立键,则设置速度为High ,并跳出{Thx[0]=0xe0;Tlx[0]=0xc0;//8msThx[1]=0xe0;Tlx[1]=0xc0; //8msThx[2]=0x63;Tlx[2]=0xc0; //40msThx[3]=0xec;Tlx[3]=0x78; //5msSelectedSpeed=High;break;}}}if(SpeedSelected==True) //按下了确立键,退出速度选择{IsSelectingSpeed=False;break;}if(Next==True) //再一次按下了Next 键,则循环速度选择{Next=False;continue;}}}SelectedAll=True; //标记模式选择和速度选择完成Running=True;Delay(50);WriteCmd(LCD_CLS);/*-------------------------显示所选择的模式和速度方案-------------------------*/ if(SelectedMode==Line){DisplayString(0x0,0,"ChoosenModeis");DisplayString(0x0,1," Line ");Delay(50);WriteCmd(LCD_CLS);}if(SelectedMode==Curve){DisplayString(0x0,0,"ChoosenModeis");DisplayString(0x0,1," Curve ");Delay(50);WriteCmd(LCD_CLS);}if(AutoMode==1){DisplayString(0x0,0,"ChoosenModeis"); DisplayString(0x0,1," AutoMode "); Delay(50);WriteCmd(LCD_CLS);}if(SelectedMode==Line){if(SelectedSpeed==Normal){DisplayString(0x0,0,"ChoosenSpeedis"); DisplayString(0x0,1," Normal ");Delay(50);WriteCmd(LCD_CLS);}if(SelectedSpeed==Low){DisplayString(0x0,0,"ChoosenSpeedis"); DisplayString(0x0,1," Low ");Delay(50);WriteCmd(LCD_CLS);}if(SelectedSpeed==High){DisplayString(0x0,0,"ChoosenSpeedis"); DisplayString(0x0,1," High ");Delay(50);WriteCmd(LCD_CLS);}}INTInit(); //初始化全部中止DisplayString(0x0,0,"LeftTimesToGo");while(ReadyToGo--){DisplaySingleChar(0x7,1,ReadyToGo+0x30); DisplaySingleChar(0x09,1,'s');Delay(300);}WriteCmd(LCD_CLS);DisplayString(0x05,0,"Go!!!");Delay(100);WriteCmd(LCD_CLS);DisplayString(0x0,0," Living... ");DisplayString(0x0,1,"Designedby202"); if(SelectedMode==Line&&AutoMode==0) flag=Area0;elseflag=1;while(flag<5){if(AutoMode==1) //自动模式{switch(PassLineID){case0 :{if(IsT0INT==1){P01=P02=P04=0;P03=1;}else{P01=P02=P03=P04=0;}}break;case1 :{P01=P02=P03=0;P04=1;}break;case2 :{P01=P02=P04=0;P03=1;}break;default:break;}}else{if(SelectedMode==Line) //直线模式{flag=Area0;if(IsT0INT==1){P03=1;P04=0;P01=P02=0;}else{P03=0;P04=0;P01=P02=0;}}else{ //S型模式if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0) {if(Backid==1){P01=1;P02=0;P03=0;P04=1;}else{P01=0;P02=1;P03=0;P04=1;}Back=1;}else{if(Round==0){if(IsT0INT2==1){P01=0;P02=0;P03=1;P04=0;} else{P01=0;P02=0;P03=0;P04=0;} }else{if(P33==0){if(IsT0INT2==1){P01=0;P02=0;P03=1;P04=0;} else{P01=0;P02=0;P03=0;P04=0;} }else{EX1=1;if(Round%2){if(IsT0INT2==1){P01=1;P02=0;P03=1;P04=0;Backid=1;} else{P01=1;P02=0;P03=0;P04=0;}}else{if(IsT0INT2==1){P01=0;P02=1;P03=1;P04=0;Backid=0;} else{P01=0;P02=1;P03=0;P04=0;}}}}}}}if(IsT1INT==1){IsT1INT=0;ComputeTime();ComputeSpeedANDDistance();}}//补中止行程,加上最后一次中止缺失的行程ComputeSpeedANDDistance();P04=1;P03=0;P01=P02=0;Delay(90);P03=0;P04=0; //行程结束,小车停止P31=1; //行程结束,背光开ET0=0x0; //关 T0中止ET1=0x0; //关 T1中止EX1=0x01; //开 INT1 中止Running=False;AutoDisplay=True; //默认状况下直线模式会自动显示各个地区经过的时间WriteCmd(LCD_CLS);if(SelectedMode==Line) //直线模式才显示{while(1){if(GoToChoosingDisplay==True)break;Delay(200);WriteCmd(LCD_CLS);Delay(200);DisplayString(0,0,"LowSpeedArea1");DisplayString(0,1,"Costed");DisplaySingleChar(0x0C,1,'s');LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime; DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%10+0x30);if(LowSpeedArea1PassTime>9) //经过第一个低速区的时间超过 sDisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);if(GoToChoosingDisplay==True)break;Delay(200); WriteCmd(LCD_CLS); Delay(200);DisplayString(0,0,"HighSpeedArea"); DisplayString(0,1,"Costed"); DisplaySingleChar(0x0C,1,'s');HighSpeedAreaPassTime=HighSpeedAreaEndTime-LowSpeedArea1EndTime; DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);文档大全if(HighSpeedAreaPassTime>9) //经过高速区的时间超出s DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);if(GoToChoosingDisplay==True)break;Delay(200);WriteCmd(LCD_CLS);Delay(200);DisplayString(0,0,"LowSpeedArea2");DisplayString(0,1,"Costed");DisplaySingleChar(0x0C,1,'s');LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime; DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);if(LowSpeedArea2PassTime>9) //经过第二个低速区的时间超过 sDisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);}}AutoDisplay=False;/*----------------菜单项选择择你想要看的内容--总时间、总行程以及均匀速度--------------*/ChoosingDisplay=True;WriteCmd(LCD_CLS);/* 第一显示主菜单,而后显示第一个选项*/DisplayString(0x0,0,"NowChoosewhat");DisplayString(0x0,1,"youwanttosee");Delay(100);while(1){WriteCmd(LCD_CLS);DisplayString(0x0,0," CostedTime ");DisplayString(0x0,1,"Next Show");Delay(250); //延时除去颤动/*------------------------------------第一次按键--------------------------------------*/ /* 不停检测确立键和Next键*/while(1){if(Next==True)break;if(SelectedShow==True)break;}/* 按下了确立键,显示第一个选项的内容*/if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;WriteCmd(LCD_CLS);DisplayString(0,0,"CostedTimeis");DisplayTime();DisplayString(0x0A,1,"s");ReturnSelection=True; //按下了确立键,那么这个时候开启返回键的功能AVGSpeedShow=False;Delay(250); //延时除去颤动}/** 按下了 Next 键,则显示第二个选项*/if(Next==True) //按下Next键,显示AVGSpeed菜单项{Next=False;WriteCmd(LCD_CLS);DisplayString(0x0,0," AVGSpeed ");DisplayString(0x0,1,"Next Show");ReturnMain=False;ReturnSelection=False; //按下了Next键,那么这个时候封闭返回键的功能AVGSpeedShow=True; //表示AVGSpeed选项已经显示过了Delay(250); //延时除去颤动}/*------------------------------------第二次按键--------------------------------------*/ /* 显示第一个选项的内容后又不停检测返回键(确立键)和Next键*/while(1){if(Next==True)break;if(Selected==True)break;}if(Next==True){Next=False;ReturnMain=False;ReturnSelection=False; //按下了Next键,那么这个时候封闭返回键的功能if(AVGSpeedShow==False) //还没有显示AVGSpeed选项,显示它{ // 即第一次选择了确立键WriteCmd(LCD_CLS);DisplayString(0x0,0," AVGSpeed ");DisplayString(0x0,1,"Next Show");TotalDistanceShow=False; //显示了AVGSpeed,则表示TotalDistance还没有显示Delay(250); //延时除去颤动}if(AVGSpeedShow==True) //已经显示过AVGSpeed选项了,则显示下一个选项{ // 即第一次选择了 Next 键WriteCmd(LCD_CLS);DisplayString(0x0,0,"TotalDistance");DisplayString(0x0,1,"Next Show");TotalDistanceShow=True; //表示显示了TotalDistance选项Delay(250); //延时除去颤动}}if(Selected==True) //按下了确立键或返回键{SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //第一次选择了确立键,故此次按下的是返回键ReturnMain=True;if(ReturnSelection==False){WriteCmd(LCD_CLS);DisplayString(0,0,"TheAVGSpeedis");DisplayAVGSpeed();DisplayString(0x0A,1,"m/s");ReturnSelection=True; //按下了确立键,那么这个时候开启返回键的功能Delay(250); //延时除去颤动}TotalDistanceShow=False;}if(ReturnMain==True) //按下了返回键,返回主菜单{ReturnMain=False;continue;}/*------------------------------------第三次按键--------------------------------------*/ /* 假如没有返回主菜单,则持续检测Next 键和确立键 */while(1){if(Next==True)break;if(SelectedShow==True)break;}/* 按下 Next 键,显示下一个选项*/if(Next==True){Next=False;ReturnMain=False;ReturnSelection=False; //按下了Next键,那么这个时候封闭返回键的功能if(TotalDistanceShow==True)ReturnMain=True;if(TotalDistanceShow==False) //还没有显示TotalDistance选项,显示它{WriteCmd(LCD_CLS);DisplayString(0x0,0,"TotalDistance");DisplayString(0x0,1,"Next Show");TotalDistanceShow=True;Delay(250); //延时除去颤动}}if(Selected==True) //按下了确立键或返回键{SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //按下的是返回键ReturnMain=True;if(ReturnSelection==False){if(TotalDistanceShow==False) //表示AVGSpeed选项的内容还没有显示{WriteCmd(LCD_CLS);DisplayString(0,0,"TheAVGSpeedis");DisplayAVGSpeed();DisplayString(0x0A,1,"m/s");ReturnSelection=True;Delay(250); //延时除去颤动}if(TotalDistanceShow==True){WriteCmd(LCD_CLS);DisplayString(0,0,"TotalDistance");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True; //按下了确立键,那么这个时候开启返回键的功能Delay(250); //延时除去颤动}}}if(ReturnMain==True) //按下了返回键,返回主菜单{ReturnMain=False;continue;}/*------------------------------------第四次按键--------------------------------------*/ while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True) //全部菜单项已经显示完成,返回主菜单{Next=False;ReturnMain=False;ReturnSelection=False;if(TotalDistanceShow==False){WriteCmd(LCD_CLS);DisplayString(0x0,0,"TotalDistance"); DisplayString(0x0,1,"Next Show"); TotalDistanceShow=True;Delay(250); //延时除去颤动}}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //按下的是返回键ReturnMain=True;if(ReturnSelection==False){if(TotalDistanceShow==True){WriteCmd(LCD_CLS);DisplayString(0,0,"TotalDistance");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True;//按下了确立键,那么这个时候开启返回键的功能Delay(250); //延时除去颤动}}}if(ReturnMain==True) //按下了返回键,返回主菜单{ReturnMain=False;continue;}/*------------------------------------第五次按键--------------------------------------*/ while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True) //全部菜单项已经显示完成,返回主菜单{Next=False;ReturnMain=False;ReturnSelection=False;if(TotalDistanceShow==True) //最后一个选项已经显示完成,返回主菜单{ReturnMain=True;}}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;if(ReturnSelection==True) //按下的是返回键ReturnMain=True;if(ReturnSelection==False){if(TotalDistanceShow==True){WriteCmd(LCD_CLS);DisplayString(0,0,"TotalDistance");DisplayDistance();DisplayString(0x0A,1,"m");ReturnSelection=True; //按下了确立键,那么这个时候开启返回键的功能Delay(250); //延时除去颤动}}}/*------------------------------------第六次按键--------------------------------------*/ while(1){if(Next==True)break;if(SelectedShow==True)break;}if(Next==True){Next=False;ReturnMain=False;ReturnSelection=False;}if(SelectedShow==True){SelectedShow=False;SelectedReturn=False;Selected=False;}continue;}while(1);}/****************************************************************************************\** LCD 驱动模块**\****************************************************************************************//*---------------------------------LCD初始化函数--------------------------------------*/voidLCDInit(void){// 三次显示模式设置LCD_Data=0;LCD_E=Disable;Delay(5);WriteCmd(LCD_Init);Delay(5);WriteCmd(LCD_Init);Delay(5);WriteCmd(LCD_Init);WriteCmd(LCD_Init); //初始化WriteCmd(LCD_CloseCtr); //关显示WriteCmd(LCD_CLS); //清屏幕WriteCmd(LCD_EnterSet); //光标挪动设置WriteCmd(LCD_DispCtr); //显示开以及光标设置}/*---------------------------------LCD模式设置函数--------------------------------------*\SetWriteCmd()设置 LCD 为写命令模式SetReadCmd()设置 LCD 为读命令模式SetWriteData()设置 LCD 为写数据模式\*----------------------------------------------------------------------------------------*/voidSetWriteCmd(void){LCD_RW=Write;LCD_RS=Cmd;}voidSetReadCmd(void){LCD_RW=Read;LCD_RS=Cmd;}voidSetWriteData(void){LCD_RW=Write;LCD_RS=Data;}/*---------------------------------LCD功能执行函数--------------------------------------*\WriteCmd()写命令WriteData()写数据ExecuteCmd()履行命令SetXY()显示定位DisplaySingleChar()显示单个字符DisplayString()显示一串字符IsBusy()忙标记检测\*----------------------------------------------------------------------------------------*/voidWriteCmd(charcmd){while(IsBusy());LCD_Data=cmd;SetWriteCmd();ExecuteCmd();}voidWriteData(charddata){while(IsBusy());。
int led1=0,led2=0,led3=0,led4=0,led5=0,led6=0,led7=0; //电压7.8V ;led1~7 分别用来接收七个探头检测回来的值int in1=9,in2=3,in3=10,in4=11; //数字IO口9,3,10,11用来控制电机int sum=0;void setup(){pinMode(0,INPUT);pinMode(7,INPUT);pinMode(1,INPUT);pinMode(8,INPUT);pinMode(2,INPUT);pinMode(3,OUTPUT);pinMode(6,INPUT);pinMode(9,OUTPUT);pinMode(4,INPUT);pinMode(10,OUTPUT);pinMode(13,INPUT);pinMode(11,OUTPUT);pinMode(12,INPUT);pinMode(5,INPUT);digitalWrite(in2,LOW);digitalWrite(in4,LOW);}void motor(char pwmpin,char pin,int val) //给电机两个输入口赋PWM值{pinMode(pin, OUTPUT);analogWrite(pwmpin,val);digitalWrite(pin,LOW);}void turn_led1_0() //in1给20,in2给低电平{ //in3给250,in4给低电平motor(in1,in2,20); //PWM满值255,差值决定转角度,大小决定速度motor(in3,in4,250);}void turn_led1_1(){motor(in1,in2,20);motor(in3,in4,250);}void turn_led2_0(){motor(in1,in2,70);motor(in3,in4,250);}void turn_led2_1(){motor(in1,in2,130);motor(in3,in4,250);}void turn_led3_0(){motor(in1,in2,180); motor(in3,in4,250); }void turn_led3_1(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led4_0(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led4_1(){motor(in1,in2,250); motor(in3,in4,250); }void turn_led5_0(){motor(in1,in2,250); motor(in3,in4,180); }void turn_led5_1(){motor(in1,in2,250); motor(in3,in4,130); }void turn_led6_0(){motor(in1,in2,250); motor(in3,in4,70); }void turn_led6_1(){motor(in1,in2,250); motor(in3,in4,20); }void turn_led7_0(){motor(in1,in2,250);motor(in3,in4,20); }void turn_stop(){motor(in1,in2,0);motor(in1,in2,0);}void test() //检测光电管探头。
车辆测速系统程序设计方案项目介绍车辆测速系统是一种为了测量车辆行驶速度的系统。
通常情况下,车辆测速系统使用激光器或雷达测量车辆行驶的速度。
本文将讨论车辆测速系统的程序设计方案。
程序设计概述该系统主要由以下几部分组成:•激光器或雷达设备:用于测量车速。
•嵌入式计算机:对测速仪器采集的数据进行处理,包括筛选、解码、计算等操作。
•显示设备:将测量结果显示给用户。
系统程序设计方案数据采集车辆测速系统的核心是数据采集,其中激光器和雷达设备是最常见的数据采集设备。
激光器和雷达设备都能够测量车辆的时间和距离,并转化为车辆的速度。
为了更好地获取数据,测试设备应安装在具有横向稳定性的地方(例如大型混凝土表面)。
数据处理系统采用以下步骤进行数据处理:1.采集原始数据。
2.转换原始数据格式并进行筛选,以剔除不需要的数据。
3.计算车辆速度。
计算车速的数学公式是速度=路程÷时间。
对于车辆来说,路程即为激光束或雷达信号从之前的位置到目标车辆的位置所需的行驶距离。
时间是从激光束或雷达信号发射到接收到反射信号所需的时间。
系统将采集到的距离和时间信息通过公式计算车速。
显示测量结果测量结果按照需要通过显示器的形式显示。
例如,可以使用LED数字显示器显示车速。
还可以使用计算机或移动设备来记录和分析车速数据。
系统设计要求车辆测速系统设计应该满足以下要求:1.系统应该准确地测量车速,并且可以在多种气象条件下稳定工作。
2.数据处理应该根据测量结果提供准确的车速信息。
3.程序应该尽可能的优化,以最小化处理时间并提高系统响应速度。
4.系统应该符合行业标准和相关的法律法规。
结论以上是车辆测速系统程序设计方案的细节。
通过采用合适的设备和进行相应的数据处理,车辆测速系统能够提供准确的车速信息。
要设计一个良好的车辆测速系统,需要对激光器和雷达设备的工作原理有深入的了解,并能够开发出稳定可靠的程序。
1.#include<intrins.h>2.#include<reg51.h>3.#include<1602.h>4.unsigned char code xiaoche[] = {"xiaoche"};5.unsigned char code mm[] = {"mm"};6.unsigned char code distance[]={"distance"};7.unsigned char code time[]={"time"};8.unsigned char zkbz=0 ; /*占空比*/9.unsigned char zkby=0 ;10.unsigned char t=0; /* 定时器中断计数器 */11.unsigned int juli=0; /*距离*/12.unsigned char a=0;13.unsigned char sl=0; /*时间秒*/14.unsigned char sh=0; /*时间秒*/15.unsigned char fl=0; /*时间分*/16.unsigned char fh=0; /*时间分*/17.unsigned int dis=0; /*实际距离*/18.bit flag=0; /*标志位*/19.sbit gm=P2^3; /*光敏*/20.21./********************************************************22.控制口定义23.*********************************************************/24.sbit en1 =P1^1; /* L298的Enable A */25.sbit s1 =P1^0; /* L298的Input 1 */26.sbit s2 =P1^2; /* L298的Input 2 */27.sbit en2 =P1^4; /* L298的Enable A */28.sbit s3 =P1^3; /* L298的Input 1 */29.sbit s4 =P1^5; /* L298的Input 2 */30.sbit Guandian0=P2^0;31.sbit Guandian1=P2^1;32.sbit Guandian2=P2^2;33.34.35./*******************************************************36.外部中断计算路程37.********************************************************/38.void service_int0() interrupt 039.{40. EX0=0;41.if(flag==0)juli++;42.else juli--;43. dis=juli*5;44. DispOneChar(9,1,dis/10000);45. DispOneChar(11,1,dis/1000%10);46. DispOneChar(12,1,dis/100%10);47. EX0=1;48. }49.50./*************************************************************51.定时器0服务程序52.*************************************************************/53.54.void timer0() interrupt 1 /* T0中断服务程序 */55.{56.if(t<zkbz) en1=1; else en1=0; /* 产生电机1的PWM信号 */57.if(t<zkby) en2=1; else en2=0;/* 产生电机1的PWM信号 */58. t++;59.if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */60.}61.62./*************************************************************63.定时器1服务程序64.*************************************************************/65.void timer1() interrupt 366.{67. unsigned char cnt;68. TH1=(65536-50000)/256;69. TL1=(65536-50000)%256;70. cnt++;71.if(cnt>=20)72. {73. cnt=0;74. ++sl;75.if(sl==10)76. {77. sl=0;78. ++sh;79.if(sh==6)80. {81. sh=0;82. ++fl;83.if(fl==10)84. {85. fl=0;86. ++fh;87. }88. }89. }90. }91. }92.93./*************************************************************94.循迹程序95.*************************************************************/96.void xunji(void)97.{98.switch(a)99. {100.case 0x02:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=40;zkby=40;break; 101.case 0x01:flag=0;s1=0;s2=1;s3=1;s4=0;zkbz=70;zkby=15;break; 102.case 0x04:flag=0;s1=1;s2=0;s3=0;s4=1;zkbz=15;zkby=70;break; 103.case 0x03:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=65;zkby=15;break; 104.case 0x06:flag=0;s1=0;s2=1;s3=0;s4=1;zkbz=15;zkby=75;break; 105.case 0x00:flag=1;s1=1;s2=0;s3=1;s4=0;zkbz=30;zkby=30;break; 106.default:break;107. }108. Delay5Ms();109. }110.111.112./**************************************************************113.内部资源初始化114.*******************************************************************/ 115.void Init(void)116.{117. TMOD=0x12; /* 设定T0的工作模式为2,设定T0的工作模式为1 */118. TH0=0xB6; /* 装入定时器的初值 */119. TL0=0xB6;120. TH1=(65536-50000)/256;121. TL1=(65536-50000)%256;122. IT0=1;123. IP=0x03;124. EA=1; /* 开总中断 */125. ET0=1; /* 定时器0允许中断 */126. ET1=1; /* 定时器1允许中断 */127. TR1=1; /* 启动定时器1 */128. TR0=1; /* 启动定时器0 */129. EX0=1; /*开中断0*/130. }131.132.133.void main(void)134.{135. Init(); /*系统初始化*/ 136. LcdReset(); /*液晶初始化*/ 137. DisplayListChar(0,0,"time",4) ;138. DispOneChar(7,0,':');139. DisplayListChar(0,1,"distance",8) ;140. DispOneChar(10,1,':');141.142. zkbz=40;143. zkby=40;144. s1=0;s2=1;s3=0;s4=1;145.146.do{ /*循迹*/ 147. a=P2;148. a=a&0x07;149. xunji();150. }while(a!=0x07);151.152. zkbz=40; /*避障*/ 153. zkby=40;154. s1=0;s2=1;s3=0;s4=1; //前155. delay(20000);156. s1=0;s2=1;s3=1;s4=0; //左157. delay(65000);158. s1=0;s2=1;s3=0;s4=1; //前159. delay(60000);160. s1=1;s2=0;s3=0;s4=1; //右161. delay(50000);162. s1=0;s2=1;s3=0;s4=1; //前163. delay(60000);164./* s1=1;s2=0;s3=0;s4=1; //右165. delay(60000);166. s1=0;s2=1;s3=0;s4=1; //前167. delay(60000);168. s1=0;s2=1;s3=1;s4=0; //左169. delay(60000);*/170. s1=0;s2=1;s3=0;s4=1; //前171.172.do/*趋光*/173. {174. a=P2;175. a=a&0x07;176.if(!gm)177. {178. zkbz=60;zkby=0;}179.else180. {zkbz=0;zkby=70;}181. delay(10000);182. }while(a==0);183.184. s1=s2=s3=s4=0;185. s1=0;s2=1;s3=0;s4=1;186. delay(20000);187.188. EA=0;189.do{s1=s2=s3=s4=0;190. DispOneChar(5,0,fh+0x30);191. DispOneChar(6,0,fl+0x30);192. DispOneChar(8,0,sh+0x30);193. DispOneChar(9,0,sl+0x30);}while(1); 194.}。
单片机小车黑线循迹程序引言单片机小车是一种通过程序控制的四轮驱动智能小车,在许多应用中具有广泛的用途。
黑线循迹程序是单片机小车的基本功能之一,它通过检测地面上的黑线来自主移动。
本文将详细讨论单片机小车黑线循迹程序的原理、实现方法和注意事项。
原理黑线循迹程序的原理是基于光电传感器的工作原理。
光电传感器是一种能够将光信号转化为电信号的设备。
当光线照射到光电传感器的表面时,光电传感器会生成电信号。
在黑线循迹程序中,光电传感器被安装在单片机小车的底部,用来检测地面上的黑线。
黑线循迹程序的实现基于以下原理:1.当光电传感器检测到黑线时,电信号的强度会发生变化。
2.单片机通过读取光电传感器的电信号,判断车辆是否偏离黑线,并做出相应的动作来保持在黑线上。
实现方法硬件准备在编写黑线循迹程序之前,我们首先需要准备以下硬件:1.单片机开发板:例如Arduino、Raspberry Pi等。
2.电机驱动模块:用于控制小车的轮子转动。
3.电源模块:为小车提供电力。
4.光电传感器模块:用于检测地面上的黑线。
5.电机:驱动小车前进、后退和转向。
接线将光电传感器模块连接到单片机开发板上,确保接线正确。
接线方法可以参考传感器模块的说明书或参考相关文档。
编写程序接下来,我们需要编写黑线循迹程序来控制单片机小车。
1.初始化程序:在程序开始时,需要对相关变量和引脚进行初始化。
2.读取传感器数据:通过读取光电传感器的电信号,获取地面上的黑线信息。
3.判断位置:根据传感器数据判断车辆的位置,判断是否偏离黑线。
4.控制动作:根据车辆位置的判断结果,控制电机驱动模块来让车辆保持在黑线上。
5.循环执行:以上步骤需要不断重复执行,以实时响应地面上的黑线变化。
注意事项在编写和使用黑线循迹程序时,需要注意以下事项:1.传感器校准:在使用光电传感器之前,需要对传感器进行校准,以确保其正常工作。
校准步骤可以参考传感器的说明书或相关文档。
2.环境适应:地面上的黑线可能会受到光照、颜色和宽度等因素的影响。
智能循迹小车,小车按中字笔画行驶/************“中”字笔画轨迹*************/#include<reg52.h>#include <intrins.h> //内部包含延时函数 _nop_(); #define uchar unsigned char#define uint unsigned intunsigned char dj1=0;unsigned char dj2=0;uchar t=0;uchar num1=0,num2=0,num3=0;sbit HW1=P0^0; //红外对管位定义sbit HW2=P0^1;sbit HW3=P0^2;sbit HW4=P0^3;sbit ENA=P3^2; //PWM输入sbit ENB=P3^3;sbit IN5=P2^4; //电机sbit IN6=P2^5;sbit IN7=P2^6;sbit IN8=P2^7;void delay(uint x) //延时1ms{uint i,j;for(i=0;i<x;i++)for(j=0;j<120;j++);}void qianjin() //小车前进{IN5=0;IN6=1;IN7=0;IN8=1;dj1=15;dj2=15;}void turnleft2() //小车前进向左微调{IN5=0;IN6=1;IN7=0;IN8=1;dj1=7;dj2=20;}void turnright2() //小车前进向右微调{IN5=0;IN6=1;IN7=0;IN8=1;dj1=20;dj2=7;}void right(){IN5=0;IN6=1;IN7=1;IN8=0;dj1=20;dj2=25;}void left(){IN5=1;IN6=0;IN7=0;IN8=1;dj1=25;dj2=20;}void stop() //小车后退{dj1=0;dj2=0;}void init() //初始化{TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1 using 1 //定时器0中断{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();while(1){if(num1==0){if(HW1==0&&HW2==1&&HW3==1&&HW4==0){qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=1;delay(50);}}}if(num1==1){if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0)num2=1;delay(50);qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();delay(50);num1=2;delay(50);}}}if(num1==2){if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=2;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==0&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {num3=1;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=3;delay(50);}}}if(num1==3){if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=4;delay(50);}}}if(num1==4){if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==1&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {num3=2;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=5;delay(50);}}}if(num1==5){if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=5;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {stop();delay(100);num1=6;delay(50);}}if(num1==6){if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=6;delay(50);num3=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==3&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=4;delay(10);stop();delay(100);qianjin();}if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(500);num1=7;delay(50);}}}if(num1==7){if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=7;delay(50);num3=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==4&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=5;delay(10);stop();delay(100);qianjin();}if(num3==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=6;delay(10);stop();delay(100);qianjin();}if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(100);if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(90000);}}}}}友情提示:本资料代表个人观点,如有帮助请下载,谢谢您的浏览!。
巡线车程序(完整版)1 #ifndef _Macro.h_2 #define _Macro.h_3 #include <msp430x14x.h>4 #include <intrinsics.h>5 #define uchar unsigned char6 #define uint unsigned int7 #define one 11.118 #define LMAX 19999 #define RMAX 399910 #define CPU_F ((double)8000000)11 #define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))1213 #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))14 #define PC 20 // 比例放大系数15 #define IC 0 //积分放大系数16 #define DC 85 //大系数17 #define LEFTOUT TACCR118 #define RIGHTOUT TACCR219 #define SensorIn P5IN20 #define F 5000//5000hz21 #define Period (8000000/F)22 #define EnableLeftPos P3OUT|=BIT123 #define UnenableLeftPos P3OUT&=~BIT12425 #define EnableLeftNeg P3OUT|=BIT026 #define UnenableLeftNeg P3OUT&=~BIT02728 #define EnableRightPos P3OUT|=BIT229 #define UnenableRightPos P3OUT&=~BIT23031 #define EnableRightNeg P3OUT|=BIT332 #define UnenableRightNeg P3OUT&=~BIT33334 #define Basic_Left 100//百分之八十35 #define Basic_Right 100//Basic_Left36 #define MAX (100)37 #define MIN (-100)38 #define foreward 139 #define backward 040 #define max_speed 10041 #define min_speed -10042 #define key 0434445 #define left_1 146 #define left_2 247 #define left_3 348 #define left_4 449 #define left_5 550 #define left_6 651 #define left_7 7//右直角5253 #define right_1 -154 #define right_2 -255 #define right_3 -356 #define right_4 -457 #define right_5 -558 #define right_6 -659 #define right_7 -7//左直角60 #endif[cpp]view plaincopy61 #include "Macro.h"62 #include "sensor.h"63 void Motorstop()64 {65 LEFTOUT=0;66 RIGHTOUT=0;67 }68 void MotorLeft(int speed,int direction)69 {70 if(speed>max_speed)speed=max_speed;71 if(direction==backward)//反转72 {73 EnableLeftNeg;74 UnenableLeftPos;75 }76 else if(direction==foreward)//正转77 {78 EnableLeftPos;79 UnenableLeftNeg;80 }81 LEFTOUT=Period/100*speed;82 }83 void MotorRight(int speed,int direction)84 {85 if(speed>max_speed)speed=max_speed;8687 if(direction==backward)//反转88 {89 EnableRightNeg;90 UnenableRightPos;91 }92 else if(direction==foreward)//正转93 {94 EnableRightPos;95 UnenableRightNeg;96 }97 RIGHTOUT=Period/100*speed;98 }99 void MotorDrive(int PIDout)100 {101 int speedleft,speedright;102 speedleft=Basic_Left PIDout;103 speedright=Basic_Right-PIDout;104105 if(speedleft<0)106 MotorLeft(speedleft,backward);//反转107 else MotorLeft(speedleft,foreward);//正转108109 if(speedright<0)110 MotorRight(speedright,backward);//反转111 else MotorRight(speedright,foreward);//正转112 }113 void Rangle(float angle)114 {115 // TBCTL|=TBCLR;116 TBCCR1=LMAX (unsigned int)(angle*one);117 }[cpp]view plaincopy118 //下面是小车的程序。