找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3626|回复: 1
收起左侧

Proteus仿真51单片机4路超声波测距LCD1602显示程序

[复制链接]
ID:765945 发表于 2020-6-1 15:26 | 显示全部楼层 |阅读模式
原件清单
  
序号
  
  
编号
  
  
型号、规格
  
  
描述
  
  
数量
  
  
备注
  
  
1
  
  
R1
  
  
10k
  
  
1/4W电阻
  
  
1
  
  
复位电阻
  
  
2
  
  
R2
  
  
4.7k
  
  
1/4W电阻
  
  
1
  
  
  
  
3
  
  
W1
  
  
10k
  
  
精密可调调电阻
  
  
1
  
  
  
  
4
  
  
BY
  
  
BEEP
  
  
蜂鸣器
  
  
1
  
  
  
  
5
  
  
BG1
  
  
9012
  
  
PNP
  
  
1
  
  
  
  
6
  
  
C1
  
  
470uF/16V
  
  
电解电容
  
  
1
  
  
  
  
7
  
  
C2
  
  
104
  
  
瓷片电容
  
  
1
  
  
  
  
8
  
  
C3
  
  
10uF
  
  
电解电容
  
  
1
  
  
  
  
7
  
  
C4
  
  
22pF
  
  
瓷片电容
  
  
1
  
  
  
  
10
  
  
C5
  
  
22pF
  
  
瓷片电容
  
  
1
  
  
  
  
11
  
  
IC1
  
  
AT89S51
  
AT89S52
  
  
单片机
  
  
1
  
  AT89C51
  AT89C52
  STC89C52RC
  
  
12
  
  
IC
  
  
DIP40
  
  
40集成电路座
  
  
1
  
  
  
  
13
  
  
Y1
  
  
12MHz
  
  
晶振
  
  
1
  
  
  
  
14
  
  
USB
  
  
USB
  
  
USB接口
  
  
1
  
  
  
  
15
  
  
HC-SR04
  
  
HC-SR04
  
  
超声波测距模块
  
  
4
  
  
测量范围2-450厘米
  
  
16
  
  
D1
  
  
1N4007
  
  
整流二极管
  
  
1
  
  
  
  
17
  
  
ZXZ1
  
  
DG7.62-2P
  
  
接线端子
  
  
1
  
  
  
  
18
  
  
PCB
  
  
9*12厘米
  
  9*12厘米以上洞洞板
  
  
1
  
  
  
  
19
  
  
  
  
1602
  
  
1602液晶屏
  
  
1
  
  
  
  
20
  
  
K1
  
  
  
  
按键开关
  
  
1
  
  
  
  
21
  
  
  
  
DS18B20
  
  
温度传感器
  
  
1
  
  
  
  
  
  
  
  
  
  
导线
  
  
  
  
若干
  
  
  
  
  
  
  
  
焊锡丝
  
  
  
  
若干
  
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
原理图.png

