基于51单片机的坦克循迹 计时测速程序

合集下载

基于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寻迹车课程设计

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单片机有时间显示的循迹小车程序

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

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

基于51单片机的数字测速系统的设计方案

基于51单片机的数字测速系统的设计方案

基于51单片机的数字测速系统的设计方案 0 引言 本方案所设计的基于霍尔元件的脉冲发生器要求成本低,构造简单,性能好。

在电气控制系统中存在着较为恶劣的电磁环境,因此要求产品本身要具有较强的抗干扰能力。

系统主要由AT89S52 单片机处理系统、电机、传感器检测单元、信号处理单元和显示系统等几个部分组成。

1 总体方案设计 对转速的测量实际上是对转子旋转引起的周期脉冲信号的频率进行测量。

霍尔元件测速法是利用霍尔开关元件测转速的。

霍尔开关元件内含稳压电路、霍尔电势发生器、放大器、施密特触发器和输出电路。

输出电平与TTL 电平兼容,在电机转轴上装一个圆盘,圆盘上装若干对小磁钢,小磁钢越多,分辨率越高,霍尔开关固定在小磁钢附近,当电机转动时,每当一个小磁钢转过霍尔开关,霍尔开关便输出一个脉冲,计算出单位时间的脉冲数,即可确定旋转体的转速。

其系统框图如图1 所示。

2 系统硬件电路设计 该系统包括霍尔传感器、隔离整形电路、主CPU、显示电路、报警电路及电源等部分。

其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出,经隔离整形后送入单片机进行处理,单片机收到信号将该值数据处理后,在LCD 液晶显示器上显示出来。

一旦超速,CPU 通过蜂鸣器进行报警。

2.1 传感器的选择 测量电机转速的第一步就是要将电机的转速表示为单片机可以识别的脉冲信号,从而进行脉冲计数。

利用霍尔器件检测脉冲信号因其具有结构牢固、体积小、重量轻、寿命长、安装方便等优点。

当电机转动时,带动传感器运动,产生对应频率的脉冲信号,经过信号处理后输出到计数器或其他的脉冲计数装置,进行转速的测量。

2.2 微处理器的选择 为了减少体积与功耗,采用较常使用且较经济的AT89S52单片机:AT89S52 是一种低功耗、高性能CMOS 的8 位微控制器,具有8K 在系统可编程存储器。

其最小系统包括单片机AT89S52接口电路、晶振电路、复位电路。

基于51单片机和霍尔传感器的测速

基于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单片机的智能寻迹小车(毕业论文)

基于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单片机的循迹小车系统设计说明

基于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单片机的循迹小车程序设计

基于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();}}}。

基于51单片机的自动寻迹小车控制设计

基于51单片机的自动寻迹小车控制设计

图4主程序流程图
4.2寻迹程序流程 把小车直线行进时分成三种状态,当中间三个
(下转第20页)
基金项目:本文系江西省2008年高等学校教学研究省级重点立项课题“高职电子类相关专业创新型训练项目的教学研究”(项目编号:JxJG—08—30一1)。 作者简介:文方(1968-)。男。湖南衡阳人,硕士,剐教授,主要从事电类课程教学与研究。
一18一 万方数据
科技信息
博士·专家论坛
照最小化误差的方法进行学习训练。RIMER专家系统的训练模型。如 图2。
图2置信规则库训练过程的图解 学习的目的是最小化理想输出和模拟输出间的误差。由于理想输
出和模拟结果都是以分布式出现,因此减小ym和ym的误差就等价于减
小置信度B㈤和pj㈨间的误差。
则训练模型的目标函数定义如下:
相似文献(10条)
1.期刊论文 徐海.徐瑞丽.XU Hai.XU Rui-Li 基于PIC单片机直流电机控制器的设计与实现 -机电产品开发与创新
2009,22(4)
直流电机因其转速调节灵活,方法简单,易于大范围平滑调速,控制性能好等特点,一直在传动领域占有统治地位.本文应中国电子科技集团第27研究所 的要求,设计开发了一套基于PIC单片机的直流电机多速控制器,作为其配套的试验装置.运行结果表明,系统实现了直流电机的高精度多速度控制,达到了 性能指标要求.目前已经进入试验阶段.
2.期刊论文 罗江勇.何道清.黄兴琦 基于单片机的直流电机远程测控系统 -仪器仪表用户2008,15(4)
本文以1.KW直流电机为被控对象,介绍了采用单片机和PC机构成的电机远程测控系统.采用转速的周期测量法和电机的PWM控制方式实现对电机转速的 高精度测量与控制.设计了单片机系统和PC机间的通信接口,上位机采用VC设计监控程序对电机进行实时监控,系统运行稳定可靠.

