找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机HC-SR04超声波测距原理图pcb文件与程序源码

  [复制链接]
跳转到指定楼层
楼主
关于HC-SR04超声波模块,基于51单片机程序加硬件。
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>

  3. sbit RX=P2^7; //接收端
  4. sbit TX=P2^6; //控制端
  5. sbit RS=P2^5; //定义LCD引脚
  6. sbit RW=P2^4;
  7. sbit E=P2^3;

  8. unsigned char lcd0[]="Measuring  Range";
  9. unsigned char lcd1[]=" ERROR ";
  10. unsigned char lcd2[]=" TURE ";
  11. // unsigned char lcd3[]="999";
  12. unsigned char lcd_r_start();         //读状态字函数
  13. unsigned char i;
  14. unsigned long S=0;
  15. unsigned int  time=0;

  16. void lcd_w_cmd(unsigned char com);   //写命令字函数
  17. void lcd_w_dat(unsigned char dat);   //写数据函数
  18. void lcd_int();                      //LCD初始化函数
  19. void int_1();
  20. void delay(unsigned int ms);
  21. void delay1();
  22. bit  flag=1;

  23. //函数功能:LCD初始化       
  24. void lcd_int()
  25. {
  26. lcd_w_cmd(0x38); //设置工作方式
  27. lcd_w_cmd(0x0C); //设置光标
  28. lcd_w_cmd(0x01); //清屏
  29. lcd_w_cmd(0x06); //设置输入方式
  30. lcd_w_cmd(0x80); //设置初始显示位置
  31. }
  32. //函数功能:读状态字
  33. //形式参数:无
  34. //返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙
  35.         unsigned char lcd_r_start()
  36.         {
  37.          unsigned char s;
  38.          RW=1;            //RW=1,RS=0,读LCD状态
  39.          delay1();
  40.          RS=0;
  41.          delay1();
  42.          E=1;
  43.          delay1();
  44.          P1=s;  //s=P1 从LCD的数据口读状态
  45.          delay1();
  46.          E=0;
  47.          delay1();
  48.          RW=0;
  49.          delay1();
  50.          return(s);
  51.          }         
  52. //函数功能:写命令字
  53. //形式参数:命令字已存入com单元中
  54. //返回值:无
  55. void lcd_w_cmd(unsigned char com)
  56. {
  57.    unsigned char i;
  58.    do{
  59.          i=lcd_r_start();
  60.          i&=0x80;
  61.          delay(2);
  62.          }
  63.          while(i!=0);
  64.          RW=0;
  65.          delay1();
  66.          RS=0;
  67.          delay1();
  68.          E=1;
  69.          delay1();
  70.          P1=com;
  71.          delay1();
  72.          E=0;
  73.          delay1();
  74.          RW=1;
  75.          delay(255);
  76. }
  77. //函数功能:写数据
  78. //形式参数:数据已存入dat单元中
  79. //返回值:无
  80. void lcd_w_dat(unsigned char dat)
  81.   {
  82.            unsigned char i;
  83.         do{
  84.          i=lcd_r_start();
  85.          i &=0x80;
  86.          delay(2);
  87.          }
  88.         while(i!=0);
  89.          RW=0;
  90.          delay1();
  91.          RS=1;
  92.          delay1();
  93.          E=1;
  94.          delay1();
  95.          P1=dat;
  96.          delay1();
  97.          E=0;
  98.          delay1();
  99.          RW=1;
  100.          delay(255);
  101.   }
  102. /*********************超声波测距公式*********************/
  103. void Conut(void)
  104. {
  105.         time=TH0*256+TL0;
  106.         TH0=0;
  107.         TL0=0;
  108.         S=(time*1.87)/100;     //算出来是CM
  109.         lcd_w_cmd(0xC0);
  110.         lcd_w_dat(S/100+0x30);//送数据百位
  111.         lcd_w_cmd(0xC1);
  112.         lcd_w_dat(S%100/10+0x30);//送数据十位
  113.         lcd_w_cmd(0xC2);
  114.         lcd_w_dat(S%100%10+0x30);//送数据个位
  115.         if((S>=200)||flag==1)
  116.         {
  117.                 flag=0;       
  118.                 lcd_w_cmd(0xCA);                   //设置显示位置
  119.             for(i=0;lcd1[i]!='\0';i++)          //显示字符串,字符串结束符为'\0'
  120.                 {
  121.                 lcd_w_dat(lcd1[i]);}       
  122.         }
  123.         else
  124.         {
  125.                 lcd_w_cmd(0xCA);                   //设置显示位置
  126.                 for(i=0;lcd2[i]!='\0';i++)          //显示字符串,字符串结束符为'\0'
  127.                 {
  128.                 lcd_w_dat(lcd2[i]);}       
  129.         }
  130. //     if((S==999)||flag==1)
  131. //         {
  132. //                 flag=0;
  133. //                 lcd_w_cmd(0xC0);                   //设置显示位置
  134. //             for(i=0;lcd3[i]!='\0';i++)          //显示字符串,字符串结束符为'\0'
  135. //                 {
  136. //                 lcd_w_dat(lcd3[i]);}       
  137. //         }
  138. }
  139. void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围
  140. {
  141.         flag=1;                     //中断溢出标志
  142. }
  143. void  StartModule()          //T1中断用来扫描数码管和计800MS启动模块
  144. {
  145.         TX=1;                     //800MS  启动一次模块
  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.         _nop_();
  165.         _nop_();
  166.         _nop_();
  167.         TX=0;
  168. }
  169. void main()
  170. {
  171.         delay(40);
  172.         lcd_int();
  173.         TMOD=0x01;                   //设T0为方式1,GATE=1;
  174.         TH0=0;
  175.         TL0=0;         
  176.         ET0=1;             //允许T0中断
  177.         EA=1;
  178.         P1=0xff;                           //送全1到P1口       
  179.                  
  180.         lcd_w_cmd(0x80);                   //设置显示位置
  181.         for(i=0;lcd0[i]!='\0';i++)          //显示字符串,字符串结束符为'\0'
  182.         {
  183.         lcd_w_dat(lcd0[i]);
  184.         delay1();}       
  185.         lcd_w_cmd(0xc3);
  186.         lcd_w_dat('c');
  187.         lcd_w_cmd(0xc4);
  188.         lcd_w_dat('m');
  189. ……………………

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

所有资料51hei提供下载:
超声波硬件.rar (653.95 KB, 下载次数: 593)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:501901 发表于 2019-3-31 19:43 | 只看该作者
跪求代码发邮箱,57469263@qq.com
回复

使用道具 举报

板凳
ID:472273 发表于 2019-4-21 21:12 来自手机 | 只看该作者
电路有问题…
回复

使用道具 举报

地板
ID:582963 发表于 2019-7-13 15:35 | 只看该作者

我的显示不出来,你解决了吗?
回复

使用道具 举报

5#
ID:378732 发表于 2019-11-22 17:03 | 只看该作者
S=(time*1.87)/100; 这段是啥意思?不是1.7吗?
回复

使用道具 举报

6#
ID:711435 发表于 2020-3-19 11:17 | 只看该作者
感谢楼主分享,这个可以接入声光提示电路吗
回复

使用道具 举报

7#
ID:711720 发表于 2020-3-19 19:20 | 只看该作者
跪求代码发邮箱,853933066@qq.com
回复

使用道具 举报

8#
ID:628110 发表于 2022-4-19 12:46 | 只看该作者
程序注释有问题,如果不知道延时时间就不要乱写,看了半小时这个代码才发现注释好多乱写的,什么800ms什么T1之类的。只初始了一个中断函数注释里居然出现了俩中断,不看驱动流程都不知道是程序注释有问题。
回复

使用道具 举报

9#
ID:195496 发表于 2023-11-24 08:15 | 只看该作者
呵呵呵,不要太当真,能有个参考的思路,有时候也是很难得的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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