基于51单片机的坦克循迹 计时测速程序
基于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寻迹车课程设计

51寻迹车课程设计一、课程目标知识目标:1. 学生能够理解并掌握51单片机的核心结构与功能,了解其在寻迹车制作中的应用。
2. 学生能够掌握寻迹车的基本工作原理,包括传感器、电机驱动和程序控制等。
3. 学生了解并掌握基础的编程知识,能够运用C语言编写简单的控制程序。
技能目标:1. 学生能够运用所学知识,独立完成51寻迹车的组装和调试。
2. 学生能够通过编程实现对寻迹车的精确控制,完成设定的任务。
3. 学生能够运用问题解决策略,针对寻迹车在运行过程中遇到的问题进行分析和解决。
情感态度价值观目标:1. 学生培养对单片机及编程的兴趣,激发创新意识和探索精神。
2. 学生培养团队合作意识,学会与他人共同解决问题,相互帮助,共同进步。
3. 学生培养认真负责的态度,对待学习和实践过程中遇到的困难和挑战,勇于尝试和克服。
本课程针对五、六年级学生设计,课程性质以实践性、探究性为主。
结合学生特点,注重培养动手能力、逻辑思维和创新意识。
在教学过程中,要求教师引导学生主动参与,关注个体差异,以提高学生的学习兴趣和积极性。
课程目标分解为具体的学习成果,便于后续教学设计和评估,确保学生能够达到预期学习效果。
二、教学内容本课程依据课程目标,结合教材内容,组织以下教学大纲:1. 51单片机基础知识:- 简介与结构:了解51单片机的起源、发展及其核心结构。
- 工作原理:学习51单片机的工作原理,包括时钟、内存、I/O口等。
2. 寻迹车工作原理:- 传感器原理:学习并掌握寻迹传感器的工作原理及其在寻迹车中的应用。
- 电机驱动:了解电机驱动的基本原理,学会控制电机的转速和方向。
3. 编程控制:- C语言基础:学习C语言的基本语法和编程规范。
- 程序编写:根据寻迹车功能需求,编写相应的控制程序。
4. 寻迹车组装与调试:- 组装指导:学习并掌握寻迹车的组装方法,包括电路连接、传感器安装等。
- 调试技巧:学会调试程序和硬件,解决寻迹车运行过程中的问题。
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单片机的数字测速系统的设计方案 0 引言 本方案所设计的基于霍尔元件的脉冲发生器要求成本低,构造简单,性能好。
在电气控制系统中存在着较为恶劣的电磁环境,因此要求产品本身要具有较强的抗干扰能力。
系统主要由AT89S52 单片机处理系统、电机、传感器检测单元、信号处理单元和显示系统等几个部分组成。
1 总体方案设计 对转速的测量实际上是对转子旋转引起的周期脉冲信号的频率进行测量。
霍尔元件测速法是利用霍尔开关元件测转速的。
霍尔开关元件内含稳压电路、霍尔电势发生器、放大器、施密特触发器和输出电路。
输出电平与TTL 电平兼容,在电机转轴上装一个圆盘,圆盘上装若干对小磁钢,小磁钢越多,分辨率越高,霍尔开关固定在小磁钢附近,当电机转动时,每当一个小磁钢转过霍尔开关,霍尔开关便输出一个脉冲,计算出单位时间的脉冲数,即可确定旋转体的转速。
其系统框图如图1 所示。
2 系统硬件电路设计 该系统包括霍尔传感器、隔离整形电路、主CPU、显示电路、报警电路及电源等部分。
其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出,经隔离整形后送入单片机进行处理,单片机收到信号将该值数据处理后,在LCD 液晶显示器上显示出来。
一旦超速,CPU 通过蜂鸣器进行报警。
2.1 传感器的选择 测量电机转速的第一步就是要将电机的转速表示为单片机可以识别的脉冲信号,从而进行脉冲计数。
利用霍尔器件检测脉冲信号因其具有结构牢固、体积小、重量轻、寿命长、安装方便等优点。
当电机转动时,带动传感器运动,产生对应频率的脉冲信号,经过信号处理后输出到计数器或其他的脉冲计数装置,进行转速的测量。
2.2 微处理器的选择 为了减少体积与功耗,采用较常使用且较经济的AT89S52单片机:AT89S52 是一种低功耗、高性能CMOS 的8 位微控制器,具有8K 在系统可编程存储器。
其最小系统包括单片机AT89S52接口电路、晶振电路、复位电路。
基于51单片机和霍尔传感器的测速