基于51单片机的循线测距测速及1602显示

基于51单片机的循线测距测速及1602显示

#include<regx52.h> //器件配置文件#include <intrins.h>#define TX P1_2 //Trig#define RX P1_3 //Echo#define LCM_RS P2_5 //概念LCD引脚#define LCM_RW P2_6#define LCM_E P2_7#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识#define uint unsigned int#define uchar unsigned charsbit P10=P2^1;//操纵左电机前进sbit P11=P2^2;//操纵左电机后退sbit P12=P2^3;//操纵右电机前进sbit P13=P2^4;//操纵右电机后退sbit P14=P1^4;//寻迹左sbit P15=P1^5;//寻迹中sbit P16=P1^6;//寻迹右sbit P17=P1^7;//避障void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);void Decode(unsigned char ScanCode);void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);void fun2(void);void fun3(void);void fun4(void);void fun5(void);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);unsigned char code mcustudio[] ={"…………. "};unsigned char code email[] = {"………… "};unsigned char code Cls[] = {"……………"};unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};static unsigned char DisNum = 0; //显示用指针unsigned int time=0;unsigned long S=0;bit flag =0;unsigned char disbuff[4] ={ 0,0,0,0,};bit Flg_5ms=0;unsigned char Counter_100ms=0;unsigned char buf[5]={0,0,0,0,0};unsigned int Speed;unsigned int speed_frequency; // frequencyunsigned int speed_catch1; //catch 1unsigned int speed_catch2; //catch 2unsigned char speed_t2_ovf_count_temp; //T1 overflow counter temp register unsigned char speed_t2_ovf_count; //T1 overflow counter register unsigned char speed_catch_p; //catch pointer//写数据void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //假设晶振速度太高能够在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}//写指令void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //依照需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}//读数据unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}//读状态unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_RW = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}void LCMInit(void) //LCM初始化{LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0F,1); // 显示开及光标设置}//按指定位置显示一个字符void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData) {Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCM(X, 1); //发命令字WriteDataLCM(DData); //发数据}//按指定位置显示一串字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x19) //假设抵达字串尾那么退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}//5ms延时void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}//400ms延时void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/********************************************************/ void Conut(void){time=TH0*256+TL0;TH0=0;TL0=0;S=(time*1.7)/100; //算出来是CMif((S>=700)||flag==1) //超出测量范围显示"-"{flag=0;DisplayOneChar(0, 1, ASCII[11]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[11]);DisplayOneChar(3, 1, ASCII[11]);DisplayOneChar(4, 1, ASCII[12]); //显示M}else{disbuff[0]=S%1000/100;disbuff[1]=S%1000%100/10;disbuff[2]=S%1000%10 %10;DisplayOneChar(0, 1, ASCII[disbuff[0]]);DisplayOneChar(1, 1, ASCII[10]); //显示点DisplayOneChar(2, 1, ASCII[disbuff[1]]);DisplayOneChar(3, 1, ASCII[disbuff[2]]);DisplayOneChar(4, 1, ASCII[12]); //显示M}}/********************************************************/void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围{flag=1; //中断溢出标志}/********************************************************/ void StartModule() //启动模块{TX=1; //启动一次模块_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}//--------------------------------------------void fun2(void){ P10=1;P11=0;P12=1;P13=0;} //前进void fun3(void){ P10=0;P11=0;P12=1;P13=0;}//左转void fun4(void){ P10=1;P11=0;P12=0;P13=0;} //右转void fun5(void){ P10=0;P11=0;P12=0;P13=0;}//停止/********************************************************/void timer1() interrupt 3 //T0中断用来计数器溢出,超过测距范围{Flg_5ms=1;TH1=0xee;TL1=0;TF1=0;if(P14==1&&P15==0&&P16==1) fun2();if((P14==0&&P15==0&&P16==1)||(P14==0&&P15==1&&P16==1)) fun3();if((P14==1&&P15==0&&P16==0)||(P14==1&&P15==1&&P16==0)) fun4();if((P14==1&&P15==1&&P16==1)||(P14==0&&P15==0&&P16==0)||(P17==0)) fun5();}//-------------------------------------------void Timer2() interrupt 5 //按时器2捕捉中断,溢出中断{if(TF2){if(speed_t2_ovf_count_temp < 2) speed_t2_ovf_count_temp++;else{speed_frequency = 0; // frequencyspeed_catch1 = 0; //catch 1speed_catch2 = 0; //catch 2speed_catch_p = 0; //catch pointerspeed_t2_ovf_count_temp = 0; //T2 overflow counter temp registerspeed_t2_ovf_count = 0; //T2 overflow counter registerSpeed=0;}TF2=0;}if(EXF2){switch(speed_catch_p){case 0:speed_catch1 = RCAP2H;speed_catch1 <<=8;speed_catch1 += RCAP2L;speed_catch_p++;break;case 1:speed_catch2 = RCAP2H;speed_catch2 <<=8;speed_catch2 += RCAP2L;speed_t2_ovf_count = speed_t2_ovf_count_temp;speed_catch_p++;break;default:break;}speed_t2_ovf_count_temp = 0;EXF2=0;}}/*********************************************************/void main(void){unsigned char TempCyc;unsigned long temp;Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 0, mcustudio);DisplayListChar(0, 1, email);ReadDataLCM();//测试用句无心义for (TempCyc=0; T empCyc<10; T empCyc++)Delay400Ms(); //延时DisplayListChar(0, 1, Cls);Speed=0;speed_frequency = 0; // frequencyspeed_catch1 = 0; //catch 1speed_catch2 = 0; //catch 2speed_catch_p = 0; //catch pointerspeed_t2_ovf_count_temp = 0; //T2 overflow counter temp register speed_t2_ovf_count = 0; //T2 overflow counter register while(1){TMOD=0x11; //设T0为方式1,GATE=1;TH0=0;TL0=0;TH1=0xee;TL1=0;T2CON = 0x09; //捕捉模式ET0=1; //许诺T0中断ET1=1; //许诺T0中断ET2=1;EA=1; //开启总中断TR1=1; //开启计数TR2=1;while(1){if(Flg_5ms){Flg_5ms=0;if(Counter_100ms<39){Counter_100ms++;if(Counter_100ms==20){if(speed_catch_p > 1){temp =(unsigned long)(( 65536UL * speed_t2_ovf_count)+ speed_catch2 - speed_catch1); //calculate TSpeed= (unsigned int)(9584640UL / temp);speed_catch_p = 0;}if(Speed >9999U) Speed=9999U;buf[0]=Speed/1000;buf[1]=(Speed/100)%10;buf[2]=(Speed/10)%10;buf[3]=Speed %10;DisplayOneChar(8, 1, ASCII[buf[0]]);DisplayOneChar(9, 1, ASCII[buf[1]]);DisplayOneChar(10, 1, ASCII[buf[2]]);DisplayOneChar(11, 1, ASCII[buf[3]]);DisplayOneChar(12, 1, 'm'); //显示MDisplayOneChar(13,1, 'm'); //显示MDisplayOneChar(14,1, '/');DisplayOneChar(15,1, 's');}}else{Counter_100ms=0;StartModule();// DisplayOneChar(0, 1, ASCII[0]);TH0=0;TL0=0;while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数Conut(); //计算}}}}}。

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

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

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

