标题: HC-SR04超声波倒车雷达Proteus仿真与单片机程序源码 [打印本页]

作者: 儿时有过猫    时间: 2018-6-8 23:54
标题: HC-SR04超声波倒车雷达Proteus仿真与单片机程序源码
分享一个基于51单片机的倒车系统仿真,带减小距离和增加距离调节以及报警功能.还有一个功能键
用HC-SR04超声波模块组成的LCD1602显示的超声波测距板仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


电路原理图如下:


HC-SR04超声波倒车雷达的单片机源程序如下:
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include "LCD.H"
  4. #include "18B20.H"
  5. #include "delay.h"

  6. sbit k1=P3^5;
  7. sbit k2=P3^6;
  8. sbit csb=P2^5;
  9. sbit csbint=P3^2;
  10. sbit bg=P2^6;
  11. sbit fmq=P3^3;

  12. unsigned char aa[]={' ',' ','D','i','s','t','a','n','c','e',':'};           //Distance

  13. unsigned char bb[11]={' ',' ',' ',' ','.',' ',' ',' ',' ',' ',};        
  14. unsigned char cc[]={'A','.','A','A','m'};
  15. unsigned char zf,a1,a2,a3,xs,e,n,m,z;         //zf 温度正负标志位;a1,a2,a3,按键设定程序中定值的米、分米、厘米临时存储变量
  16.                                              //xs,e 用于按键程序中设定位闪动显示的变量;flag,未用,n,是背光控制标志位变量;m,z;
  17. unsigned int dz,k,s,j,bgz,k;
  18. int temp;
  19. float temperature,csbc,wdz;
  20. bit wh;

  21. main()
  22. {
  23.         TH0=0;
  24.         TL0=0;
  25.         TMOD=0X11;        //T1,T0为16位定时器
  26.         EA=0;
  27.         bg=0;
  28.         n=0;
  29.         m=0;
  30.         z=0;
  31.          init();
  32.         Init_DS18B20();
  33.     dz=80;
  34.         bb[6]=0xdf;
  35.         bb[7]=0x43;
  36.         e=4;
  37.         cc[0]=dz/100+'0';
  38.         cc[2]=dz/10%10+'0';
  39.         cc[3]=dz%10+'0';
  40.         LCD_Write_String(0,0,aa);
  41.         LCD_Write_String(11,1,cc);
  42.         while(1)
  43.         {
  44.                 temp=ReadTemperature();
  45.                 fmq=1;
  46.                 DelayMs(100);
  47.                 if(temp<0)
  48.                 {
  49.                            temp=-(temp-1);
  50.                            zf=1;
  51.                         bb[0]='-';
  52.                 }
  53.                 else
  54.                 {
  55.                         zf=0;
  56.                         bb[0]=' ';
  57.                 }
  58.                   csb=0;                                             //启动一次模块
  59.                   _nop_();
  60.                   _nop_();
  61.                   _nop_();
  62.                   _nop_();
  63.                   _nop_();
  64.                   _nop_();
  65.                   _nop_();
  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.                   csb=1;
  81.                 ET0=1;        //启动计数器T0,用以计时
  82.                 TR0=1;
  83.                 EA=1;
  84.                 j=80;        //延时                  
  85.             while(j--)
  86.                 {
  87.                 }
  88.                 csbint=1;
  89.         j=0;
  90.                    while(csbint)                        //判断接收回路是否收到超声波的回波
  91.                 {
  92.                         j++;
  93.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  94.                         csbint=0;
  95.                 }
  96.                 TR0=0;
  97.                 s=TH0*256+TL0;                        //读取时间数据
  98.                 TH0=0;
  99.                 TL0=0;
  100.                 wdz=0.00000607*temp;   //温度补偿计算
  101.                 if(zf==0)
  102.                 {                                                                                                                                                                                       
  103.                           csbc=0.03315+wdz;
  104.                 }
  105.                 else csbc=0.03315-wdz;
  106.                 csbc=csbc/2;
  107.                 s=s*csbc-8;
  108.                 if(s<5) //测量值小于下限
  109.                 {
  110.                         cc[0]='-';
  111.                         cc[2]='-';
  112.                         cc[3]='-';
  113.                 }
  114.                 else if(s>500)        //测量值大于上限
  115.                 {
  116.                         cc[0]='C';
  117.                         cc[2]='C';
  118.                         cc[3]='C';
  119.                 }
  120.                 else
  121.                 {
  122.                         cc[0]=s/100+'0';
  123.                         cc[2]=s/10%10+'0';
  124.                         cc[3]=s%10+'0';
  125.                 }
  126.                 if(s<dz)
  127.                 {
  128.                         bgz=s*5;
  129.                           for (k=0;k<bgz;k++)
  130.                           {
  131.                             DelayUs2x(150);
  132.                             fmq=!fmq;       //BEEP取反
  133.                           }
  134.                 }
  135.                 bb[1]=temp/1000+0x30;
  136.                 bb[2]=temp/100%10+0x30;//显示十位
  137.                 bb[3]=temp%100/10+0x30;//显示个位
  138.                 bb[5]=temp%10+0x30; //小数
  139.         if(zf==0)
  140.             {
  141.                         if(temp<1000)
  142.                         {
  143.                                    bb[1]=' ';
  144.                                    if(temp<100)
  145.                                    {
  146.                                       bb[2]=' ';
  147.                                 }
  148.                         }
  149.                 }
  150.                 else
  151.                 {
  152.                         if(temp<1000)
  153.                         {
  154.                                    bb[1]='-';
  155.                                    bb[0]=' ';
  156.                                    if(temp<100)
  157.                                    {
  158.                                         bb[0]=' ';
  159.                                            bb[1]=' ';
  160.                                       bb[2]='-';
  161.                                 }
  162.                         }
  163.                 }
  164.                 LCD_Write_String(0,1,bb);
  165.                 LCD_Write_String(11,0,cc);
  166.                 while(!k2)                   //液晶背面开关
  167.                 {
  168.                    n=1;
  169.                 }
  170.                 if(n==1)
  171.                 {
  172.                    bg=~bg;                   //bg=0;时开背光灯
  173.                    n=0;
  174.                 }
  175.                 if(!k1)      //按键处理程序
  176.                 {
  177.                     TR1=0;
  178.                         TR0=0;
  179.                           cc[0]='A';
  180.                         cc[1]='.';
  181.                         cc[2]='A';
  182.                         cc[3]='A';
  183.                         cc[4]='m';
  184.                         LCD_Write_String(11,1,cc);
  185.                         k=500;
  186.                     while(k)
  187.                         {
  188.                                  k--;
  189.                                 DelayMs(2);
  190.                         }
  191.                           cc[0]=dz/100+'0';
  192.                         cc[2]=dz/10%10+'0';
  193.                         cc[3]=dz%10+'0';
  194.                         LCD_Write_String(11,1,cc);
  195.                         a1=dz/100;
  196.                         a2=dz/10%10;
  197.                         a3=dz%10;
  198.                         n=1;
  199.                           while(n)
  200.                         {
  201.                                 if(!k2)
  202.                                 {
  203.                                         while(!k2);
  204.                                         e=1;
  205.                                         xs=3;
  206.                                         a1+=1;
  207.                                         if(a1>5)
  208.                                         a1=0;
  209.                                           cc[0]=a1+'0';
  210.                                 }

  211.                                 if (e==1)
  212.                                 {
  213.                                         xs++;
  214.                                            cc[0]=a1+'0';
  215.                                           if(xs>6)
  216.                                           {
  217.                                     xs=0;
  218.                                                 e=0;
  219.                                           }
  220.                                 }
  221.                                 else
  222.                                 {
  223.                                         cc[0]=' ';
  224.                                         xs++;
  225.                                         if(xs>3)
  226.                                         {
  227.                                                 xs=0;
  228.                                                 e=1;
  229.                                         }
  230.                                 }
  231.                                 LCD_Write_String(11,1,cc);
  232.                                 if(!k1)
  233.                                 {
  234.                                         while(!k1);
  235.                                            cc[0]=a1+'0';
  236.                                         m=1;
  237.                                         while(m)
  238.                                         {
  239.                                                 if(!k2)
  240.                                                 {
  241.                                                         while(!k2);
  242.                                                         e=1;
  243.                                                         xs=3;
  244.                                                         a2+=1;
  245.                                                         if(a2>9)
  246.                                                         a2=0;
  247.                                                           cc[2]=a2+'0';
  248.                                                         LCD_Write_String(11,1,cc);
  249.                                                 }

  250.                                                 if (e==1)
  251.                                                 {
  252.                                                         xs++;
  253.                                                            cc[2]=a2+'0';
  254.                                                           if(xs>6)
  255.                                                           {
  256.                                                     xs=0;
  257.                                                                 e=0;
  258.                                                           }
  259.                                                 }
  260.                                                 else
  261.                                                 {
  262.                                                         cc[2]=' ';
  263.                                                         xs++;
  264.                                                         if(xs>3)
  265.                                                         {
  266.                                                                 xs=0;
  267.                                                                 e=1;
  268.                                                         }
  269.                                                 }
  270.                                                 LCD_Write_String(11,1,cc);
  271.                                                 
  272.                                                 if(!k1)
  273.                                                 {
  274.                                                         while(!k1);
  275.                                                         cc[2]=a2+'0';
  276.                                                         z=1;
  277.                                                         while(z)
  278.                                                         {
  279.                                                                 if(!k2)
  280.                                                                 {
  281.                                                                         while(!k2);
  282.                                                                         e=1;
  283.                                                                         xs=3;
  284.                                                                         a3+=1;
  285.                                                                         if(a3>9)
  286.                                                         a3=0;
  287.                                                                           cc[3]=a3+'0';
  288.                                                                         LCD_Write_String(11,1,cc);
  289.                                                                 }

  290.                                                                 if (e==1)
  291.                                                                 {
  292.                                                                         xs++;
  293.                                                                            cc[3]=a3+'0';
  294. ……………………

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


Keil代码与Proteus7.8仿真(dsn文件 只能用7.8版本打开)下载:
超声波倒车雷达.zip (122.01 KB, 下载次数: 1026)





作者: 君莫笑o    时间: 2018-10-9 10:11
很详细,强力推荐,赞一个
作者: 油炸小4562    时间: 2018-10-10 09:46
很有用,学习了
作者: 1353408511    时间: 2018-10-10 09:47
赞一个!!!!!!!!!!!!!!
作者: 1353408511    时间: 2018-10-10 09:48
赞一个!
作者: 7ys2    时间: 2018-10-10 11:23
赞一个
作者: 林小天    时间: 2018-10-19 13:44
厉害了
作者: 林小天    时间: 2018-10-19 13:45
厉害了
作者: NO.0132    时间: 2018-11-14 15:53
学习了,感谢
作者: wang2    时间: 2018-12-12 10:07
我这用不了啊
你这里的超声波的hex文件不需要吗?


作者: qzyhlf    时间: 2019-1-8 16:31
好资料,51黑有你更精彩!!!
作者: zgh741149062    时间: 2019-4-7 18:58
正好能用到,很厉害~
作者: l81472534    时间: 2019-4-18 15:53
学习了
作者: gdgdgd    时间: 2019-4-22 16:10
人狠话不多,找了全网就你最好
作者: 角色转换    时间: 2019-4-29 10:41
这个怎么用啊?导入protues工程,单片机加载hex文件就可以实现仿真吗?我是小白,请各位大神赐教

作者: 角色转换    时间: 2019-4-29 10:43
导入protues工程,单片机加载hex文件就可以实现仿真吗?我是小白,请各位大神赐教
作者: 1073399215    时间: 2019-5-3 21:59
赞一个  刚需
作者: tieq1952    时间: 2019-5-4 07:48
谢谢分享!!!
作者: 腾飞的龙    时间: 2019-5-4 18:39
楼主您好 。仿真软件ISIS7怎么找超声波模块?谢谢
作者: life_阳子    时间: 2019-5-4 21:41
资料不错,想问一下HC-SR04这个元器件是怎么弄得呢?
作者: zhangxiaow    时间: 2019-5-12 00:27
sch文件打不开是什么原因

作者: qq443688685    时间: 2019-6-4 18:35
楼主我买了,但是代码用不出来,怎么办
作者: qq443688685    时间: 2019-6-4 18:36
楼主怎么用呀

IMG_20190604_180420.jpg (1.31 MB, 下载次数: 115)

IMG_20190604_180420.jpg

1559644547326..jpg (1.26 MB, 下载次数: 119)

1559644547326..jpg

作者: huaaaa    时间: 2019-6-10 14:01
下载收藏  51黑有你更精彩
作者: 瞒心书生    时间: 2019-6-18 15:25
真好用啊 赞一个
作者: xb10230808lyn    时间: 2019-6-28 10:53
自己做的HS-SR04不能仿真怎么回事
作者: 小飞飞非    时间: 2019-7-2 10:01
赞一个
作者: 鹏博士PBs    时间: 2019-7-2 11:08
主要利用了超声波传感器和液晶屏
作者: chuan186837    时间: 2019-7-2 12:34
倒车雷达
作者: 12212a    时间: 2019-8-1 21:06
你好楼主 为什么我下载了 仿真没有显示
作者: 12212a    时间: 2019-8-1 21:18
鹏博士PBs 发表于 2019-7-2 11:08
主要利用了超声波传感器和液晶屏

你好 ,为什么我打开 仿真不行呢

作者: gchq521    时间: 2019-8-11 19:00
LCD不显示怎么办??
作者: 法神黎暮    时间: 2019-9-20 00:08
实用,赞一个
作者: 1979759100Ls    时间: 2019-10-25 09:29
zhangxiaow 发表于 2019-5-12 00:27
sch文件打不开是什么原因

换个版本高的PROTEUS
作者: 比蹦跶    时间: 2019-11-9 11:06
仿真压缩包打不开怎么办
作者: zzzzz.c    时间: 2019-11-11 14:22
瞒心书生 发表于 2019-6-18 15:25
真好用啊 赞一个

换个版本高的PROTEUS
作者: zzzzz.c    时间: 2019-11-11 14:23
真好用啊 赞一个
作者: strelizia    时间: 2019-11-24 18:43
很详细,强力推荐,赞一个
作者: mengshi@2015    时间: 2019-12-1 15:33
谢谢分享
作者: 浮生故是    时间: 2019-12-2 11:18
想下载。。。
作者: 拯救者    时间: 2019-12-18 14:52

下载收藏  51黑有你更精彩
作者: spring。    时间: 2019-12-23 08:38
刚好用到

作者: LKJ111    时间: 2019-12-23 10:52
很强势,谢谢分享
作者: djfasdfjsa    时间: 2019-12-31 13:31
gchq521 发表于 2019-8-11 19:00
LCD不显示怎么办??

请问问题解决了吗?
作者: 嗨的人生    时间: 2020-2-1 13:10
LCD不显示怎么办??
作者: zbfdyw    时间: 2020-4-20 12:10
LED不显示,喇叭也不鸣笛,是不是自己不会使用,请高手赐教
作者: 出发66    时间: 2020-4-21 09:23
gchq521 发表于 2019-8-11 19:00
LCD不显示怎么办??

问题解决了吗?

作者: 出发66    时间: 2020-4-21 10:49
zbfdyw 发表于 2020-4-20 12:10
LED不显示,喇叭也不鸣笛,是不是自己不会使用,请高手赐教

我的也不能显示。
作者: ai3093468    时间: 2020-4-29 09:47
很厉害学到了
作者: ai3093468    时间: 2020-4-29 10:37
液晶屏显示什么呀?
作者: 303802721@qq    时间: 2020-5-6 20:50
出发66 发表于 2020-4-21 10:49
我的也不能显示。

我的也不能显示
作者: 西瓜524    时间: 2020-5-8 14:13
真的好厉害 棒!
作者: 312141    时间: 2020-5-21 15:08
qq443688685 发表于 2019-6-4 18:36
楼主怎么用呀

仿真不成功,LCD不显示
作者: ujsme    时间: 2020-5-22 16:50
谢谢分享,下载下来学习一下
作者: ujsme    时间: 2020-5-22 16:50
感谢分享,下载下来学习一下!不错不错
作者: 5685l    时间: 2020-5-28 17:51
非常有用,感谢分享
作者: 5685l    时间: 2020-5-28 21:28
zbfdyw 发表于 2020-4-20 12:10
LED不显示,喇叭也不鸣笛,是不是自己不会使用,请高手赐教

请问解决了吗

作者: cooldog123pp    时间: 2020-5-29 08:44
厉害了,超声波模块很给力啊~
作者: 宙中沉浮    时间: 2020-6-16 13:02
谢谢楼主,很赞!
作者: shengzhidao702    时间: 2020-7-15 14:03
下载后修改了一下IO,用开发板成功实现功能,但是还是有一下没有看懂,比如P2^6口的配置什么的???
作者: usaboy    时间: 2021-6-7 08:07
thank you for the sharing!
作者: pl-girl    时间: 2023-3-14 21:45
这个下载的怎么不是proteus




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1