自学内容网 自学内容网

基于AT89C51单片机超声波水位液位控制系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。

目录

设计任务与要求

原理图

仿真图

代码

系统论文

资源下载


设计任务与要求

设计一超声波测距仪,任务:

  1. 了解超声波测距原理。
  2. 根据超声波测距原理,设计超声波测距器的硬件结构电路。

设计一超声波测距仪,要求:

  1. 设计出超声波测距仪的硬件结构电路。
  2. 对设计的电路进行分析能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离。
  3. 对设计的电路进行分析。
  4. 以数字的形式显示测量距离。

原理图


仿真图


代码(部分)


#include <REG2051.H>
#define k1 P3_4
#define csbout    P3_5                  //超声波发送
#define csbint    P3_7                  //超声波接收
#define csbc=0.034
#define bg  P3_3 
unsigned char csbds,opto,digit,buffer[3],xm1,xm2,xm0,key,jpjs;//显示标识
unsigned char convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
unsigned int s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
bit cl;      
                             
void csbcj();
void delay(j);                              //延时函数
void scanLED();                              //显示函数
void timeToBuffer();                  //显示转换函数
void keyscan();
void k1cl();
void k2cl();
void k3cl();
void k4cl();
void offmsd();

void main()                              //主函数
{
     EA=1;                                //开中断
       TMOD=0x11;                   //设定时器0为计数,设定时器1定时
     ET0=1;                              //定时器0中断允许 
     ET1=1;                              //定时器1中断允许 
     TH0=0x00;
     TL0=0x00;
     TH1=0x9E;
     TL1=0x57;
     csbds=0;
     csbint=1;
     csbout=1;
     cl=0;
     ōpto=0xff;
     jpjs=0;
     sj1=45;
     sj2=200;
     sj3=400;
     k4cl();
     TR1=1;                        
     while(1)
       {
           keyscan();
           if(jpjs<1)
           {
           csbcj();
           if(s>sj3)
           {
           buffer[2]=0x76;      
           buffer[1]=0x76;      
           buffer[0]=0x76;      
           }
           else if(s<sj1)
           {
           buffer[2]=0x40;     
           buffer[1]=0x40;      
           buffer[0]=0x40;
           }
           else timeToBuffer();      
           }
           else timeToBuffer();            //将值转换成LED段码
           offmsd();
             scanLED();                  //显示函数
           if(s<sj2)
           bg=0;
           bg=1;
     }
}

void scanLED()                       //显示功能模块
{
digit=0x04;
    for( i=0; i<3; i++)        //3位数显示
    {
        P3=~digit&opto;        //依次显示各位数
        P1=~buffer;        //显示数据送P1口
        delay(20);              //延时处理
        P1=0xff;             //P1口置高电平(关闭)
        if((P3&0x10)==0)      //判断3位是否显示完
           key=0;
        digit>>=1;             //循环右移1位
    }
}
void timeToBuffer()                //转换段码功能模块
{
     xm0=s/100;      
     xm1=(s-100*xm0)/10;
     xm2=s-100*xm0-10*xm1;
     buffer[2]=convert[xm2];      
     buffer[1]=convert[xm1];
     buffer[0]=convert[xm0];
}
void delay(i)                              
{
while(--i);
}
void timer1int (void)  interrupt 3  using 2 
{
     TH1=0x9E;
     TL1=0x57;
     csbds++;
     if(csbds>=40)
     {
           csbds=0;
           cl=1;
     }            
}
void csbcj()
{
     if(cl==1)
     {
               TR1=0;
           TH0=0x00;
           TL0=0x00;
           i=10;
           while(i--)
           {
                 csbout=!csbout;
           }
           TR0=1;                 
               i=mqs;                              //盲区
           while(i--)
           {
           }
           i=0;
           while(csbint)
           {
                 i++;
                 if(i>=2450)                  //上限值
                 csbint=0;
           }
           TR0=0;
           TH1=0x9E;
           TL1=0x57;
           t=TH0;
           t=t*256+TL0;
           s=t*csbc/2;
           TR1=1;
           cl=0;
     }
}
void keyscan()                        //健盘处理函数
{
     xx=0;
     if(k1!=1)                              // 判断开关是否按下
     {
           delay(400);                        //延时去抖动
           if(k1!=1)                              // 判断开关是否按下     
           {            
           while(!k1)
           {
                 delay(30);    
                 xx++;
           }
           if(xx>2000)           
           {
                 jpjs++;
                 if(jpjs>4)
                 jpjs=0;
           }
           xx=0;
           switch(jpjs)
           {
           case 1: k1cl();break;         
           case 2: k2cl();break;
           case 3: k3cl();break;
           case 4: k4cl();break;
           }
           }
     }
}
     

