找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3125|回复: 3
打印 上一主题 下一主题
收起左侧

基于51单片机超声波三方向测距系统设计资料(源码+视频+仿真)

[复制链接]
跳转到指定楼层
楼主
二、功能说明
1、采用三个超声波测距,速度快,精度高,精度1毫米。
2、按键设置设置报警距离,上限和下限。
3、LCD1602液晶显示。
4、结构简洁,稳固,高效。
本系统采用USB电源供电,提供电源线,可以插到电脑、手机充电器、充电宝上供电,十分方便。
三、按键说明
系统三个按键,从左往右风别是,设置切换、加、减。

视频演示:


制作出来的实物图如下:


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)



元件清单:


单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. #include "STCEEPROM.h"
  5. sbit  RX1 = P3^4;
  6. sbit  RX2 = P3^5;
  7. sbit  RX3 = P3^6;
  8. sbit  TX = P3^7;

  9. sbit LED = P2^1;
  10. sbit SPEAK = P2^0;

  11. sbit KEY1 = P1^3;
  12. sbit KEY2 = P1^4;
  13. sbit KEY3 = P1^5;

  14. unsigned int  time=0;
  15. unsigned int  timer=0;
  16. unsigned int S=0,S1=0,S2=0,S3=0;
  17. unsigned int SET_H=100,SET_L=10;
  18. bit      flag =0;
  19. unsigned char Table[3]={0};
  20. unsigned char KEY_flag=0;
  21. //延时函数
  22. void Delay_ms(int jj)
  23. {
  24.         int ii;
  25.         while(jj--)
  26.                 for(ii=0;ii<116;ii++);
  27. }
  28. void Conut(void)
  29. {
  30.          time=TH0*256+TL0;
  31.          TH0=0;
  32.          TL0=0;
  33.        
  34.          S=(time*1.87)/100;     //算出来是CM
  35.          if((S>=700)||flag==1) //超出测量范围显示“-”
  36.          {         
  37.           flag=0;
  38.          }
  39. }
  40. void main(void)
  41. {
  42.     LCD1602_init();//液晶初始化
  43.         //////////////////////0123456789ABCDEF
  44.     LCD1602_Disp_ZF(0x80,"    :     :     ",16);
  45.                                                      //0123456789ABCDEF
  46.     LCD1602_Disp_ZF(0x80+0X40,"Set H:    L:    ",16);
  47.         TMOD=0x11;                   //设T0为方式1,GATE=1;
  48.         TH0=0;
  49.         TL0=0;         
  50.         TH1=0xf8;                   //2MS定时
  51.         TL1=0x30;
  52.         ET0=1;             //允许T0中断
  53.         ET1=1;                           //允许T1中断
  54.         TR1=1;                           //开启定时器
  55.         EA=1;                           //开启总中断
  56.         EA=0;
  57.         SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
  58.         SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
  59.         EA=1;
  60.         while(1)
  61.         {
  62.                 while(!RX1);                    //当RX为零时等待
  63.                 TR0=1;                            //开启计数
  64.                 while(RX1);                        //当RX为1计数并等待
  65.                 TR0=0;                                //关闭计数
  66.                 Conut();
  67.                 S1=S;
  68.                 Delay_ms(10);
  69.                 /////////////////////////////
  70.                 while(!RX2);                    //当RX为零时等待
  71.                 TR0=1;                            //开启计数
  72.                 while(RX2);                        //当RX为1计数并等待
  73.                 TR0=0;                                //关闭计数
  74.                 Conut();
  75.                 S2=S;
  76.                 Delay_ms(10);
  77.                 /////////////////////////////
  78.                 while(!RX3);                    //当RX为零时等待
  79.                 TR0=1;                            //开启计数
  80.                 while(RX3);                        //当RX为1计数并等待
  81.                 TR0=0;                                //关闭计数
  82.                 Conut();
  83.                 S3=S;
  84.                 Delay_ms(10);
  85.                 /////////////////////////////////////
  86.                 Table[0]= S1/100+0X30;
  87.                 Table[1]= S1%100/10+0X30;
  88.                 Table[2]= S1%10+0X30;
  89.                 LCD1602_Disp_ZF(0x80,Table,3);
  90.                 Table[0]= S2/100+0X30;
  91.                 Table[1]= S2%100/10+0X30;
  92.                 Table[2]= S2%10+0X30;
  93.                 LCD1602_Disp_ZF(0x86,Table,3);
  94.                 Table[0]= S3/100+0X30;
  95.                 Table[1]= S3%100/10+0X30;
  96.                 Table[2]= S3%10+0X30;
  97.                 LCD1602_Disp_ZF(0x8C,Table,3);
  98.                 /////////////////////////////////
  99.                 if((S1>SET_H||S1<SET_L)||(S2>SET_H||S2<SET_L)||(S3>SET_H||S3<SET_L))
  100.                         P2 = 0X00;
  101.                 else
  102.                         P2 = 0XFF;               
  103.                 if(!KEY1)
  104.                 {
  105.                         Delay_ms(10);
  106.                         if(!KEY1)
  107.                         {
  108.                                 KEY_flag++;       
  109.                                 ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区       
  110.                                 ISP_PROGRAM(0x2c00, SET_H/256);
  111.                                 ISP_PROGRAM(0x2c01, SET_H);
  112.                                 ISP_PROGRAM(0x2c02, SET_L/256);
  113.                                 ISP_PROGRAM(0x2c03, SET_L);
  114.                         }
  115.                         while(!KEY1);
  116.                 }
  117.                 if(!KEY2)
  118.                 {
  119.                         Delay_ms(10);
  120.                         if(!KEY2)
  121.                         {
  122.                                 if(KEY_flag%2==0)SET_H++;
  123.                                 if(KEY_flag%2==1)SET_L++;
  124.                         }
  125.                 }
  126.                 if(!KEY3)
  127.                 {
  128.                         Delay_ms(10);
  129.                         if(!KEY3)
  130.                         {
  131.                                 if(KEY_flag%2==0)SET_H--;
  132.                                 if(KEY_flag%2==1)SET_L--;
  133.                         }
  134.                 }
  135.           Table[0]= SET_H/100+0X30;
  136.           Table[1]= SET_H%100/10+0X30;
  137.           Table[2]= SET_H%10+0X30;
  138.           LCD1602_Disp_ZF(0x86+0x40,Table,3);
  139.           Table[0]= SET_L/100+0X30;
  140.           Table[1]= SET_L%100/10+0X30;
  141.           Table[2]= SET_L%10+0X30;
  142.           LCD1602_Disp_ZF(0x8C+0x40,Table,3);
  143.         }
  144. }

  145. /********************************************************/
  146.      void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  147.   {
  148.     flag=1;                                                         //中断溢出标志
  149.   }
  150. /********************************************************/
  151.    void  zd3()  interrupt 3        
  152.   {
  153.          TH1=0xf8;
  154.          TL1=0x30;
  155.          timer++;
  156.          if(timer>=100)
  157.          {
  158.           timer=0;
  159.           TX=1;                                        //200MS  启动一次模块
  160.           _nop_(); _nop_(); _nop_();
  161.           _nop_(); _nop_(); _nop_();
  162.           _nop_(); _nop_(); _nop_();
  163.           _nop_(); _nop_(); _nop_();
  164.           _nop_(); _nop_(); _nop_();
  165.           _nop_(); _nop_();_nop_();
  166.           _nop_(); _nop_(); _nop_();
  167.           TX=0;
  168.          }
  169.   }
复制代码

所有资料51hei提供下载:
66-基于51单片机超声波三方向测距系统LCD1602资料 (1).rar (7.63 MB, 下载次数: 103)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:500491 发表于 2019-4-2 11:06 | 只看该作者
proteus仿真图是不是少一部分啊,为什么自己照着你的画,仿真的不对啊
回复

使用道具 举报

板凳
ID:720711 发表于 2020-4-18 15:30 | 只看该作者
为社么LCD上没有显示数值
回复

使用道具 举报

地板
ID:720711 发表于 2020-4-18 15:58 | 只看该作者
御梵梵 发表于 2019-4-2 11:06
proteus仿真图是不是少一部分啊,为什么自己照着你的画,仿真的不对啊

仿真图是测水位的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表