基于51单片机和霍尔传感器的测速1. 小项目简介主要采用stc89c51/52单片机作为主控,由霍尔传感器作为测速的基本模块,采用按键控制速度快慢,数码管显示当前速度。
最后成品图如下:2.电源部分1.电源供电的功率尽可能的稍微大一些,我是采用罗马仕充电宝供电(5V,2.1A输出口)。
因为电源功率过小,将造成电机无法带动,或者数码管闪烁等硬件上的bug。
2.如果电源的电压高于5V,需要在电源输入端使用一个稳压电路,将输入电压稳压到5V给单片机,和其他外设供电。
防止电压过高造成器件损坏。
3.硬件部分1. stc89c51/52的最小系统注意:如果使用一般的USB接口供电,当电机转动时候,可能照成单片机的管脚供电不稳定,所以需要在单片机的IO的外接上拉排阻。
P3口不需要。
9针排阻如下:有小点的一端是公共端,需要和电源5V连接,其余口和单片机管脚一一对应焊接就行。
2. 霍尔传感器注意引脚,窄的一面来看引脚顺序:这里的VOUT口可以直接连接单片机的外部中断1口,可以经过一个电压比较器lm393之类的在给单片机。
3. 直流电机马达驱动51单片机的IO口输出的电流过小,驱动直流电机马达效果不明显,达不到后期变速,需要使用一个三极管(9015\9013这类都可以)放大电路去驱动马达:示范电路如下:(电阻根据自己需要修改)4. 共阴数码管//数码管位选sbit S1=P2^4;sbit S2=P2^5;sbit S3=P2^6;sbit S4=P2^7;//数码管段选:P1的八个IO口。
连线的时候一定根据下列图示的段选(注意注意注意:容易连错)4.软件部分1.软件工程整体图:2.main.c文件代码:自己创建一个51单片机的keil工程文件,将下面代码拷贝到自己工程文件下的main.c文件替换即可/************************************************************** ************************* 基于51单片机测速* 实现现象:按下按键K1减速按下按键K2加速外部中断1对应IO口P3^3注意事项:电机速度不能过快,否则会造成数码管显示不稳定*************************************************************** ************************/#include 'reg52.h' //此文件中定义了单片机的一些特殊功能寄存器typedef unsigned int u16; //对数据类型进行声明定义typedef unsigned char u8;//测试端口(根据自己需要决定)sbit led=P0^0; //将单片机的P0.0端口定义为led/************************************************************** ****************************************************核心部分**************************************************************************************************************** ************************///占空比u16 time = 0; // 定义占空比的变量u16 count=30; //定义占空比上限sbit PWM=P0^1;// P0.1输出pwm//速度u16 zhuansu=0; //转速初值为0u16 jishu = 0; //jishu的变量初值为0u8 flag = 0; //定时器1计数变量//按键sbit k1=P2^0;sbit k2=P2^1;sbit k3=P2^2;sbit k4=P2^3;//数码管位选sbit S1=P2^4;sbit S2=P2^5;sbit S3=P2^6;sbit S4=P2^7;//数码管位选:P1的八个IO口//共阴数码管段选u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值//数码管存储中间变量unsigned char Display_data[4];/************************************************************** ****************** 函数名 : delay* 函数功能 : 延时函数,i=1时,大约延时10us*************************************************************** ****************/void delay(u16 i){while(i--);}//定时器和外部中断1的初始化函数void InitSyetem(){//配置外部中断1:采集霍尔传感器触发下降沿IT1 = 1; //选择下降沿触发EX1 = 1; //打开外部中断1//定时器0,1工作方式1TMOD=0x11; //定时或者计数模式控制寄存器//定时器0配置:产生PWM波TH0=(65536-10)/256;//赋初值定时10usTL0=(65536-10)%256;//sET0=1;//开定时器0中断TR0=1;//启动定时器0//定时1:测速TH1=(65536-10000)/256;//赋初值定时10msTL1=(65536-10000)%256;ET1=1;//开定时器0中断TR1=1;//启动定时器0PX1=1;//设置优先级PT1=1;//设定定时器1为最高优先级EA=1;//开总中断}//外部1中断服务函数void Service_Int1() interrupt 2{jishu++; //霍尔下降沿一次就记一次数if(jishu == 100) //累加计数有100次,总时间为100 * 10ms = 1s{led^=led; //led闪烁}}//定时0处理函数产生PWM 调速原理———在PWM高电平时候驱动电机转动在PWM低电平时候让电机停止转动void Service_Timer0() interrupt 1{TR0=0;//赋初值时,关闭定时器TH0=(65536-10)/256;//赋初值定时TL0=(65536-10)%256;//0.01msTR0=1;time++; //计数变量if(time>=100) time= 0; //清零标志变量if(time<=count) //小于设定值,输出高电平{PWM = 1;}elsePWM = 0;}//定时器1中断处理显示转速void Service_Timer1() interrupt 3{TR1=0;//赋初值时,关闭定时器TH1=(65536 - 10000) / 256;TL1=(65536 - 10000) % 256;//定时10msTR1=1;flag++; //计数变量加if(flag==100) //计时到达1s 测量此时的转速{// led=~led; //led状态取反zhuansu = jishu; //监测霍尔传感器总共计数次数jishu=0; //转速置0flag=0; //清除计数变量}}//数码管处理函数void Deal_data(){Display_data[3]=smgduan[zhuansu/1000]; //数码管高位Display_data[2]=smgduan[zhuansu/100%10];//去第二位Display_data[1]=smgduan[zhuansu/10%10];Display_data[0]=smgduan[zhuansu%10]; //数码管低位}/************************************************************** ****************** 函数名 : DigDisplay* 函数功能 : 数码管动态扫描函数,循环扫描4个数码管显示*******************************************************************************/void DigDisplay(){u8 i;for(i=0;i<4;i++){switch(i) //位选,选择点亮的数码管,{case 0 : S1 = 0; S2 = 1; S3 = 1; S4 = 1;break; //点亮第一位数码管case 1 : S2 = 0; S1 = 1; S3 = 1; S4 = 1;break;case 2 : S3 = 0; S1 = 1; S2 = 1; S4 = 1;break;case 3 : S4 = 0; S1 = 1; S2 = 1; S3 = 1;break;}P1=Display_data[i];//发送段码delay(5); //间隔一段时间扫描时间越少,一起亮且显示越稳定;时间越多,是流水点亮P1=0x00;//消隐时间过快时,每个数码管将会有重影}}/************************************************************** ****************** 函数名 : keypros* 函数功能 : 按键处理函数,判断按键K1是否按下*************************************************************** ****************/void keypros(){if(k1==0) //检测按键K1是否按下{delay(100); //消除抖动一般大约10ms 时间的估算100*n=1(s) if(k1==0) //再次判断按键是否按下{led=~led; //led状态取反count+=10;if(count >= 90) //设置一个上限count+=90;}while(!k1); //检测按键是否松开为假时候说明按键没有释放}if(k2==0) //检测按键K1是否按下{delay(100); //消除抖动一般大约10msif(k2==0) //再次判断按键是否按下{led=~led; //led状态取反count-=10;if(count <= 10){count = 10;}}while(!k2); //检测按键是否松开}}/************************************************************** ****************** 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无*************************************************************** ****************/void main(){led = 0; //上电熄灭小灯P1 = 0x00; //上电初始化熄灭数码管InitSyetem();//定时器和外部中断1的初始化函数while(1){keypros(); //按键处理函数Deal_data(); //数据处理函数DigDisplay(); //数码管显示函数}}。
基于51单片机的智能寻迹小车(毕业论文)