系统论文


摘  要

随着科技的发展,人们生活水平的提高,城市发展建设加快,城市给排水系统也有较大发展,其状况不断改善。但是,由于历史原因合成时间住的许多不可预见因素,城市给排水系统,特别是排水系统往往落后于城市建设。因此,经常出现开挖已经建设好的建筑设施来改造排水系统的现象。城市污水给人们带来了困扰,因此箱涵的排污疏通对大城市给排水系统污水处理,人们生活舒适显得非常重要。而设计研制箱涵排水疏通移动机器人的自动控制系统,保证机器人在箱涵中自由排污疏通,是箱涵排污疏通机器人的设计研制的核心部分。控制系统核心部分就是超声波测距仪的研制。因此,设计好的超声波测距仪就显得非常重要了。

本设计采用以AT89C51单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路和软件设计方法。整个电路采用模块化设计,由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。各探头的信号经单片机综合分析处理,实现超声波测距仪的各种功能。在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。相关部分附有硬件电路图、程序流程图。

经实验证明,这套系统软硬件设计合理、抗干扰能力强、实时性良好,经过系统扩展和升级,可以有效地解决汽车倒车、建筑施工工地以及一些工业现场的位置监控。

关键词:AT89c51; 超声波测距

Abstract

With the development of science and technology, the improvement of people's standard of living, speeding up the development and construction of the city. urban drainage system have greatly developed their situation is constantly improving. However, due to historical reasons many unpredictable factors in the synthesis of her time, the city drainage system. In particular drainage system often lags behind urban construction. Therefore, there are often good building excavation has been building facilities to upgrade the drainage system phenomenon. It brought to the city sewage, and it is clear to the city sewage and drainage culvert in the sewage treatment system. comfort is very important to people's lives. Mobile robots designed to clear the drainage culvert and the automatic control system Free sewage culvert clear guarantee robot, the robot is designed to clear the culvert sewage to the core. Control System is the core component of the development of ultrasonic range finder. Therefore, it is very important to design a good ultrasonic range finder.   

At the core of the design using AT89C51 low-cost, high accuracy, Micro figures show that the ultrasonic range finder hardware and software design methods. Modular design of the whole circuit from the main program, pre subroutine fired subroutine receive subroutine. display subroutine modules form. SCM comprehensive analysis of the probe signal processing, and the ultrasonic range finder function. On the basis of the overall system design, hardware and software by the end of each module. 

The research has led to the discovery that the software and hardware designing is justified, the anti-disturbance competence is powerful and the real-time capability is satisfactory and by extension and upgrade, this system can resolve the problem of the car availably, building construction the position of the workplace and some industries spot supervision.

Key words:AT89S52; Silent Wave;Measure Distance 

3  系统软件的设计

超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。 

3.1 超声波测距仪的算法设计 [10]
      超声波测距的原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。距离的计算公式为: 
 d=s/2=(c×t)/2                                                     (1)  
其中,d为被测物与测距仪的距离,s为声波的来回的路程,c为声速,t为声波来回所用的时间。 在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。其部分源程序如下:

