视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
单片机课程设计超声波测距离
2025-09-26 04:16:21 责编:小OO
文档
湖南工程学院

课 程 设 计 任 务 书

课程名称    单片机原理与应用   

课    题    超声波测距系统设计  

专业班级     自动化0901班             

学生姓名           段志勤              

学    号        200901020130            

指导老师            李晓秀                   

审    批                                

任务书下达日期   2012    年  5   月   30  日

任务完成日期  2012   年  6   月   13  日

设计内容与设计要求

设计内容:

本课题要求以MCS-51系列单片机为核心,设计一个超声波测距系统。要求用按键控制超声波模块实现对障碍物距离的测量,并在LED显示器上显示测量到的距离。

设计要求:

1)确定系统设计方案;

            2)进行系统的硬件设计;

3)完成必要的参数计算与元器件选择;

4)完成应用程序设计;

5)应用程序的调试。

主 要 设 计 条 件

本课题以单片机为核心,设计并制作超声波测距系统,设计要求:

1. 用给定的超声波模块制作超声波测距系统,测距范围:0.5~4.5m ;

2. 用按键实现测距、清零、复位等控制;

3. 用4位LED数码管显示测量到的距离。 

说 明 书 格 式

1.课程设计任务书

2.目录

3.总体方案确定

4.各单元硬件电路设计说明及计算方法

5.软件设计与说明(包括流程图)

6.调试结果与必要的调试说明

7.使用说明

8.程序清单

10、总结

11、参考文献

附录

附录A    系统原理图

附录B    程序清单

进 度 安 排

设计时间为两周

第一周

星期一、上午:布置课题任务,讲课及课题介绍

        下午:借阅有关资料,总体方案讨论

星期二、单片机学习机焊接

星期三、单片机学习机例程调试

星期四、系统总体方案、硬件设计

星期五、软件设计及调试

第二周

星期一、软件设计及调试

星期二、软件设计及调试

星期三、软件设计及调试

星期四、写说明书

星期五、上午:写说明书,整理资料

下午:交设计资料,答辩

参 考 文 献

参考文献