基于51单片机的智能寻迹小车(毕业论文)目录摘要 (I)ABSTRACT (II)1.绪论 (1)1.1课题背景 (1)1.2国内外的研究现状分析 (1)1.3课题研究的目的和意义 (2)2.系统方案设计 (3)2.1循迹原理 (3)2.2系统总体框图 (3)2.3轨迹检测模块 (4)2.3.1传感器模块 (4)2.3.2检测放大器方案 (4)2.4MCU控制模块 (7)2.5电机及驱动模块 (7)2.5.1转向和动力 (7)2.5.2电动机模块 (7)2.5.3调速系统 (8)2.5.4电机驱动模块 (9)2.6电源模块 (9)2.7显示模块 (10)2.8系统工作原理 (10)3.硬件设计 (11)3.1电源模块设计 (11)3.1.1 智能车电源设计要点 (11)3.1.2 低压差稳压芯片LM2940 简介 (11)3.2单片机最小系统设计 (12)3.3前向通道设计 (14)3.4后向通道设计 (22)3.4.1 后向通道简介 (22)3.4.2 后轮电机驱动模块设计 (23)4.软件设计 (27)4.1系统总体流程图 (27)4.2PWM调速简介以及实现 (28)4.3程序的模块化设计 (29)4.3.1 小车循迹原理流程图 (29)4.3.2 定时器中断程序流程图 (31)4.3.3 部分程序设计 (32)5.仿真结果分析及结论 (35)5.1 PROTEUS 软件仿真结果 (35)5.2仿真结果分析 (37)6.结束语 (38)致谢 (39)参考文献 (40)附件 (42)文献综述 (48)摘要智能车辆作为现代社会的新产物,以及在智能车辆基础上开发出来的产品已成为自动化物流运输、柔性生产组织等系统的关键设备,智能小车的研究和开发正成为广泛关注的焦点。
本设计是一种基于单片机控制的简易自动寻迹小车系统,系统的设计主要分为总体方案设计、硬件和软件设计,其中每一部分均采用模块化设计原则,使得设计易读、易修改、易扩充。
基于51单片机的循迹小车系统设计说明

