找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15045|回复: 2
收起左侧

HC-SR04超声波测距模块接线图和程序

[复制链接]
ID:211103 发表于 2017-6-14 13:14 | 显示全部楼层 |阅读模式
接线图:
原理图.PNG

单片机程序:
  1. #include <AT89X52.h>       //调用51单片机的头文件
  2. #include <intrins.h>
  3. #include <math.h>
  4. //---------------------------------------
  5. //1602液晶相关I/O设置
  6. sbit E=P2^3;               //1602液晶的E脚接在P2.3口上
  7. sbit RW=P2^4;              //1602液晶的RW脚接在P2.4口上
  8. sbit RS=P2^5;              //1602液晶的RS脚接在P2.5口上
  9. //---------------------------------------
  10. //---------------------------------------
  11. //HC-SR04相关I/O设置
  12. sbit TIRG=P3^4;                   //定义IO口,具体可以去查看原理图
  13. sbit ECHO=P3^2;                   //定义IO口,具体可以去查看原理图        
  14. //---------------------------------------         
  15. bit      flag =0;
  16. unsigned char k;
  17. //---------------------------------------
  18. //名称:1602液晶用延时函数
  19. //---------------------------------------
  20. void Delay1602(unsigned int t)
  21. {
  22.      unsigned int k;      //定义一个16位寄存器用来做延时用
  23.      for(k=0;k<t;k++);    //延时
  24. }

  25. //---------------------------------------
  26. //名称:1602液晶忙检测函数
  27. //---------------------------------------
  28. void LCD1602_busy(void)
  29. {
  30.      P0_7=1;              //将P0.7置1,为读状态做准备
  31.      RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  32.      RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  33.      E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
  34.      while(P0_7==1);      //由P0.7读入1,表示1602液晶忙,需要等待
  35.      E=0;                 //读完以后,恢复E的电平
  36. }

  37. //---------------------------------------
  38. //名称:1600写命令函数
  39. //---------------------------------------
  40. void LCD1602_Write_com(unsigned char combuf)
  41. {
  42.      RS=0;                //选择指令寄存器
  43.      RW=0;                //选择写状态
  44.      P0=combuf;           //将命令字通过P0口送至DB
  45.      E=1;                 //E高电平将命令字写入1602液晶
  46.      E=0;                 //写完以后,恢复E的电平
  47. }

  48. //---------------------------------------
  49. //名称:1602写命令函数(带忙检测)
  50. //---------------------------------------
  51. void LCD1602_Write_com_busy(unsigned char combuf)
  52. {
  53.      LCD1602_busy();            //调用忙检测函数
  54.      LCD1602_Write_com(combuf); //调用忙检测函数
  55. }

  56. //---------------------------------------
  57. //名称:1602写数据函数(带忙检测)
  58. ------------------------
  59. void LCD1602_Write_data_busy(unsigned char databuf)
  60. {
  61.      LCD1602_busy();      //调用忙检测函数
  62.      RS=1;                //选择数据寄存器
  63.      RW=0;                //选择写状态
  64.      P0=databuf;          //将命令字通过P0口送至DB
  65.      E=1;                 //E高电平将命令字写入1602液晶
  66.      E=0;                 //写完以后,恢复E的电平
  67. }

  68. //---------------------------------------
  69. //名称:1602液晶显示地址写函数
  70. //---------------------------------------
  71. void LCD1602_Write_address(unsigned char x,unsigned char y)
  72. {
  73.      x&=0x0f;             //列地址限制在0-15间
  74.      y&=0x01;             //行地址限制在0-1间
  75.      if(y==0)             //如果是第一行
  76.          LCD1602_Write_com_busy(x|0x80);        //将列地址写入
  77.      else                 //如果是第二行
  78.          LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入
  79. }

  80. //---------------------------------------
  81. //名称:1602液晶初始化函数
  82. //---------------------------------------
  83. void LCD1602_init(void)
  84. {
  85.      Delay1602(1500);               //调用延时函数
  86.      LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  87.      Delay1602(500);                //调用延时函数
  88.      LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  89.      Delay1602(500);                //调用延时函数
  90.      LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
  91.      LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  92.      LCD1602_Write_com_busy(0x08);  //显示功能关,无光标
  93.      LCD1602_Write_com_busy(0x01);  //清屏
  94.      LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动
  95.      LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
  96. }

  97. //---------------------------------------
  98. //名称:1602液晶指定地址显示函数
  99. //---------------------------------------
  100. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  101. {
  102.      LCD1602_Write_address(x,y);    //先将地址信息写入
  103.      LCD1602_Write_data_busy(buf);  //再写入要显示的数据
  104. }
  105. //---------------------------------------
  106. //名称:定时器0中断服务程序
  107. //---------------------------------------
  108. void Timer0(void) interrupt 1
  109. {                       
  110.    //***此处用户自行添加定时器T0中断处理程序***
  111.         flag=0;
  112.    //******************************************
  113. }
  114. //---------------------------------------
  115. //名称: 主函数
  116. -----------------------
  117. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  118. {
  119.         long S;
  120.         unsigned int i;
  121.         unsigned int  Timeout;
  122.    LCD1602_init();        //调用1602液晶初始化函数
  123.         //***定时器Timer0初始化***
  124.    TMOD&=0xF0;                    //将TMOD的低4位定时器0控制部分清零
  125.    TMOD|=0x01;                    //设置定时器0为方式1
  126.         TMOD=0x01;
  127.    TL0=0;                              //设置定时器0初值低8位
  128.    TH0=0;                              //设置定时器0初值高8位
  129.    TR0=0;                         //停止定时器0
  130.    ET0=1;                         //Timer0中断允许
  131.    //**********************
  132.    //***开全局中断设置****
  133.    //定时器Timer0设置了中断允许,此处要开全局中断
  134.    EA=1;                          //开全局中断
  135.    //*********************
  136.         while(1)
  137.         {               
  138.                 TIRG=1;                                             //发一个脉冲触发信号
  139.                   i=4;                                             //维持约17US,符合不低于10US的要求
  140.       while(i>0)                                  //维持约17US,符合不低于10US的要求
  141.               i--;                                     //维持约17US,符合不低于10US的要求               
  142.                   TIRG=0;                                             //撤销触发信号
  143.                 TR0=0;                                                //关闭定时器
  144.                 TL0=0;                             //设置定时器0初值低8位为0
  145.            TH0=0;                              //设置定时器0初值高8位为0
  146.                 k=0;                         //清除溢出标志
  147.                 flag=0;
  148.                 Timeout=0;
  149.            while((ECHO==0)&&((Timeout++)<50000));                                //等待回响高电平               
  150.            TR0=1;                                            //回响高电平来后启动定时器
  151.                 Timeout=0;
  152.            while((ECHO==1)&&((Timeout++)<50000));                                //等待回响高电平结束后
  153.            TR0=0;                                                //关闭定时器
  154.       S=((TH0*256+TL0)*0.5425)/58;        
  155.                 if(flag==1||S>400)                //超出测量范围显示“-”
  156.                 {                                                         
  157.                            LCD1602_Disp(0, 0, '-');                                  //显示百位-
  158.                            LCD1602_Disp(1, 0, '-');                                  //显示十位-
  159.                            LCD1602_Disp(2, 0, '-');                                  //显示个位-
  160.                            LCD1602_Disp(3, 0, 'C');                                  //显示C
  161.                            LCD1602_Disp(4, 0, 'M');                                //显示M
  162.                 }
  163.                 else                                                                  
  164.                 {                           
  165.                                 LCD1602_Disp(0, 0, S%1000/100+'0');                  //显示百位
  166.                            LCD1602_Disp(1, 0, S%1000%100/10+'0');  //显示十位
  167.                            LCD1602_Disp(2, 0, S%1000%100%10+'0');        //显示个位
  168.                            LCD1602_Disp(3, 0, 'C');                                          //显示C
  169.                            LCD1602_Disp(4, 0, 'M');                                        //显示M
  170.                 }
  171.                 i=18000;                                          //维持约77400US,符合不低于60MS的要求
  172.       while(i>0)                                  //维持约77400US,符合不低于60MS的要求
  173.               i--;                                     //维持约77400US,符合不低于60MS的要求

  174.         }
  175. }



复制代码



回复

使用道具 举报

ID:89286 发表于 2017-7-12 20:19 | 显示全部楼层
此帖仅作者可见

使用道具 举报

ID:238009 发表于 2017-10-11 15:05 | 显示全部楼层
此帖仅作者可见

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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