(

序言…………………………………………………………6

第一章、总体设计原理……………………………………6

 1.1、超声波测距原理…………………………………6

 1.2、超声波测距系统框图……………………………8

 1.3、程序流程图………………………………………10

第二章、系统硬件设计……………………………………11

   2.1、超声波模块电路…………………………………11

   2.2、数码管显示电路…………………………………12

   2.3、单片机最小电路…………………………………12   2.4、键盘连接…………………………………………13

第三章、系统软件设计……………………………………14

3.1、主程序流程图……………………………………14

3.2、子程序设计………………………………………15

第4章、调试结果…………………………………………21

实验总结……………………………………………………23

参考文献……………………………………………………24

附录 A、整体电路图………………………………………25

附录B、程序清单………………………………………26

序言

    由于超生波测距是一种非接触检测技术,不受光线、被测对象颜色,较其他仪器更卫生,更耐潮湿、粉尘、高温、腐蚀等恶劣环境,具有少维护,不污染,高可靠,长寿命等特点。因此,超声波测距有着广泛的应用领域。利用超声波检测往往比较迅速,简单,计算方便,易于实现实时控制,并且在测量精度方面能达到工业使用要求。超声波测距主要应用于倒车雷达、建筑施工工地以及一些工业现场,例如:液位、井深、管道长度等场合。

第一章、总体设计原理

   本章主要介绍单片机超声波测距的主要原理,包括超声波测距的原理和STCC52单片机的原理

1.1、超声波测距原理

   谐振频率高于20kHz的声波被称为超声波。超声波为直线传播频率越高、绕射能力越弱、但反射能力越强。利用超声波的这种性能就可制成超声传感器、或称为超声换能器、它是一种既可以把电能转化为机械能、又可以把机械能转化为电能的器件或装置。换能器在电脉冲激励下可将电能转换为机械能、向外发送超声波、反之,当换能器处在接收状态时 它可将声能(机械能)转换为电能。

压电式超声波发生器实际上是利用压电晶体的谐振来工作的。超

声波发生器内部结构如图1-1所示,它有两个压电晶片和一个共振板。

当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,

压电晶片将会发生共振,并带动共振板振动,便产生超声波。反之 

如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电

晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。

图1-1、超声波换能器内部示意图

超声波发射器向某一方向发射超声波 在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停 止计时。超声波测距是通过不断检测超声波发射后遇到障碍物所反射的回波,从而测出发射和接收回波的时间差t,然后求出距离S=Ct/2,式中的C为超声波波速。

图1-2、超声波测距原理框图

    由于超声波也是一种声波,其声速C与温度有关,表1列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。声速确定后,只要测得超声波往返的时间,即可求得距离。这就是超声波测距仪的机理。其系统框图如图1-2所示。

表1 声速与温度关系表

温度(℃)

-30-20-100102030100
 

1.2、STCC52单片机原理

STCC52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STCC52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STCX52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

图1-3、STCC52引脚图

 

1.3、超声波测距系统框图

图1-4、超声波测距系统框图

第二章、系统硬件设计

硬件是一个机器的基础,没有硬件,所有机器都不存在,本章主要介绍单片机超声波测距的硬件原理。

2.1、超声波模块电路

图2-1、超声波模块电路

   

超声波模块如图2-1所示。从P2.6口给Trig口送一个10us的脉冲,超声波模块自动发出40Khz的超声波,单片机中断计时。当遇到障碍物时超声波返回,并将一个高平信号送入单片机,中断关闭。

2.2、数码管显示电路

图2-2、数码管显示电路

显示电路采用采用LED数码管显示。本系统采用动态显示方式。该组数码管位共阳极数码管。当有低电平驱动时,数码管亮。

2.3、单片机最小电路

图2-3、最小单片机电路

单片机最小电路是单片机能正常工作的最小外接电路单元。是设计电路的核心部分,也是整个作品最关键,最重要的部分。单片机最小电路包括:复位电路,晶振电路。

2.4、键盘连接

图2-4、矩阵键盘电路 

该矩阵键盘采用扫描式工作读入方式,扫描式键盘接口是一个输入输出接口,行是输入接口,而列式输出接口,输入接口主要功能是解决数据输入的缓冲问题,而列输出接口主要功能是进行数据保持能力。系统扫描键盘是若有键按下,则执行主程序相应程序,实现相应功能。

第三章、系统软件设计

   软件是一个机器的灵魂,没有软件,机器就是一堆废铁,所以软件是一个机器必不可少的部分,本章主要介绍单片机超声波测距的软件设计。

3.1、主程序流程图

图3-1、主程序流程图

3.2、子程序设计

3.2.1、延时程序

void DelayUs2x(unsigned char t)

            {   

            while(--t);

             }

             void DelayMs(unsigned char t)

{

     

    while(t--)

     {

     //大致延时1mS

     DelayUs2x(245);

     DelayUs2x(245);

      }

   }

3.2.2、键盘扫描程序

  void key_scanf(void)

 {

if(p10==0)

    {

      DelayMs(10);

      if(p10==0)

      a=1;

    }

if(p11==0)

{

     DelayMs(10);

      if(p11==0)

      a=0;

}

if(p12==0)

    {

      DelayMs(10);

      if(p12==0)

      {

      a=0;

      disbuff[0]=0;

      disbuff[1]=0;

      disbuff[2]=0;

      disbuff[3]=0;

          }

    }

 }

3.2.3、超声波模块驱动程序

void  zd3()  interrupt 3          //T1中断用来驱动超声波模块

  {     key_scanf();                   每800ms就发送一次超声波

     TH1=0xf8;                       这样就能进行连续多次测距

     TL1=0x30;

     timer++;

if(timer>=400)

     {

      timer=0;

      TX=1;                            //800MS  启动一次模块

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_();

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_();

TX=0;//给超声波模块发送端一个10us的高电平,就能发送40khz的超声波

     } 

  }

3.2.4、计算程序

  void Conut(void)

    {

    float S1;

     time=TH0*256+TL0;

     TH0=0;

     TL0=0;    

     S1=(time*1.7)/100;     //算出来是CM

     S=S1*10;

     if((S>=7000)||flag==1) //超出测量范围显示“-”

     {     

      flag=0;

      disbuff[0]=10;       //“-”

      disbuff[1]=10;       //“-”

      disbuff[2]=10;       //“-”

      disbuff[3]=10;       //“-”

     }

     else

     {

      disbuff[0]=S/1000;

      disbuff[1]=S/100%10;

      disbuff[2]=S/10%10;

      disbuff[3]=S%10;

     }

    }

3.2.5、数码管显示程序

  4位共阳数码管的驱动程序如下:

  void Display(void)                 //扫描数码管

     {

          p20=0;

          p21=1;

          p22=1;

          p23=1;

          P0=discode[disbuff[0]];//第1个数码管点亮

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p21=0;

          p22=1;

          p23=1;

          P0=discode[disbuff[1]];//第2个数码管点亮

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p22=0;

          p21=1;

          p23=1;

          P0=(discode[disbuff[2]])&0x7f;//第3个数码管点亮

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p23=0;

          p21=1;

          p22=1;

          P0=discode[disbuff[3]];//第4个数码管点亮

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p23=1;

          p21=1;

          p22=1;

          //DelayMs(2);//显示小数}

第四章、调试结果

按第二章和第三章的原理接好电路图,把程序下载进去,接下来我们就能看到结果了。如图4-1所示,其显示结果为20.6CM。

图4-1、LED显示结果

这个设计需要用到三个按键,键1、键2、键3。其中键1为开始键,键2为暂停键,键3为复位键。

先把单片机接好电源,按下键1就开始测距,距离显示在LED显示器上,按下键2就会把显示结果暂停,如图4-1所示。按下键3,显示器自动复位为0

实验总结

两周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。

课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.

通过这次课程设计,本人在多方面都有所提高。通过这次课程设计,综合运用本专业所学课程的理论和生产实际知识进行一次冷冲压模具设计工作的实际训练从而培养和提高学生工作能力,巩固与扩充了冷冲压模具设计等课程所学的内容,掌握冷冲压模具设计的方法和步骤,掌握冷冲压模具设计的基本的模具技能懂得了怎样分析零件的工艺性,怎样确定工艺方案,了解了模具的基本结构,提高了计算能力,绘图能力,熟悉了规范和标准,同时各科相关的课程都有了全面的复习,思考的能力也有了提高。

在这次设计过程中,体现出自己单独设计模具的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。

在此感谢我们的指导老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次模具设计的每个实验细节和每个数据,都离不开老师您的细心指导。而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。    

由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。

参考文献

单片机原理与应用(第2班)  王迎旭 主编  机械工业出版社

51单片机课程设计   周向红 主编  华中科技大学出版社 

附录 A 、整体电路图

附录 B、程序清单

#include

#include

             #define  RX  p26

             #define  TX  p27

             sbit p26=P2^6;

             sbit p27=P2^7;

             sbit p20=P2^0;

             sbit p21=P2^1;

             sbit p22=P2^2;

             sbit p23=P2^3;

             sbit p10=P1^0;

             sbit p11=P1^1;

             sbit p12=P1^2;

             unsigned int  time=0;

             unsigned int  timer=0;

             unsigned char posit=0,a=0;

             unsigned long S=0;

             bit      flag =0;

             unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};

             

             unsigned char disbuff[4]       ={ 0,0,0,0,};

             void key_scanf(void);

             void DelayUs2x(unsigned char t)

            {   

            while(--t);

             }

             void DelayMs(unsigned char t)

{

     

 while(t--)

 {

     //大致延时1mS

     DelayUs2x(245);

     DelayUs2x(245);

 }

 }

   void Display(void)                 //扫描数码管

     {

          p20=0;

          p21=1;

          p22=1;

          p23=1;

          P0=discode[disbuff[0]];

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p21=0;

          p22=1;

          p23=1;

          P0=discode[disbuff[1]];

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p22=0;

          p21=1;

          p23=1;

          P0=(discode[disbuff[2]])&0x7f;

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p23=0;

          p21=1;

          p22=1;

          P0=discode[disbuff[3]];

          DelayUs2x(20);

          P0=0xff;

          p20=1;

          p23=1;

          p21=1;

          p22=1;

          //DelayMs(2);

    }

    /********************************************************/

    void Conut(void)

    {

    float S1;

     time=TH0*256+TL0;

     TH0=0;

     TL0=0;

    

     S1=(time*1.7)/100;     //算出来是CM

     S=S1*10;

     if((S>=7000)||flag==1) //超出测量范围显示“-”

     {     

      flag=0;

      disbuff[0]=10;       //“-”

      disbuff[1]=10;       //“-”

      disbuff[2]=10;       //“-”

      disbuff[3]=10;       //“-”

     }

     else

     {

      disbuff[0]=S/1000;

      disbuff[1]=S/100%10;

      disbuff[2]=S/10%10;

      disbuff[3]=S%10;

     }

    }

/********************************************************/

     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围

  {

    flag=1;                             //中断溢出标志

  }

/********************************************************/

   void  zd3()  interrupt 3          //T1中断用来扫描数码管和计800MS启动模块

  {     key_scanf();

     TH1=0xf8;

     TL1=0x30;

     Display();

     timer++;

if(timer>=400)

     {

      timer=0;

      TX=1;                            //800MS  启动一次模块

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_();

      _nop_(); 

      _nop_(); 

      _nop_(); 

      _nop_();

      TX=0;

     } 

  }

/*********************************************************/

    void  main(  void  )

  {  

    TMOD=0x11;           //设T0为方式1,GATE=1;

    TH0=0;

    TL0=0;          

    TH1=0xf8;           //2MS定时

    TL1=0x30;

    ET0=1;             //允许T0中断

    ET1=1;               //允许T1中断

    TR1=1;               //开启定时器

    EA=1;               //开启总中断

    while(1)

    {

     while(!RX);        //当RX为零时等待

     TR0=1;                //开启计数

     while(RX);            //当RX为1计数并等待

     TR0=0;

     key_scanf();    

     if(a==1)            //关闭计数

     Conut();            //计算

    }

  }

 void key_scanf(void)

 {

if(p10==0)

    {

      DelayMs(10);

      if(p10==0)

      a=1;

    }

if(p11==0)

{

     DelayMs(10);

      if(p11==0)

      a=0;

}

if(p12==0)

    {

      DelayMs(10);

      if(p12==0)

      {

      a=0;

      disbuff[0]=0;

      disbuff[1]=0;

      disbuff[2]=0;

      disbuff[3]=0;

          }

    }

 }

电气与信息工程系课程设计评分表

项      目

评   价

及格
设计方案合理性与创造性(10%)

开发板焊接及其调试完成情(10%)

硬件设计或软件编程完成情(20%)

硬件测试或软件调试结果*(10%)

设计说明书质量(20%)

答辩情况(10%)

完成任务情况(10%)

工作能力(10%)

出勤情况(10%)

综 合 评 分

                           

指导教师签名:________________

                              日        期:________________  

注:表中标*号项目是硬件制作或软件编程类课题必填内容;此表装订在课程设计说明书的最后一页。课程设计说明书装订顺序:封面、任务书、目录、正文、评分表、附件(非16K大小的图纸及程序清单)。  下载本文

显示全文
专题