基于89c51单片机的循迹小车设计报告

时间:2024.3.19

基于89c51单片机的循迹小车设计报告


摘  要

本文介绍了基于at89c51单片机的智能小车的设计与实现。小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以 AT89c51 单片机为系统控制处理器;采用红外对管获取赛道的信息;通过数字PID控制策略和PWM控制技术来对小车的方向和速度进行控制。本文介绍了小车硬件和软件系统的设计过程。

                                                                                                       


目  录

摘  要... 2

第一章   引言... 2

1.1 设计目的... 2

1.2 设计方案介绍... 2

1.3 技术报告内容安排... 2

第二章  技术方案概要说明... 3

第三章 硬件电路的设计... 4

3.1 单片机最小系统... 4

3.2  传感器电路... 4

3.3  电源电路设计... 5

3.4  舵机及电机驱动电路设计... 5

第四章 软件系统的实现... 6

4.1主程序设计... 6

4.2  程序思路... 6

第五章  结论... 7

附录:源程序主代码... 8


第一章   引言

1.1 设计目的

通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。

1.2 设计方案介绍

  该智能车采用红外对管方案进行道路检测,单片机根据采集到的红外对管的不同状态判断小车当前状态,通过pid控制发出控制命令,控制舵机和电机的工作状态以实现对小车姿态的控制。

1.3 技术报告内容安排

本技术报告主要分为三个部分。第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术方案的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。


第二章  技术方案概要说明

本模型车的电路系统包括电源管理模块、单片机模块、传感器模块、电机驱动模块、舵机控制模块。

在整个系统中,由电源管理模块实现对其他各模块的电源管理。其中,对单片机、光电管、舵机提供5V电压,对电机提供6V电压。

路径识别电路由8对光电发送与接收管组成。由于路面存在黑色引导线,落在黑线区域内的光电接收管接收到反射的光线的强度与白色的路面不同,进而在光电接收管两端产生不同的电压值,由此判断路线的走向。传感器模块将当前采集到的一组电压值传递给单片机,进而根据一定得算法对舵机进行控制,使小车自动寻线行走。

   单片机模块是智能车的核心部分,主要完成对外围各个模块的管理,实现对外围模块的信号发送,以及对传感器模块的信号采集,并根据软件算法对所采集的信号进行处理,发送信号给执行模块进行任务执行,还对各种突发事件进行监控和处理,保证整个系统的正常运作。

    舵机控制模块则根据检测情况经单片机处理后发出相应的PWM波对舵机进行转向的控制。

  电机驱动模块采用H桥驱动,通过PWM 波对电机进行控制,以实现对小车速度的调节。


第三章 硬件电路的设计

3.1 单片机最小系统

小车采用atmel公司的at89c51单片机作为控制芯片,如图是其最小系统电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:

1、时钟电路:给单片机提供一个外接的16MHz的石英晶振。

2、电源电路:给单片机提供5V电源。

3、复位电路:在电压达到正常值时给单片机一个复位信号。

单片机控制系统原理图

3.2  传感器电路

光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。

3-2赛道检测原理图:

3.3  电源电路设计

模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。

3.4  舵机及电机驱动电路设计

  舵机的驱动电路比较简单,电源直接由电池组提供,其输入信号为单片机输出的pwm波。

本系统使用的电机驱动板为一个由分立元件制作的直流电动机可逆双极型桥式驱动器,其功率元件由四支N沟道功率MOSFET管组成,由此电路,通过设置51输出的PWM波的占空比可以达到控制电机转速的效果。

3-3 H桥驱动电路


第四章 软件系统的实现

4.1主程序设计

单片机系统需要接收路径识别电路的信号,采用某种路径搜索算法进行寻线判断,进而控制舵机和直流驱动电机的工作。小车系统的软件使用C语言实现。

主体控制框架:

模型车采用的控制方法是根据传感器采集到的路况信息,通过计算得到具体的方向偏移量和速度,控制小车的行走状态。

 