基于51单片机的循迹小车系统设计摘要80C51单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。
在生活中但凡涉及到自动控制的地方都会出现单片机的身影,单片机的应用有利于产品的小型化、智能化,并且能够提高生产效率。
这里介绍的是如何用AT89C52单片机来实现小车的循迹功能,该设计是结合科研项目而确定的设计类课题。
本系统以设计题目的要求为目的,采用AT89C52单片机为控制核心,利用红外传感器检测道路上的黑线,控制电动小汽车的自动循迹,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,和寻光功能。
整个系统的电路结构非常简单,可靠性能很高。
实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
关键词:80C51单片机;电动小车;pwm调速;光电检测;自动调速系统Car tracking system based on microcontrollerAbstract80C51 is a 8 bit single chip computer. Its easily using and multi-function suffer large users.In life, whenever it comes to automatic control of the local microcontroller will appear figure, microcontroller applications in favor of product miniaturization, intelligent, and can improve productivity. Here is how to use AT89C52 microcontroller to achieve the car tracking feature, which is designed to determine the combination of scientific research and design class topic. This system design requirements of the subject for the purpose of usingAT89C52 microcontroller core, the use of infrared sensors to detect the black line on the road, the automatic tracking control of electric cars, fast low traffic speeds, as well as automatic parking, and can automatically record time , mileage and speed, and look for the light function.The circuit structure of the entire system is very simple, very high reliability. The test results meet the requirements, the paper focuses on the hardware design and test results of the system analysis.Keywords:80C51 microcontroller; Electric car Pwm speed; A photodetector; Automatic Speed Control System.目录中文摘要 (I)外文摘要 (Ⅱ)1 绪论 (1)1.1 课题背景及意义 (1)1.2 智能小车研究前景及功能 (3)1.3 国外的研究情况 (6)1.3.1 智能小车国外研究现状.........................1.3.2 智能小车国研究现状.........................1.4 本课题具体应用方面及场合2 智能循迹小车的方案设计2.1 智能小车的运行环境及行走路线 (7)2.1.1 智能小车的运行环境2.1.2 智能小车的运行路线2.2 主控芯片的选择与原理 (8)2.2.1 51单片机引脚与功能说明2.3 调速系统的设计 (8)2.3.1 PWM逆变电路及其控制方法2.3.1.1 计算法2.3.1.2 调制法2.3.2 PWM调速的优点3 硬件电路的选择与搭建3.1 单片机的辅助电路3.1.1 时钟电路3.1.2 复位电路3.2 单片机控制模块的设计3.3 驱动模块的设计3.3.1 电机驱动芯片3.3.2 电机驱动模块3.4 循迹模块的制作与设计3.4.1 循迹传感器工作原理3.4.2 寻光电路分析3.4.3 循迹电路分析3.4.3.1 红外对管TCRT5003.4.3.2 电压比较器LM3243.5 各模块的组装与连接4 循迹小车的软件设计4.1 软件设计开发平台 (15)4.2 小车运动状态分析及三路算法的设计 (16)4.2.1 小车运动状态分析 (16)4.2.2 三路循迹算法设计 (17)4.3 软件设计流程图 (20)4.4 软件的调试 (24)4.4.1 设置和删除断点 (24)4.4.2 查看和修改寄存器的容 (26)4.4.3 观察和修改变量 (28)4.4.4 查看存储器区域结论 (44)参考文献 (45)致 (46)附录1 智能循迹小车原理图 (50)附录2 循迹程序附录3 外文参考文献(译文) (50)附录4 外文参考文献(原文)51绪论1.1课题背景及意义随着汽车工业的发展,关于汽车的研究也就越来越受到人们的关注。
基于51单片机的循迹小车程序设计