基于80C51单片机的智能坦克小车之循迹功能的简单使用说明

基于80C51单片机的智能坦克小车之循迹功能的简单使用说明

基于80C51单片机的智能坦克小车之循迹功能的简单使用说明标示:从左至右探头与对应指示灯分别取相对号1、2、3、4、5。

标示:当OUT1=0时发光二极管亮,起指示作用。

1.产品概况:基于80C51单片机的智能坦克小车,目前可实现循迹、避障、测速等功能。

2.产品性能特点:相对稳定,测速不太准确。

可工作于比较特殊的场合(理想情况下)如:搜救现场等。

3.产品使用方法:寻迹模块的传感器采用的是高发射功率红外电二极管和高灵敏度光电晶体管组成的红外对管TCRT5000构成的电路。

检测距离可调整的范围在4—13mm,采用的是非接触式的检测方法。

在小车的前面距地面一定距离安装红外对管传感器,小车在行驶在白色地面上时,红外发射管发射红外信号,经过白色地面反射后被接收管接受,一旦接收到信号,红外对管的输出端将输出低电平。

当传感器检测到黑线时,红外发射管发射出红外信号,红外信号被黑色吸收,将输出高电平。

将传感器检测到的输出信号送入到LM324比较器,将计较的输出信号送入到I/O口,判断小车轨迹的位置,来控制转动。