工程图.png
单片机源程序如下:
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include "LCD.H"
  4. #include "18B20.H"
  5. #include "delay.h"

  6. sbit csb=P1^4;                        // 第一路 Trig
  7. sbit csbint=P1^5;                // 第一路 Echo
  8. sbit csb1=P1^6;                   //  第二路 Trig
  9. sbit csbint1=P1^7;           //  第二路 Echo
  10. sbit csb2=P3^6;                   //  第三路 Trig
  11. sbit csbint2=P3^5;           //  第三路 Echo
  12. sbit csb3=P3^4;                   //  第四路 Trig
  13. sbit csbint3=P3^3;           //  第四路 Echo
  14. sbit k1=P1^0;           //  K1
  15. sbit k2=P1^1;           //  K2
  16. sbit led=P2^7;           //  指示灯


  17. sbit fmq=P3^2;                   //蜂鸣器

  18. unsigned char aa[16]={' ','.',' ',' ','m',' ',' ',' ',' ',' ',' ',' ','.',' ',' ','m'};
  19. unsigned char bb[16]={' ','.',' ',' ','m',' ','.',' ',' ',' ',' ',' ','.',' ',' ','m'};        

  20. unsigned char zf;
  21.                                          
  22. unsigned int dz,k,s,j,bgz,k,s1,s2,s3,s4;
  23. int temp;
  24. float csbc,wdz;


  25. main()
  26. {
  27.         TH0=0;
  28.         TL0=0;
  29.         TMOD=0X11;        //T1,T0为16位定时器
  30.         EA=0;

  31.          init();
  32.     Init_DS18B20();
  33.     dz=100;                  //报警定值
  34.         LCD_Write_String(0,0,aa);
  35.         aa[9]=0xdf;
  36.         while(1)
  37.         {
  38.                  temp=ReadTemperature();

  39.                 DelayMs(100);
  40.                 if(temp<0)
  41.                 {
  42.                            temp=-(temp-1);
  43.                            zf=1;
  44.                         aa[12]='-';
  45.                 }
  46.                 else
  47.                 {
  48.                         zf=0;
  49.                         aa[12]=' ';
  50.                 }
  51.                 wdz=0.00000607*temp;   //温度补偿计算
  52.                 if(zf==0)
  53.                 {                                                                                                                                                                                       
  54.                           csbc=0.03315+wdz;
  55.                 }
  56.                 else csbc=0.03315-wdz;

  57.                 aa[6]=temp/1000+0x30;
  58.                 aa[7]=temp/100%10+0x30;//显示十位
  59.                 aa[8]=temp%100/10+0x30;//显示个位
  60.         if(zf==0)
  61.             {
  62.                         if(temp<1000)
  63.                         {
  64.                                    aa[6]=' ';
  65.                                    if(temp<100)
  66.                                    {
  67.                                       aa[7]=' ';
  68.                                 }
  69.                         }
  70.                 }
  71.                 else
  72.                 {
  73.                         if(temp<1000)
  74.                         {
  75.                                    aa[6]='-';
  76. //                                   aa[12]=' ';
  77.                                    if(temp<100)
  78.                                    {
  79.                                         aa[6]=' ';
  80.                                            aa[7]='-';
  81.                                 }
  82.                         }
  83.                 }

  84. ///////////////////////////////////////////
  85. //                    第一路        测距模块                         //
  86. ///////////////////////////////////////////
  87.                   csb=0;                                             //启动一次模块
  88.                   _nop_();
  89.                   _nop_();
  90.                   _nop_();
  91.                   _nop_();
  92.                   _nop_();
  93.                   _nop_();
  94.                   _nop_();
  95.                   _nop_();
  96.                   _nop_();
  97.                   _nop_();
  98.                   _nop_();
  99.                   _nop_();
  100.                   _nop_();
  101.                   _nop_();
  102.                   _nop_();
  103.                   _nop_();
  104.                   _nop_();
  105.                   _nop_();
  106.                   _nop_();
  107.                   _nop_();
  108.                   _nop_();
  109.                   _nop_();
  110.                   _nop_();
  111.                   _nop_();
  112.                   _nop_();
  113.                   csb=1;
  114.                 ET0=1;        //启动计数器T0,用以计时
  115.                 TR0=1;
  116.                 EA=1;
  117.                 j=50;        //延时                  
  118.             while(j--)
  119.                 {
  120.                 }
  121.                 csbint=1;
  122.         j=0;
  123.                    while(csbint)                        //判断接收回路是否收到超声波的回波
  124.                 {
  125.                         j++;
  126.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  127.                         csbint=0;
  128.                 }
  129.                 TR0=0;
  130.                 s1=TH0*256+TL0;                        //读取时间数据
  131.                 TH0=0;
  132.                 TL0=0;
  133.                 csbc=csbc/2;
  134.                 s1=s1*csbc-4;

  135. ///////////////////////////////////////////
  136. //                    第二路        测距模块                         //
  137. ///////////////////////////////////////////
  138.                   csb1=0;                                             //启动一次模块
  139.                   _nop_();
  140.                   _nop_();
  141.                   _nop_();
  142.                   _nop_();
  143.                   _nop_();
  144.                   _nop_();
  145.                   _nop_();
  146.                   _nop_();
  147.                   _nop_();
  148.                   _nop_();
  149.                   _nop_();
  150.                   _nop_();
  151.                   _nop_();
  152.                   _nop_();
  153.                   _nop_();
  154.                   _nop_();
  155.                   _nop_();
  156.                   _nop_();
  157.                   _nop_();
  158.                   _nop_();
  159.                   _nop_();
  160.                   _nop_();
  161.                   _nop_();
  162.                   _nop_();
  163.                   _nop_();
  164.                   csb1=1;
  165.                 ET0=1;        //启动计数器T0,用以计时
  166.                 TR0=1;
  167.                 EA=1;
  168.                 j=50;        //延时                  
  169.             while(j--)
  170.                 {
  171.                 }
  172.                 csbint1=1;
  173.         j=0;
  174.                    while(csbint1)                        //判断接收回路是否收到超声波的回波
  175.                 {
  176.                         j++;
  177.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  178.                         csbint1=0;
  179.                 }
  180.                 TR0=0;
  181.                 s2=TH0*256+TL0;                        //读取时间数据
  182.                 TH0=0;
  183.                 TL0=0;
  184.                 s2=s2*csbc-4;

  185. ///////////////////////////////////////////
  186. //                    第三路        测距模块                         //
  187. ///////////////////////////////////////////

  188.                   csb2=0;                                             //启动一次模块
  189.                   _nop_();
  190.                   _nop_();
  191.                   _nop_();
  192.                   _nop_();
  193.                   _nop_();
  194.                   _nop_();
  195.                   _nop_();
  196.                   _nop_();
  197.                   _nop_();
  198.                   _nop_();
  199.                   _nop_();
  200.                   _nop_();
  201.                   _nop_();
  202.                   _nop_();
  203.                   _nop_();
  204.                   _nop_();
  205.                   _nop_();
  206.                   _nop_();
  207.                   _nop_();
  208.                   _nop_();
  209.                   _nop_();
  210.                   _nop_();
  211.                   _nop_();
  212.                   _nop_();
  213.                   _nop_();
  214.                   csb2=1;
  215.                 ET0=1;        //启动计数器T0,用以计时
  216.                 TR0=1;
  217.                 EA=1;
  218.                 j=50;        //延时                  
  219.             while(j--)
  220.                 {
  221.                 }
  222.                 csbint2=1;
  223.         j=0;
  224.                    while(csbint2)                        //判断接收回路是否收到超声波的回波
  225.                 {
  226.                         j++;
  227.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  228.                         csbint2=0;
  229.                 }
  230.                 TR0=0;
  231.                 s3=TH0*256+TL0;                        //读取时间数据
  232.                 TH0=0;
  233.                 TL0=0;
  234.                 s3=s3*csbc-4;
  235. ///////////////////////////////////////////
  236. //                    第四路        测距模块                         //
  237. ///////////////////////////////////////////

  238.                   csb3=0;                                             //启动一次模块
  239.                   _nop_();
  240.                   _nop_();
  241.                   _nop_();
  242.                   _nop_();
  243.                   _nop_();
  244.                   _nop_();
  245.                   _nop_();
  246.                   _nop_();
  247.                   _nop_();
  248.                   _nop_();
  249.                   _nop_();
  250.                   _nop_();
  251.                   _nop_();
  252.                   _nop_();
  253.                   _nop_();
  254.                   _nop_();
  255.                   _nop_();
  256.                   _nop_();
  257.                   _nop_();
  258.                   _nop_();
  259.                   _nop_();
  260.                   _nop_();
  261.                   _nop_();
  262.                   _nop_();
  263.                   _nop_();
  264.                   csb3=1;
  265.                 ET0=1;        //启动计数器T0,用以计时
  266.                 TR0=1;
  267.                 EA=1;
  268.                 j=50;        //延时                  
  269.             while(j--)
  270.                 {
  271.                 }
  272.                 csbint3=1;
  273.         j=0;
  274.                    while(csbint3)                        //判断接收回路是否收到超声波的回波
  275.                 {
  276.                         j++;
  277.                         if(j>=2500)                        //如果达到一定时间没有收到回波,则将csbint置零,退出接收回波处理程序
  278.                         csbint2=0;
  279.                 }
  280.                 TR0=0;
  281.                 s4=TH0*256+TL0;                        //读取时间数据
  282.                 TH0=0;
  283.                 TL0=0;
  284.                 s4=s4*csbc-2;

  285.                 if(s1<5) //测量值小于下限
  286.                 {
  287.                         aa[0]='-';
  288.                         aa[2]='-';
  289.                         aa[3]='-';
  290.                 }
  291.                 else if(s1>200)        //测量值大于上限
  292.                 {
  293.                         aa[0]='C';
  294.                         aa[2]='C';
  295.                         aa[3]='C';
  296.                 }
  297.                 else
  298.                 {
  299.                         aa[0]=s1/100+'0';
  300.                         aa[2]=s1/10%10+'0';
  301.                         aa[3]=s1%10+'0';
  302.                 }

  303.                 if(s2<5) //测量值小于下限
  304.                 {
  305.                         bb[0]='-';
  306.                         bb[2]='-';
  307.                         bb[3]='-';
  308.                 }
  309.                 else if(s2>200)        //测量值大于上限
  310.                 {
  311.                         bb[0]='C';
  312.                         bb[2]='C';
  313.                         bb[3]='C';
  314.                 }
  315.                 else
  316.                 {
  317.                         bb[0]=s2/100+'0';
  318.                         bb[2]=s2/10%10+'0';
  319.                         bb[3]=s2%10+'0';
  320.                 }

  321.                 if(s3<5) //测量值小于下限
  322.                 {
  323.                         bb[11]='-';
  324.                         bb[13]='-';
  325.                         bb[14]='-';
  326.                 }
  327.                 else if(s3>200)        //测量值大于上限
  328.                 {
  329.                         bb[11]='C';
  330.                         bb[13]='C';
  331.                         bb[14]='C';
  332.                 }
  333.                 else
  334.                 {
  335.                         bb[11]=s3/100+'0';
  336.                         bb[13]=s3/10%10+'0';
  337.                         bb[14]=s3%10+'0';
  338.                 }
  339. ///////////////////////////////////////////
  340.                  if(s4<5) //测量值小于下限
  341.                 {
  342.                         aa[11]='-';
  343.                                 aa[12]='.';
  344.                         aa[13]='-';
  345.                         aa[14]='-';
  346.                 }
  347.                 else if(s4>200)        //测量值大于上限
  348.                 {
  349.                         aa[11]='C';
  350.                         aa[12]='.';
  351.                         aa[13]='C';
  352.                         aa[14]='C';
  353.                 }
  354.                 else
  355.                 {
  356.                         aa[11]=s4/100+'0';
  357.                         aa[12]='.';
  358.                         aa[13]=s4/10%10+'0';
  359.                         aa[14]=s4%10+'0';
  360.                 }
  361.             if(k1==0)
  362.                    {
  363. //                           while(k1==0);
  364.                            dz++;
  365.                         if(dz>200)
  366.                            {
  367.                                    dz=200;
  368.                            }
  369.                    }
  370.         if(k2==0)
  371.                 {
  372. //                        while(k2==0);
  373.                         dz--;
  374.                         if(dz<30)
  375.                         {
  376.                                    dz=30;
  377.                         }
  378.                 }
  379.                 bb[6]=dz/100+'0';
  380.                 bb[7]='.';
  381.                 bb[8]=dz/10%10+'0';
  382.                 bb[9]=dz%10+'0';



  383. ///////////////////////////////////////////


  384.             if(s1<s2)
  385.                 {
  386.                    s=s1;
  387.                 }
  388.                 else s=s2;

  389.             if(s<s3)
  390.                 {
  391.                    s=s;
  392.                 }
  393.                 else s=s3;

  394.              if(s<s4)
  395.                 {
  396.                    s=s;
  397.                 }
  398.                 else s=s4;

  399.                 if(s<dz)
  400.                 {
  401.                         bgz=s*5;
  402.                           for (k=0;k<bgz;k++)
  403.                           {
  404.                             DelayUs2x(150);
  405.                             fmq=0;       //BEEP
  406.                                 led=0;
  407.                           }
  408.                 }
  409.                 fmq=1;
  410.                 led=1;
  411.                 LCD_Write_String(0,0,aa);
  412.                 LCD_Write_String(0,1,bb);
  413.         }
  414. }
复制代码

keil工程文件
以及Proteus仿真原理图压缩至附件
LCD1602显示的超声波测距板_四路_按键.zip (621.4 KB, 下载次数: 96)

评分

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

查看全部评分

回复

使用道具 举报

ID:237863 发表于 2021-4-20 10:17 | 显示全部楼层
这种东西就别上传了,论坛里面太多了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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