找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测距单片机C程序+原理图+PCB源文件

  [复制链接]
跳转到指定楼层
楼主


Altium Designer画的超声波测距原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include <reg52.h>         //STC89C52头文件
  2. #define uchar unsigned char   
  3. #define uint unsigned int
  4. unsigned int  time=0;
  5. unsigned int  timer=0;
  6. unsigned long S=0;         //距离变量
  7. bit  flag =0;                 //超声波模块量程溢出标志(>5米时置1)
  8. sbit echo=P1^0;               //超声波模块的发射端
  9. sbit trig=P1^1;               //超声波模块的接收端
  10. sbit ds=P2^2;                //DS18B20的信号线
  11. sbit P24=P2^4;
  12. sbit P25=P2^5;
  13. sbit P26=P2^6;            
  14. sbit P27=P2^7;
  15. sbit P07=P0^7;            
  16. int temp;   
  17. //八位共阳极
  18. unsigned char code shuzu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  19. /*********************************************************/
  20. //毫秒级延时
  21. void delayms(unsigned char z)  
  22. {
  23.        unsigned char a,b;
  24.        for(a=z; a>0; a--)
  25.                 for(b=110; b>0; b--);
  26. }
  27. /*********************************************************/
  28. /*********************************************************/
  29. //微秒级延时
  30. void delayus(unsigned char z)  
  31. {
  32.        while(z)
  33.          z--;
  34. }
  35. /********************************************************/
  36. void delay_ms(unsigned int ms)  //1ms延时
  37. {
  38.     uchar a;
  39.     while(ms--)
  40. for(a=123;a>0;a--);
  41. }
  42. /*********************************************************/
  43. //DS18B20初始化
  44. void ds18b20init()
  45. {
  46.            ds=0;
  47.            delayus(80);                //延时480-960us
  48.            ds=1;
  49.            delayus(4);                 //等待应答
  50. }
  51. /*********************************************************/
  52. //DS18B20读命令子程序(读一字节)
  53. uchar dushuju()
  54. {
  55.      uchar i,dat,m;
  56.      for(i=8;i>0;i--)
  57.      {
  58.            ds=0;
  59.            delayus(1);
  60.            ds=1;
  61.            delayus(2);
  62.            m=ds;
  63.            dat=(m<<7)|(dat>>1);   //读出的数据最低位在最前面,刚好一个字节在dat里
  64.            delayus(8);
  65.       }
  66.     return dat;
  67. }
  68. /*********************************************************/
  69. //DS18B20写命令子程序(写一字节)
  70. void xiemingling(uint shuju)
  71. {
  72.        uint i;
  73.        bit m;
  74.        for(i=8;i>0;i--)
  75.        {
  76.           m=shuju&0x01;
  77.           shuju=shuju>>1;
  78.           if(m)                           //写1
  79.           {
  80.                    ds=0;
  81.                    delayus(2);
  82.                    ds=1;
  83.                    delayus(8);
  84.           }
  85.           else                     //写0
  86.           {
  87.                    ds=0;
  88.                    delayus(8);
  89.                    ds=1;
  90.                    delayus(2);
  91.           }
  92.        }
  93. }

  94. /*********************************************************/  
  95. //DS18B20开始获取温度并转换
  96. void zhuanhuan()
  97. {
  98.            ds18b20init();
  99.            delayms(1);
  100.            xiemingling(0xcc);        //写跳过读ROM指令
  101.            xiemingling(0x44);       //写温度转换命令
  102. }
  103. /*********************************************************/
  104. //DS18B20读寄存器中存储的温度数据
  105. int duwendu()
  106. {
  107.            uint a,b;
  108.            ds18b20init();
  109.            delayms(1);
  110.            xiemingling(0xcc);                     //跳过ROM,忽略64位ROM地址
  111.            xiemingling(0xbe);                    //读内部RAM中的9字节的温度数据
  112.            a=dushuju();                            //读低8位
  113.            b=dushuju();                           //读高8位
  114.            b=b<<8;                                //高8位左移8位
  115.            temp=b|a;                             // 高8位和低8位组合为1个字
  116.            temp=temp*0.0625;              //温度在寄存器中位12位,分辨率为0.0625度
  117.            return temp;
  118. }

  119. /*********************************************************/
  120. //显示子程序
  121. void xianshi(unsigned long num)
  122. {
  123.           unsigned char bai,shi,ge;
  124.           bai=num/100;                        //分离三位距离数据
  125.           shi=num%100/10;                     
  126.           ge=num%10;                        
  127.                          P24=0;
  128.                          P0=shuzu[ge];
  129.                          delay_ms(1);
  130.                          P24=1;

  131.                          P25=0;
  132.                          P0=shuzu[shi];
  133.                          P07=1;
  134.                          delay_ms(1);
  135.                          P25=1;

  136.                          P26=0;
  137.                          P0=shuzu[bai];
  138.                          delay_ms(1);
  139.                          P26=1;

  140.         //                 P24=0;
  141. //                         P0=shuzu[bai];
  142. //                         P07=1;
  143.         //                 delay_ms(1);
  144. //                         P24=1;

  145. }

  146. /*********************************************************/

  147. //计算距离子程序
  148. void Conut()
  149. {
  150.         float a;
  151.         time=TH0*256+TL0;             //这是最后计算到的时间,但应该再乘以12/11.092
  152.                                                    //时间应该是time*12/11.0592
  153.         TH0=0;                                   //定时器0的初始值位0           
  154.         TL0=0;
  155.         a=(331.5+0.607*temp);    //声速与温度的函数关系:声速=331.5+0.607*温度
  156.         S=(time*a/200)/100;        //算出来是cm     
  157.         if (S>=500)                     //最大距离为5m,即500cm
  158.         S=888;
  159.         if (flag==1)                     //判断是否溢出
  160.         {
  161.           S=888;
  162.           flag=0;
  163.           TH0=0;
  164.           TL0=0;
  165.        }
  166. }

  167. /********************************************************/
  168. //初始化定时器0和定时器1
  169. void T0_init()
  170. {
  171.           TMOD=0x11;   
  172.            TH0=0;            
  173.            TL0=0;         
  174.            TH1=0xf8;        //定时器1赋初值,应该是2ms
  175.            TL1=0x30;
  176.            ET0=1;            
  177.            ET1=1;     
  178.            TR1=1;      
  179.            EA=1;
  180. }
  181. void  main( )
  182. {  
  183.      unsigned int i;
  184.      T0_init();   
  185.      while(1)
  186.      {
  187.          duwendu();                               //获取温度后计算相应声速,从而计算距离
  188.          while(!echo);                            //当echo为0时等待
  189.          TR0=1;                                    //开启定时器0
  190.          while(echo);                            //当echo为1计数并等待
  191.          TR0=0;                                   //关闭定时器0
  192.          Conut();                                  //计算距离
  193.          for(i=150;i>0;i--)              
  194.          {
  195.                   xianshi(S);                      //数码管显示
  196.          }
  197.      }
  198. }
  199. /********************************************************/
  200. void zd0() interrupt 1   
  201. {
  202.     flag=1;                                            //中断溢出标志
  203. }                       
  204. /********************************************************/
  205. void  zd3()  interrupt 3   
  206. ……………………

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