置于固定的环境(有粗黑线和挡板)中可沿黑线并躲避障碍物行走,在预设的跑道内能实现自我返回到正确的轨道上的功能。

为了更加精确的测量,制作团队成员建议每次重要测量前应首先检查设备本身的硬件的完好性。

首先取一黑色硬纸板逐一检测每个探头是否能正常工作,当黑色纸板至于每个探头下时其对应的LED灯亮,检测完毕五个都能正常工作,说明循迹模块正常,该坦克小车能正常完成循迹功能。

若以上工作完成后还不能正常工作,建议按下复位键重启一次后可否正常工作。

4.产品保养与维修:工作于常温常压比较稳定的室内外环境中,工作电压要求相对稳定。

若产品出现自己无法保证能解决的任何问题,强烈建议返厂维修,厂家保证不收取任何费用(三包期内)。

5.其它注意事项:该产品设计的初衷是用于实验室所用,故对产品本身的各项性能的要求不是很高。

在后续的试验及老师的提示下逐渐认识到其中的弊端,目前正在进一步完善中。

基于51的避障循迹重力感应遥控的智能小车设计(C语言)

基于51的避障循迹重力感应遥控的智能小车设计(C语言)

基于51的避障/循迹/重力感应遥控的智能小车设计1 绪论1.1 选题背景随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。

全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。

可见其研究意义很大。

本设计就是在这样的背景下提出的,指导教师已经有充分的准备。

本题目是结合科研项目而确定的设计类课题。

设计的智能电动小车应该能够实现适应能力,能自动避障,可以智能规划路径。

智能化作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。

同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进的遥控车还能控制器速度。

常见的模型小车,都属于这类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无需人工干预。

操作员可以通过修改智能小车的计算机程序来改变它的行驶方向。

因此,智能小车具有再编程的特性,是机器人的一种。

中国自1978年把“智能模拟”作为国家科学技术发展规划的主要研究课题,开始着力研究智能化。

从概念的引进到实验室研究的实现,再到现在高端领域(航天航空、军事、勘探等)的应用,这一过程为智能化的全面发展奠定基石。

