找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机超声波测距倒车雷达Proteus仿真+源代码

  [复制链接]
跳转到指定楼层
楼主
1) 基本任务
(1) 当车距(HC-SR04 超声波测距的位置)离障碍物小于 1 米,报警器响起, 发出一定
频率的“滴滴” 声音, 报警指示灯闪烁。
(2) LCD1602 液晶屏显示超声波模块安装位置与障碍物之间的距离。
2) 扩展任务:
(1) 随着车距与障碍物的距离的缩小,报警器声音越来越尖锐急促(声音频率越来越高)。
(2) 随着车距与障碍物的距离的缩小, 报警指示灯闪烁频率增加。
(3) 按键调整报警门限距离, 当车距离障碍物小于该值(默认值为 1 米),声音报警。
(4) LCD1602 第一行显示超声波模块安装位置与障碍物之间的距离;第二行实时显示按
键所调整的报警门限距离。  

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

倒车雷达的单片机源程序如下:
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include "LCD.H"
  4. #include "delay.h"
  5. #define  uint unsigned int
  6. #define  uchar unsigned char        
  7.         
  8. //定义引脚
  9. sbit k1=P3^5;
  10. sbit k2=P3^6;
  11. sbit Trig=P2^5;   //trig 发射脉冲
  12. sbit Echo=P3^2;  //echo 接受脉冲
  13. sbit bg=P2^6;
  14. sbit beep=P3^3;  //beep
  15. sbit led=P1^2;
  16. //定义固定显示
  17. uchar juli[5]={'A','.','A','A','m'};
  18. uchar set_juli[]={'A','.','A','A','m'};
  19. uchar zifu[]={'D','i','s',':'};           //Distance
  20. //定义全局变量
  21. uchar time0_flag=0;  //定时器溢出中断
  22. uint time=0;        //定时器定时时间
  23. uchar one_final=0;   //一次测量完成
  24. uint distance=0.0,set_dis=100;   //距离和设定报警距离

  25. void display();
  26. void Trig_SR04();
  27. void button_choose();
  28. void judge_baojing();
  29. void main()
  30. {
  31.         
  32.         EA=1;       //外部中断0下降沿触发  定时器0加门控位 高电平开启
  33.         TMOD=0x09;  //16位 TR0=1; INT0=1; 开启
  34.         TR0=1;
  35.         EX0=1;
  36.         IT0=1;      //下降沿触发
  37.         
  38.         TH0=0;
  39.         TL0=0;
  40.         init();     //1602初始化        
  41.         Trig_SR04();
  42.         while(1)
  43.         {
  44.                 if(one_final)   //一次完成后再次触发
  45.                 {
  46.                         Trig_SR04();
  47.                         one_final=0;
  48.                 }
  49.                 judge_baojing();
  50.                 display();    //液晶显示
  51.                 button_choose();  //按键调整
  52.         }
  53. }

  54. void INT0_hander() interrupt 0
  55. {
  56.         time = TH0*256+TH0;    //  time us
  57.         distance=time*0.0170;  //cm    34000cm*10e-6*time/2
  58.         one_final=1;
  59.         TH0=0;
  60.         TL0=0;
  61. }

  62. void Trig_SR04()  //仿真里是地脉冲触发
  63. {
  64.         Trig=0;
  65.         Trig=1;
  66.         _nop_();
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         _nop_();
  73.         _nop_();
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         _nop_();
  82.         _nop_();
  83.         _nop_();
  84.         _nop_();
  85.         _nop_();
  86.         _nop_();
  87.         Trig=0;
  88. }


  89. void judge_baojing()
  90. {
  91.         uint time_baojing,i;
  92.         if(distance<set_dis)
  93.         {
  94.                         time_baojing=distance*10;
  95.                           for (i=0;i<time_baojing;i++)
  96.                           {
  97.                             DelayUs2x(100);
  98.                             beep=!beep;       //BEEP取反
  99.                           }
  100.                                 for (i=0;i<time_baojing;i++)
  101.                           {
  102.                                         led=~led;
  103.                                         DelayUs2x(time_baojing);
  104.                           }
  105.         }
  106. }
  107. void display()
  108. {
  109.         if(distance<5) //测量值小于下限
  110.                 {
  111.                         juli[0]='-';
  112.                         juli[2]='-';
  113.                         juli[3]='-';
  114.                 }
  115.         else if(distance>500)        //测量值大于上限
  116.                 {
  117.                         juli[0]='C';
  118.                         juli[2]='C';
  119.                         juli[3]='C';
  120.                 }
  121.         else
  122.         {
  123.                 juli[0]=distance/100+'0';
  124.                 juli[2]=distance/10%10+'0';
  125.                 juli[3]=distance%10+'0';
  126.         }
  127.         set_juli[0]=set_dis/100+'0';
  128.         set_juli[2]=set_dis/10%10+'0';
  129.         set_juli[3]=set_dis%10+'0';
  130.         
  131.         LCD_Write_String(11,0,juli);  //显示测距
  132.         LCD_Write_String(5,0,zifu);   //显示distance
  133.         LCD_Write_String(11,1,set_juli); //显示报警距离
  134. }


  135. void button_choose()
  136. {
  137.         uint k,e,xs;   //e 控制个性化显示 xs显示周期
  138.         uchar a1,a2,a3,n=0,m=0,z=0;   //按键调整 a1,a2,a3调整设定距离的三位从高到低  nmz控制循环
  139.                 if(!k1)      //按键处理程序
  140.                 {
  141.                         EA=0;
  142.                         TR0=0;
  143.                   set_juli[0]='A';
  144.                         set_juli[1]='.';
  145.                         set_juli[2]='A';
  146.                         set_juli[3]='A';
  147.                         set_juli[4]='m';
  148.                         LCD_Write_String(11,1,set_juli);
  149.                         k=500;
  150.                   while(k)
  151.                         {
  152.                                  k--;
  153.                                 DelayMs(2);
  154.                         }
  155.                   set_juli[0]=set_dis/100+'0';
  156.                         set_juli[2]=set_dis/10%10+'0';
  157.                         set_juli[3]=set_dis%10+'0';
  158.                         LCD_Write_String(11,1,set_juli);
  159.                         a1=set_dis/100;
  160.                         a2=set_dis/10%10;
  161.                         a3=set_dis%10;
  162.                         
  163.                         
  164.                         //按键调整最小距离
  165.                         n=1;
  166.                   while(n)
  167.                         {
  168.                                 if(!k2)
  169.                                 {
  170.                                         while(!k2);
  171.                                         e=1;
  172.                                         xs=3;
  173.                                         a1+=1;
  174.                                         if(a1>5)
  175.                                         a1=0;
  176.                                           juli[0]=a1+'0';
  177.                                 }

  178.                                 if (e==1)
  179.                                 {
  180.                                         xs++;
  181.                                            juli[0]=a1+'0';
  182.                                           if(xs>6)
  183.                                           {
  184.                                     xs=0;
  185.                                                                         e=0;
  186.                                           }
  187.                                 }
  188.                                 else
  189.                                 {
  190.                                         juli[0]=' ';
  191.                                         xs++;
  192.                                         if(xs>3)
  193.                                         {
  194.                                                 xs=0;
  195.                                                 e=1;
  196.                                         }
  197.                                 }
  198.                                 LCD_Write_String(11,1,juli);
  199.                                 if(!k1)
  200.                                 {
  201.                                         while(!k1);
  202.                                            juli[0]=a1+'0';
  203.                                         m=1;
  204.                                         while(m)
  205.                                         {
  206.                                                 if(!k2)
  207.                                                 {
  208.                                                         while(!k2);
  209.                                                         e=1;
  210.                                                         xs=3;
  211.                                                         a2+=1;
  212.                                                         if(a2>9)
  213.                                                         a2=0;
  214.                                                           juli[2]=a2+'0';
  215.                                                         LCD_Write_String(11,1,juli);
  216.                                                 }

  217.                                                 if (e==1)
  218.                                                 {
  219.                                                         xs++;
  220.                                                            juli[2]=a2+'0';
  221.                                                           if(xs>6)
  222.                                                           {
  223.                                                     xs=0;
  224.                                                                                         e=0;
  225.                                                           }
  226.                                                 }
  227.                                                 else
  228.                                                 {
  229.                                                         juli[2]=' ';
  230.                                                         xs++;
  231.                                                         if(xs>3)
  232.                                                         {
  233.                                                                 xs=0;
  234.                                                                 e=1;
  235.                                                         }
  236.                                                 }
  237.                                                 LCD_Write_String(11,1,juli);
  238.                                                 
  239.                                                 if(!k1)
  240.                                                 {
  241.                                                         while(!k1);
  242.                                                         juli[2]=a2+'0';
  243.                                                         z=1;
  244.                                                         while(z)
  245.                                                         {
  246.                                                                 if(!k2)
  247.                                                                 {
  248.                                                                         while(!k2);
  249.                                                                         e=1;
  250.                                                                         xs=3;
  251.                                                                         a3+=1;
  252.                                                                         if(a3>9)
  253.                                                   a3=0;
  254.                                                                   juli[3]=a3+'0';
  255.                                                                         LCD_Write_String(11,1,juli);
  256.                                                                 }

  257.                                                                 if (e==1)
  258.                                                                 {
  259.                                                                         xs++;
  260.                                                                            juli[3]=a3+'0';
  261.                                                                           if(xs>6)
  262.                                                                           {
  263.                                                     xs=0;
  264. ……………………

  265. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

附件如下:带仿真和keil源码 51超声波测距报警.zip (113.86 KB, 下载次数: 352)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:328014 发表于 2020-11-22 16:17 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:935889 发表于 2021-6-12 15:19 | 只看该作者
楼主,仿真没有反应
回复

使用道具 举报

地板
ID:328014 发表于 2021-6-12 16:07 | 只看该作者
GEYI123546 发表于 2021-6-12 15:19
楼主,仿真没有反应

用Proteus7.5打开才有反应,如图

51hei.gif (123.88 KB, 下载次数: 69)

51hei.gif
回复

使用道具 举报

5#
ID:648123 发表于 2021-10-16 22:51 | 只看该作者
你好,请问为什么我把显示的位置改成第一行0位后就出现了这种情况?

E6E45CF41617F9ED8669BE19F8E69F8B.jpg (1.21 MB, 下载次数: 74)

E6E45CF41617F9ED8669BE19F8E69F8B.jpg
回复

使用道具 举报

6#
ID:982171 发表于 2021-11-19 00:24 来自手机 | 只看该作者
那超声波测距和测速的原理图是不是一样的呢
回复

使用道具 举报

7#
ID:965040 发表于 2023-11-6 15:51 | 只看该作者
proteus 8 打开没有显示,改天换个版本试下吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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