所有资料51hei提供下载:
超声波测距原理图和PCB源文件.zip (1.61 MB, 下载次数: 171)
超声波测距程序.zip (25.32 KB, 下载次数: 129)





评分

参与人数 3黑币 +90 收起 理由
9526 + 5 很给力!
huqi9881 + 5 绝世好帖!
admin + 80 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:384567 发表于 2018-9-3 15:33 | 只看该作者
不错不错
回复

使用道具 举报

板凳
ID:393881 发表于 2018-9-5 10:05 | 只看该作者
很有帮助的帖子。棒棒哒
回复

使用道具 举报

地板
ID:229133 发表于 2018-9-8 16:59 | 只看该作者
有用,不错
回复

使用道具 举报

5#
ID:791371 发表于 2020-6-28 16:14 | 只看该作者
很有帮助的帖子。棒棒哒
回复

使用道具 举报

6#
ID:550671 发表于 2020-11-23 17:37 | 只看该作者
PCB打开没有,原理图有。
回复

使用道具 举报

7#
ID:550671 发表于 2020-11-26 15:59 | 只看该作者
请问,P1,P2,P3是什么元器件??
回复

使用道具 举报

8#
ID:843473 发表于 2020-12-2 23:53 来自手机 | 只看该作者
找了很多,还是这个比较全
回复

使用道具 举报

9#
ID:800086 发表于 2020-12-29 09:30 | 只看该作者
不错可以学习,简单很实用。谢谢分享
回复

使用道具 举报

10#
ID:927552 发表于 2021-5-27 12:16 | 只看该作者
云烨yy 发表于 2020-11-23 17:37
PCB打开没有,原理图有。

你解决了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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