智能化全面的发展是实现其对资源的合理充分利用,以尽可能少的投入得到最大的收益,大大提高工业生产的效率,实现现有工业生产水平从自动化向智能化升级,实现当今智能化发展由高端向大众普及。

从先前的模拟电路设计,到数字电路设计,再到现在的集成芯片的应用,各种能实现同样功能的元件越来越小为智能化产物的生成奠定了良好的物质基础。

智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体。

1.2 智能小车研究现状智能车辆作为智能交通系统的关键技术,是许多高新技术综合集成的载体。

基于某51单片机地自行车测速系统设计

基于某51单片机地自行车测速系统设计

摘要随着居民生活水平的不断提高,人们对于生活质量的要求也日益增加,尤其是对健身的要求。

自行车不再仅仅是普通的运输、代步的工具,而是成为人们娱乐、休闲、锻炼的首选。

自行车的速度里程表能够满足人们最根本的需求,让人们能清楚地知道当前的速度、里程等物理量。

而对于自行车运动员来说,最为关心的莫过于一段时间的训练效果。

因为教练要根据一段时间运动员的训练效果进展评估,从而进展适当的调整已使运动员达到最优的状态。

因此爱好自行车运动的人十分学要一款能测速的装置,以知道自己的运动情况。

并根据外界条件,如温度,风速等进展适当的调节,已达到最优运动的效果。

关键词:单片机、LED显示、里程/速度、霍尔元件第一章系统总方案分析与设计1.1 课题主要任务与容本课题主要任务是利用霍尔元件、单片机等部件设计一个可用LED数码管实时显示里程和速度的自行车的速度里程表。

本文主要介绍了自行车的速度里程表的设计思想、电路原理、方案论证以与元件的选择等容,整体上分为硬件局部设计和软件局部设计。

本文首先扼要对该课题的任务进展方案论证,包括硬件方案和软件方案的设计;继而具体介绍了自行车的速度里程表的硬件设计,包括传感器的选择、单片机的选择、显示电路的设计;然后阐述了该自行车的速度里程表的软件设计,包括数据处理子程序的设计、显示子程序的设计;最后对本次设计进展了系统的总结。

具体的硬件电路包括AT89C52单片机、霍尔元件以与LED显示电路等。

软件设计包括:中断子程序设计,里程计算子程序设计,显示子程序设计。

软件采用汇编语言编写,软件设计的思想主要是自顶向下,模块化设计,各个子模块逐一设计。

1.2 任务分析与实现本设计的任务是:以通用AT89C52单片机为处理核心,用传感器将车轮的转数转换为电脉冲,进展处理后送入单片机。

里程与速度的测量,是经过AT89C52的定时/计数器测出总的脉冲数和每转一圈的时间,再经过单片机的计算得出,其结果通过LED显示器显示出来。

单片机51测速程序

单片机51测速程序

//实例 100:电机转速表设计#include<reg51.h> // 包含单片机寄存器的头文件#include<intrins.h> //包含 _nop_() 函数定义的头文件sbit RS=P2A0; sbit RW=P2A1; sbit E=P2A2; II寄存器选择位,将 RS位定义为P2.0引脚〃读写选择位,将 RW位定义为P2.1引脚II使能信号位,将E位定义为P2.2引脚sbit BF=P0A7; II忙碌标志位,,将BF位定义为P0.7引脚unsigned char code digit[ ]={"0123456789"}; // 定义字符数组显示数字 un sig ned in t v;II储存电机转速unsigned char count; 〃储存定时器TO中断次数bit flag; //计满1秒钟标志位***************************************************函数功能:延时 1ms (3j+2)*i=(3 X 33+2) X 10=1010(微秒),可以认为是 1 毫秒***************************************************/ void delay1ms(){unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++)}I*****************************************************函数功能:延时若干毫秒入口参数: n***************************************************Ivoid delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}I*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
}
}。

相关文档
最新文档