#include<reg51.h>#define uchar unsigned char#define uint unsigned intuint zkb1=0 ; //**右边电机的占空比**//uint zkb2=0 ; //**左边电机的占空比**//uint t=0; //**定时器中断计数器**//sbit rin1=P1^0;sbit rin2=P1^1;sbit lin1=P1^2;sbit lin2=P1^3;sbit lift2=P2^2;sbit lift1=P2^3;sbit mid=P2^4;sbit right1=P2^5;sbit right2=P2^6;sbit pwm1=P2^0;sbit pwm2=P2^1;//****************延时函数****************// void delay(uint x){uchar j;while (x--){for(j=0;j<123;j++);}}//**********初始化定时器,中断***********// void init(){ TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;ET0=1;TR0=1;}//***********中断函数+脉宽调制***********// void timer0() interrupt 1{TH0=(65536-100)/256;TL0=(65536-100)%256;++t;if(t<=zkb1){pwm1=1;}if(t>zkb1){pwm1=0;}if(t<=zkb2){pwm2=1;}if(t>zkb2){pwm2=0;}if(t==1000){t=0;}}// zkb2=左,zkb1=左//******************直行******************// void qianjin(){// zkb2=200; zkb1=170;zkb2=1000; zkb1=920;lin1=1; //******给电机加电启动******//lin2=0;rin1=1;rin2=0;}//***************左转1函数***************// void turn_right1(){// zkb2=200; zkb1=0;zkb2=950; zkb1=100;rin1=0;rin2=1;}//***************左转2函数***************// void turn_right2(){// zkb2=300; zkb1=0;zkb2=1000; zkb1=110;rin1=0;rin2=1;}//***************右转1函数***************// void turn_lift1(){// zkb2=0; zkb1=200;zkb2=100; zkb1=950; lin1=0;lin2=1;}//***************右转2函数***************//void turn_lift2(){// zkb2=0; zkb1=300;zkb2=110; zkb1=1000; lin1=0;lin2=1;}//***************循迹函数*****************//void xunji(){uchar flag;if((lift2==1)&&(lift1==1)&&(mid==0)&&(right1==1)&&(right2==1)) { flag=0; }//*******直行*******//else if((lift1==0)&&(mid==0)&&(right1==0)){ flag=0; } //******直行*******////else if((lift2==1)&&(lift1==1)&&(mid==1)&&(right1==1)&&(right2==1)) // { flag=0; } //*******直行*******//else if((lift2==1)&&(lift1==0)&&(mid==1)&&(right1==1)&&(right2==1)) { flag=1; } //*******左转1*******//else if((lift2==0)&&(lift1==1)&&(mid==1)&&(right1==1)&&(right2==1)) { flag=2; }//***左转2***//else if((lift2==1)&&(lift1==1)&&(mid==1)&&(right1==0)&&(right2==1)) { flag=3; }//***右转1***//else if((lift2==1)&&(lift1==1)&&(mid==1)&&(right1==1)&&(right2==0)) { flag=4; }//***右转2***//switch (flag){case 0:qianjin();break;case 1:turn_lift1();break;case 2:turn_lift2();break;case 3:turn_right1();break;case 4:turn_right2();break;default: break;}}//****************主程序****************// void main(){init();while(1){ lin1=1; //******给电机加电启动******// lin2=0;rin1=1;rin2=0;// pwm1=1;// pwm2=1;while(1){xunji(); //*********寻迹**********// // zkb1=0;// zkb2=500;// qianjin();// turn_lift1();// turn_lift2();// turn_right1();// turn_right2();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<reg52.h>
unsigned inti=0;
sbit P36=P3^6;
sbit P10=P1^0; //循迹口
sbit P11=P1^1;
sbit P12=P1^2;
sbit P14=P1^4; //电机口
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
unsigned char j,time;
unsigned intkop,dr;
unsigned char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char c[4]={0xff,0xff,0xff,0xff},d[4];
void delay(unsigned char z) //延时子程序
{
unsigned char j;
while(z--)
for(j=123;j>0;j--);
}
void main()
{
TMOD=0x15; // 打开定时器和计数器
TH0=0x00;
TL0=0x00;
TH1=0XFc; //1ms
TL1=0X18;
EA = 1;
ET0=1;
ET1=1;
TR1 = 1;
TR0 = 1;
while(1)
{
if(P10==0&&P11==0&&P12==0)
{
TR0=0; //显示时间停
P0=d[0];
P2=0XFE;
delay(1);
P0=d[3];
P2=0XFB;
delay(3);
P0=d[2]; //显示测速停
P2=0XFD;
delay(3);
P0=d[3];
P2=0XF7;
delay(3);
P14=1;P15=1;P16=1; P17=1;
}
}
}
void timer1() interrupt 3 //中断服务程序
{
unsigned intqq=0,ww=0;
TH1=0XFc;
TL1=0X18;//1ms
i++;
switch(i%4)
{
case 0:P0=c[0],P2=0XFE;d[0]=c[0];break;
case 1:P0=c[1],P2=0XFD;d[1]=c[1];break;
case 2:P0=c[2],P2=0XFB;d[2]=c[2]; break;
case 3:P0=c[3],P2=0XF7;d[3]=c[3]; break; default:break;
}
P14=1;P15=1;P16=1; P17=1;
if(P10==0&&P11==0&&P12==0) //全测到
dr=0;
if(P10==1&&P11==0&&P12==1) //中间测到
dr=1;
if(P10==0&&P11==1&&P12==1) //左边测到dr=2;
if(P10==1&&P11==1&&P12==0) //右边测到dr=3;
if(P10==0&&P11==0&&P12==1) //左两测到dr=4;
if(P10==1&&P11==0&&P12==0) //右两测到dr=5;
switch(dr)
{
case 0:P14=1,P15=1,P16=1,P17=1,TR1=0;break; //全测到停
case 1:P14=0,P15=1,P16=0,P17=1;break; //直走
case 2:P14=1,P15=1,P16=0,P17=1,ww=1;break; //左拐
case 3:P14=0,P15=1,P16=1,P17=1,qq=1;break; //右拐
case 4:P14=1,P15=0,P16=0,P17=1,ww=1;break; //左两测到左拐
case 5:P14=0,P15=1,P16=1,P17=0,qq=1;break; //右两测到右拐
}
/*跑出跑道外记忆回到跑道内*/
if(dr==2&&ww==1||dr==4&&ww==1) //单边或双边测到跑出去{
qq=0;
P14=1;P15=1;P16=0;P17=1;
}
if(dr==3&&qq==1||dr==5&&qq==1)
{
ww=0;
P14=0;P15=1;P16=1;P17=1;
}
if(i==1000) //1s
{
kop=TH0;//计数器计入脉冲
kop=kop<<8;
kop=kop+TL0;
kop=kop*15;
c[3]=a[kop/10];
c[2]=a[kop%10];
time++;
c[1]=a[time/10];
c[0]=a[time%10];
i=0;
TH0=0;
TL0=0;
}
}。