4.2  程序思路

  智能车利用了一字形排布的5个传感器来探测道路,并将每个传感器采集到的信息转换成了数字电平。因此5个传感器的数据正好构成一个字节,由单片机P2口读入。

  由于读入的数据并不方便直接参与控制计算,因此先将该数据集分成16类,分别对应于小车不同的位置信息,由0-15表示,其中0表示引导线位于小车最左侧,7表示引导线位于小车中部,14表示引导线位于小车最右侧,15表示未检测到引导线或其他错误情况。

  将上面的转换后的数据作为控制计算的反馈输入,与7相减即得到小车偏差信息,然后通过增量型pid算法计算出舵机的控制信息。

  将小车偏差信息的微分作为速度pid的输入,依然通过增量型pid算法得到电机的控制信息。至此小车完成一次控制周期。

  由于at89s51单片机没有PWM模块,因此需要通过通用I/O口进行模拟来输出舵机和电机所需的PWM波。

  可以分别使用一个定时器来作为一路PWM波的计时器。先将I/O口置位,设定高电平时间及定时器的初值,当定时器产生中断时,再将I/O口清零,并设定低电平时间,由此循环即可产生PWM波。其中,高电平时间有控制计算得出,低电平时间有PWM周期减去高电平时间得到。


第五章  结论

  本设计主要用到了单片机的通用IO口的读写,定时器,中断等基本功能,通过实际操作进一步掌握了51单片机的使用。同时,通过单片机外围电路的设计,更深入学习了51单片机在嵌入式系统中的应用。通过实际焊接电路,编写程序,也进一步提高了我的动手能力以及分析解决错误的能力,是我能够更好的将所学知识应用到实际中来。

  本系统能够基本满足设计要求,能够较快较平稳的是小车沿引导线行驶,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。


附录:源程序主代码

#include <reg52.h>

#include <intrins.h>

#include <math.h>

#define uchar unsigned char                        

#define uint unsigned int

#define MIDDLE 1390      //舵机中心位置

#define LEFT 1600              

#define RIGHT 1000

#define T 20000

#define HIGH 7300                        //电机基准速度

sbit rudder=P1^0;                                         //定义舵机PWM波输出端口为P1.0口

sbit pulse=P1^1;                                       //定义后轮PWM波输出端口为P1.1口

char flag1=0,flag2=0;                                 //定义全局变量(flag1用于控制舵机//PWM标志位,flag2用于控制电机PWM)

uint b=0,a=0;                                             //b用来装载电机所需的高电平时间,a用于保存电机所需高电平时间

void main()

{

uchar receive,ek[4]={7,7,7,7};

uint pidr=0;

uint pidlr=0;

uint ppid=0;

IE=0x8a;

TMOD=0x11; 

TH0=0x00;

TL0=0x00;

TR0=1;

TH1=0x00;

TL1=0x00;

TR1=1;

while(1)

{   receive=P2;                                             //采集光电传感器的值

/*--------------switch----------------*/

       switch(receive)                                         //根据采集到的值进行判断

       {

       case 0x7f:ek[3]=0;break;                          //0111 1111  最左边(或右边)1个光电传感器检测到黑线

       case 0x3f:ek[3]=1;break;                          //0011 1111  最左边(或右边)2个光电传感器检测到黑线

       case 0xbf:ek[3]=2;break;                          //1011 1111  依次类推

       case 0x9f:ek[3]=3;break;                          //1001 1111

       case 0xdf:ek[3]=4;break;                         //1101 1111

       case 0xcf:ek[3]=5;break;                          //1100 1111

       case 0xef:ek[3]=6;break;                          //1110 1111

       case 0xe7:ek[3]=7;break;                         //1110 0111

       case 0xf7:ek[3]=8;break;                          //1111 0111

       case 0xf3:ek[3]=9;break;                          //1111 0011

       case 0xfb:ek[3]=10;break;                 //1111 1011

       case 0xf9:ek[3]=11;break;                        //1111 1001

       case 0xfd:ek[3]=12;break;                //1111 1101

       case 0xfc:ek[3]=13;break;                        //1111 1100

       case 0xfe:ek[3]=14;break;                        //1111 1110

default:  ek[3]=15;break;                          //1111 1111  没有检测到黑线(是需要保持上一次测量值的)

       }

/*--------------switch----------------*/

       if(ek[3]= =15)

           {pidr = pidlr;

              }

       else

       {pidr=0.2*pidlr+0.8*(23*(ek[3]-7)+2*(ek[3]+ek[2]+ek[1]+ek[0]-28)+7*(ek[3]-ek[2]));

if(ek[2]!=ek[3])

ppid=-160*(cabs(ek[3]-7))+220*(cabs(ek[1]-7)-cabs(ek[3]-7));

       }

    a=HIGH+ppid;     //a是电机高电平时间

b=pidr+MIDDLE;   //b就是舵机PWM波高电平时间

    if(b>LEFT)

        b=LEFT;

    if(b<RIGHT)

        b=RIGHT;

   

 {char i;

      for(i=0;i<3;i++)

         ek[i]=ek[i+1];

     }        

     pidlr=pidr;

}

}