RECEIVE0PUSH PSW

PUSH ACC

CLR EX0 ;关外部中断0

? MOV R7, TH0 ;读取时间值 

MOV R6, TL0?

CLR C

MOV A, R6

SUBB A, #0BBH;计算时间差 

MOV 31H, A ;存储结果 

MOV A, R7

SUBB A, #3CH

MOV 30H, A?

SETB EX0 ;开外部中断0

POP ACC?

POP PSW

RETI


3.2 主程序流程图

软件分为两部分,主程序和中断服务程序,如图3-1(a)(b) (c) 所示。主程序完成初始化工作、各路超声波发射和接收顺序的控制。

定时中断服务子程序完成三方向超声波的轮流发射,外部中断服务子程序主要完成时间值的读取、距离计算、结果的输出等工作。

主程序首先是对系统环境初始化,设置定时器T0工作模式为16位定时计数器模式。置位总中断允许位EA并给显示端口P0和P1清0。然后调用超声波发生子程序送出一个超声波脉冲,为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1 ms(这也就是超声波测距仪会有一个最小可测距离的原因)后,才打开外中断0接收返回的超声波信号。由于采用的是12 MHz的晶 振,计数器每计一个数就是1μs,当主程序检测到接收成功的标志位后,将计数器T0中的数(即超声波来回所用的时间)按式(2)计算,即可得被测物体与测距仪之间的距离,设计时取20℃时的声速为344 m/s则有:d=(c×t)/2=172T0/10000cm(2) 其中,T0为计数器T0的计算值。测出距离后结果将以十进制BCD码方式送往LED显示约0.5s,然后再发超声波脉冲重复测量过程。为了有利于程序结构化和容易计算出距离,主程序采用C语言编写。                              

3.3超声波发生子程序和超声波接收中断程序  
 

超声波发生子程序的作用是通过P1.0端口发送2个左右超声波脉冲信号(频率约40kHz的方波),脉冲宽度为12μs左右,同时把计数器T0打开进行计时。超声波发生子程序较简单,但要求程序运行准确,所以采用汇编语言编程。 
      超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。 前方测距电路的输出端接单片机INT0端口,中断优先级最高,左、右测距电路的输出通过与门IC3A的输出接单片机INT1端口,同时单片机P1.3和P1.4接到IC3A的输入端,中断源的识别由程序查询来处理,中断优先级为先右后左。部分源程序如下:

receive1:push psw

push acc

clr ex1 ;关外部中断1

jnb p1.1, right ;P1.1引脚为0,转至右测距电路中断服务程序

jnb p1.2, left ;P1.2引脚为0,转至左测距电路中断服务程序

return:SETB EX1;开外部中断1

pop? acc

pop? psw

reti

right: ...? ;右测距电路中断服务程序入口

? ajmp? return

left:... ;左测距电路中断服务程序入口

? ajmp? return

3.4 系统的软硬件的调试[11]

超声波测距仪的制作和调试都比较简单,其中超声波发射和接收采用Φ15的超声波换能器TCT40-10F1(T发射)和TCT40-10S1(R接收),中心频率为40kHz,安装时应保持两换能器中心轴线平行并相距4~8cm,其余元件无特殊要求。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容C0的大小,以获得合适的接收灵敏度和抗干扰能力。 
        硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。根据实际情况可以修改超声波发生子程序每次发送的脉冲宽度和两次测量的间隔时间,以适应不同距离的测量需要。根据所设计的电路参数和程序,测距仪能测的范围为0.07~5.5m,测距仪最大误差不超过1cm。系统调试完后应对测量误差和重复一致性进行多次实验分析,不断优化系统使其达到实际使用的测量要求。


资源下载


如果有需要这个系统的源码、仿真、论文等资源的可以私信我。感谢你的阅读~


原文地址:https://blog.csdn.net/m0_56379011/article/details/140388551

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!