找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3853|回复: 4
收起左侧

51单片机超声波四方向测距系统Proteus仿真+源码设计

  [复制链接]
ID:318030 发表于 2018-6-19 17:44 | 显示全部楼层 |阅读模式
这是一个基于51单片机设计的超声波四方向测距系统,能够在LCD1602上显示四路的距离,通过调试,可以执行。

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

单片机源程序如下:
  1. #include "LCD1602DRV.h"
  2. #include "STCEEPROM.h"
  3. sbit  RX1 = P3^3;
  4. sbit  RX2 = P3^4;
  5. sbit  RX3 = P3^5;
  6. sbit  RX4 = P3^6;
  7. sbit  TX = P3^7;

  8. sbit LED3 = P2^2;
  9. sbit LED2 = P2^1;
  10. sbit LED1 = P2^0;
  11. sbit SPEAK = P2^3;

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

  15. uint  time=0;
  16. uint  timer=0;
  17. uint S=0,S1=0,S2=0,S3=0,S4=0;

  18. bit flag =0;
  19. uchar KEY_flag=0;
  20. //延时函数
  21. void Conut(void)
  22. {
  23.          time=TH0*256+TL0;
  24.          TH0=0;
  25.          TL0=0;
  26.        
  27.          S=(time*1.87)/100;     //算出来是CM
  28.          if((S>=700)||flag==1) //超出测量范围显示“-”
  29.          {         
  30.           flag=0;
  31.          }
  32. }
  33. void main(void)
  34. {       
  35.         uint SET_H=90,SET_L=30;
  36.   LCD1602_Init();//液晶初始化
  37.   SetRowCol(0,0);
  38.         printf("000 000 000 000");
  39.         SetRowCol(1,0);
  40.         printf("Set H:    L:   ");
  41.         TMOD=0x11;                   //设T0为方式1,GATE=1;
  42.         TH0=0;
  43.         TL0=0;         
  44.         TH1=0xf8;                   //2MS定时
  45.         TL1=0x30;
  46.         ET0=1;             //允许T0中断
  47.         ET1=1;                           //允许T1中断
  48.         TR1=1;                           //开启定时器
  49.         EA=1;                           //开启总中断
  50.         EA=0;
  51.         //SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
  52.         //SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
  53.         EA=1;

  54.         while(1)
  55.         {

  56.                 while(!RX1);                    //当RX为零时等待
  57.                 TR0=1;                            //开启计数
  58.                 while(RX1);                        //当RX为1计数并等待
  59.                 TR0=0;                                //关闭计数
  60.                 Conut();
  61.                 S1=S;
  62.                 /////////////////////////////
  63.                 while(!RX2);                    //当RX为零时等待
  64.                 TR0=1;                            //开启计数
  65.                 while(RX2);                        //当RX为1计数并等待
  66.                 TR0=0;                                //关闭计数
  67.                 Conut();
  68.                 S2=S;
  69.                 /////////////////////////////
  70.                 while(!RX3);                    //当RX为零时等待
  71.                 TR0=1;                            //开启计数
  72.                 while(RX3);                        //当RX为1计数并等待
  73.                 TR0=0;                                //关闭计数
  74.                 Conut();
  75.                 S3=S;
  76.                 /////////////////////////////
  77.                 while(!RX4);                    //当RX为零时等待
  78.                 TR0=1;                            //开启计数
  79.                 while(RX4);                        //当RX为1计数并等待
  80.                 TR0=0;                                //关闭计数
  81.                 Conut();
  82.                 S4=S;
  83.                 /////////////////////////////////////
  84.                 SetRowCol(0,0);
  85.                 printf("%3d",S1);
  86.                 SetRowCol(0,4);
  87.                 printf("%3d",S2);
  88.                 SetRowCol(0,8);
  89.                 printf("%3d",S3);
  90.                
  91.                 SetRowCol(0,12);
  92.                 printf("%3d",S4);
  93.                 /////////////////////////////////
  94.                 if((S1>SET_H)&&(S2>SET_H)&&(S3>SET_H)&&(S4>SET_H))//远,不报警
  95.                 {
  96.                         LED1=0;LED2=1;LED3=1;SPEAK=0;
  97.                         delayms(10);
  98.                 }
  99.                 if((S1<SET_H&&S1>SET_L)||(S2<SET_H&&S2>SET_L)||(S3<SET_H&&S3>SET_L)||(S4<SET_H&&S4>SET_L))//中,警告       
  100.                 {
  101.                         LED1=1;LED2=1;LED3=0;SPEAK=1;
  102.                         delayms(10);
  103.                 }       
  104.                 if((S1<SET_L)||(S2<SET_L)||(S3<SET_L)||(S4<SET_L))//近,报警
  105.                 {
  106.                         LED1=1;LED2=0;LED3=1;SPEAK=1;
  107.                         delayms(10);
  108.                 }
  109.                 if(!KEY1)
  110.                 {
  111.                         delayms(10);
  112.                         if(!KEY1)
  113.                         {
  114.                                 KEY_flag++;       
  115.                                 ISP_ERASE(0x2c00);                //注意:字节编程时必须要先要擦除整个扇区       
  116.                                 ISP_PROGRAM(0x2c00, SET_H/256);
  117.                                 ISP_PROGRAM(0x2c01, SET_H);
  118.                                 ISP_PROGRAM(0x2c02, SET_L/256);
  119.                                 ISP_PROGRAM(0x2c03, SET_L);
  120.                         }
  121.                         while(!KEY1);
  122.                         delayms(10);
  123.                 }
  124.                 if(!KEY2)
  125.                 {
  126.                         delayms(10);
  127.                         if(!KEY2)
  128.                         {
  129.                                 if(KEY_flag%2==0)SET_H++;
  130.                                 if(KEY_flag%2==1)SET_L++;
  131.                         }
  132.                         while(!KEY2);
  133.                         delayms(10);
  134.                 }
  135.                 if(!KEY3)
  136.                 {
  137.                         delayms(10);
  138.                         if(!KEY3)
  139.                         {
  140.                                 if(KEY_flag%2==0)SET_H--;
  141.                                 if(KEY_flag%2==1)SET_L--;
  142.                         }
  143.                         while(!KEY3);
  144.                         delayms(10);
  145.                 }
  146.           SetRowCol(1,6);
  147.                 printf("%03d",SET_H);
  148.                 SetRowCol(1,12);
  149.                 printf("%03d",SET_L);
  150.         }
  151. }

  152. /********************************************************/
  153. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  154.   {
  155.     flag=1;                                                         //中断溢出标志
  156.   }
  157. ……………………

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

所有资料51hei提供下载(仿真+源代码):
keil.zip (167.1 KB, 下载次数: 117)

评分

参与人数 2黑币 +53 收起 理由
zsyzdx + 3 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:495096 发表于 2019-4-17 07:59 | 显示全部楼层
学习了
回复

使用道具 举报

ID:543604 发表于 2019-5-22 11:19 | 显示全部楼层
请问超声波HC-SR04.hex文件怎么编写的呢
回复

使用道具 举报

ID:434366 发表于 2019-5-22 18:06 | 显示全部楼层
收到,谢谢,赞一个
回复

使用道具 举报

ID:231648 发表于 2020-3-25 15:18 | 显示全部楼层
学习了,多谢博主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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