void zhongduan_t0(void) interrupt 1              //产生舵机PWM波中断子程序(T0中断)

{

if(flag1==0)

{    

TH0=(uchar)((65536-b)/256);                      

TL0=(uchar)((65536-b)%256);

flag1=1;

rudder=1;                                            

}

else

{

TH0=(uchar)((38869+b)/256);           

TL0=(uchar)((38869+b)%256);

flag1=0;

rudder=0;                

}

}

void zhongduan_t1(void) interrupt 3

{

 if(flag2==0)

    {

     TH1=(uchar)((65536-HIGH)/256);

        TL1=(uchar)((65536-HIGH)%256);

        flag2=1;

        pulse=0;

       }

 else

    {

        TH1=(65536-T+HIGH)/256;

        TL1=(65536-T+HIGH)%256;

        flag2=0;

        pulse=1;

       }

}

更多相关推荐:
基于51单片机课程设计报告

课题:基于51单片机的数字温度计设计专业:电气工程及其自动化班级:4学号:***设计日期:20XX/6/3成绩:重庆大学城市科技学院电气学院基于51单片机数字温度计设计报告一、设计目的作用本设计是一款简单实用的…

51单片机课程设计实验报告

51单片机课程设计报告学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机学习板2.要求:(1)了解并能识别学习板上的各种元器件,会读元器件标示;(2)会…

51单片机电子时钟课程设计报告

JINGCHUUNIVERSITYOFTECHNOLOGY单片机原理及应用课程设计报告题目电子时钟专业电气工程及其自动化班级20xx级电工2班学号20xx401020xx2姓名王贞指导教师邹云峰提交日期20xx...

51单片机课程设计报告

重庆科技学院学生实习实训总结报告学院电气与信息工程学院专业班级XXXXXX学生姓名XXX学号20xxXXXXXX实习实训地点逸夫科技楼I512报告题目单片机万年历系统设报告报告日期20xx年9月13日指导教师评...

51单片机课程设计报告。

成绩单片机原理及应用课程设计课程名ltlt单片机原理及应用gtgt学部专业学号姓名指导教师日期20xx年06月一设计任务与要求1任务制作并调试51单片机学习板2要求1了解并能识别学习板上的各种元器件会读元器件标...

51单片机课程设计实例

51单片机实做课课程设计报告51单片机设计实例二总原理图及元器件清单21总原理图151单片机实做课课程设计报告22显示部分23声音部分251单片机实做课课程设计报告24按键部分25继电器351单片机实做课课程设...

51单片机万年历课程设计报告

一设计任务1设计任务设计并制作一个数字钟2设计要求显示年月日时分秒及星期信息具有可调整日期和时间功能增加闰年计算功能显示部分由LCD1602完成二方案论证1显示部分显示部分是本次设计的重要部分一般有以下两种方案...

单片机课程设计报告(系统设计部分)

自动化学院网络工程系网络信息08级班单片机课程设计报告指导教师何小敏李传芳姓名学号系统设计部分四单片机应用系统设计数字电子时钟1系统功能介绍该设计以51单片机为核心附加了必要的外围电路构成了一个简单的数字电子钟...

《单片机原理及应用》课程设计报告

吉林建筑工程学院电气与电子信息工程学院单片机原理及应用课程设计报告设计题目电子计时器综合系统设计专业班级电子信息科学与技术092学生姓名学号指导教师设计时间20xx82720xx97目录第1章绪论111课程设计...

郭琛的51单片机课程设计报告

51单片机课程设计报告专业班级通信1001姓名指导教师徐敏设计时间20xx613目录1设计任务及要求2总原理图及元器件清单3设计思路4软硬件调试5实验心得51单片机课程设计一设计任务与要求1任务制作并调试51单...

(模板)51单片机课程结课设计报告

单片机技术课程结课设计报告题目电子时钟专业班级学号姓名指导教师张琦单片机技术课程结课设计报告第一部分设计任务和要求11设计内容利用STC89C51单片机和LCD1602电子显示屏实现电子时钟可由按键进行调时和1...

基于51单片机洗衣机课程设计报告

单片机原理及系统课程设计专业自动控制班级控1102姓名学号指导教师兰州交通大学自动化与电气工程学院20xx年1月13日单片机原理及系统课程设计报告基于51单片机的洗衣机设计1设计目的要求及原理11设计目的由单片...

51单片机课程设计报告(36篇)