找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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, 下载次数: 1021)




评分

参与人数 3黑币 +54 收起 理由
心动s290 + 1 赞一个!
zsyzdx + 3 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:246531 发表于 2018-10-9 10:11 | 只看该作者
很详细,强力推荐,赞一个
回复

使用道具 举报

板凳
ID:407021 发表于 2018-10-10 09:46 | 只看该作者
很有用,学习了
回复

使用道具 举报

地板
ID:407378 发表于 2018-10-10 09:47 | 只看该作者
赞一个!!!!!!!!!!!!!!
回复

使用道具 举报

5#
ID:407378 发表于 2018-10-10 09:48 | 只看该作者
赞一个!
回复

使用道具 举报

6#
ID:407428 发表于 2018-10-10 11:23 | 只看该作者
赞一个
回复

使用道具 举报

7#
ID:412234 发表于 2018-10-19 13:44 | 只看该作者
厉害了
回复

使用道具 举报

8#
ID:412234 发表于 2018-10-19 13:45 | 只看该作者
厉害了
回复

使用道具 举报

9#
ID:426441 发表于 2018-11-14 15:53 | 只看该作者
学习了,感谢
回复

使用道具 举报

10#
ID:443404 发表于 2018-12-12 10:07 | 只看该作者
我这用不了啊
你这里的超声波的hex文件不需要吗?

回复

使用道具 举报

11#
ID:3802 发表于 2019-1-8 16:31 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

12#
ID:500061 发表于 2019-4-7 18:58 | 只看该作者
正好能用到,很厉害~
回复

使用道具 举报

13#
ID:515555 发表于 2019-4-18 15:53 | 只看该作者
学习了
回复

使用道具 举报

14#
ID:244712 发表于 2019-4-22 16:10 | 只看该作者
人狠话不多,找了全网就你最好
回复

使用道具 举报

15#
ID:524230 发表于 2019-4-29 10:41 | 只看该作者
这个怎么用啊?导入protues工程,单片机加载hex文件就可以实现仿真吗?我是小白,请各位大神赐教
回复

使用道具 举报

16#
ID:524230 发表于 2019-4-29 10:43 | 只看该作者
导入protues工程,单片机加载hex文件就可以实现仿真吗?我是小白,请各位大神赐教
回复

使用道具 举报

17#
ID:525399 发表于 2019-5-3 21:59 | 只看该作者
赞一个  刚需
回复

使用道具 举报

18#
ID:253767 发表于 2019-5-4 07:48 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

19#
ID:79544 发表于 2019-5-4 18:39 | 只看该作者
楼主您好 。仿真软件ISIS7怎么找超声波模块?谢谢
回复

使用道具 举报

20#
ID:235332 发表于 2019-5-4 21:41 | 只看该作者
资料不错,想问一下HC-SR04这个元器件是怎么弄得呢?
回复

使用道具 举报

21#
ID:391610 发表于 2019-5-12 00:27 | 只看该作者
sch文件打不开是什么原因
回复

使用道具 举报

22#
ID:554043 发表于 2019-6-4 18:35 来自手机 | 只看该作者
楼主我买了,但是代码用不出来,怎么办
回复

使用道具 举报

23#
ID:554043 发表于 2019-6-4 18:36 来自手机 | 只看该作者
楼主怎么用呀

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

IMG_20190604_180420.jpg

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

1559644547326..jpg
回复

使用道具 举报

24#
ID:525478 发表于 2019-6-10 14:01 | 只看该作者
下载收藏  51黑有你更精彩
回复

使用道具 举报

25#
ID:295142 发表于 2019-6-18 15:25 | 只看该作者
真好用啊 赞一个
回复

使用道具 举报

26#
ID:573176 发表于 2019-6-28 10:53 | 只看该作者
自己做的HS-SR04不能仿真怎么回事
回复

使用道具 举报

27#
ID:576149 发表于 2019-7-2 10:01 | 只看该作者
赞一个
回复

使用道具 举报

28#
ID:282095 发表于 2019-7-2 11:08 | 只看该作者
主要利用了超声波传感器和液晶屏
回复

使用道具 举报

29#
ID:575298 发表于 2019-7-2 12:34 来自手机 | 只看该作者
倒车雷达
回复

使用道具 举报

30#
ID:407026 发表于 2019-8-1 21:06 | 只看该作者
你好楼主 为什么我下载了 仿真没有显示
回复

使用道具 举报

31#
ID:407026 发表于 2019-8-1 21:18 | 只看该作者
鹏博士PBs 发表于 2019-7-2 11:08
主要利用了超声波传感器和液晶屏

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

使用道具 举报

32#
ID:489394 发表于 2019-8-11 19:00 | 只看该作者
LCD不显示怎么办??
回复

使用道具 举报

33#
ID:472123 发表于 2019-9-20 00:08 | 只看该作者
实用,赞一个
回复

使用道具 举报

34#
ID:312929 发表于 2019-10-25 09:29 | 只看该作者
zhangxiaow 发表于 2019-5-12 00:27
sch文件打不开是什么原因

换个版本高的PROTEUS
回复

使用道具 举报

35#
ID:633379 发表于 2019-11-9 11:06 | 只看该作者
仿真压缩包打不开怎么办
回复

使用道具 举报

36#
ID:509174 发表于 2019-11-11 14:22 | 只看该作者

换个版本高的PROTEUS
回复

使用道具 举报

37#
ID:509174 发表于 2019-11-11 14:23 | 只看该作者
真好用啊 赞一个
回复

使用道具 举报

38#
ID:546381 发表于 2019-11-24 18:43 | 只看该作者
很详细,强力推荐,赞一个
回复

使用道具 举报

39#
ID:653556 发表于 2019-12-1 15:33 | 只看该作者
谢谢分享
回复

使用道具 举报

40#
ID:654098 发表于 2019-12-2 11:18 | 只看该作者
想下载。。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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