找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测距+温度+报警的单片机代码

  [复制链接]
跳转到指定楼层
楼主
可以测当前距离,当超过阈值距离时,蜂蜜器报警,并且实时显示温度数据

制作出来的实物图如下:


单片机源程序如下:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. int num=0;
  6. unsigned char table[]={"0123456789"};//显示的数值
  7. //   1602的引脚定义
  8. sbit RW=P2^5;
  9. sbit RS=P2^6;  
  10. sbit E=P2^7;   

  11. //报警引脚定义
  12. sbit feng=P2^4;
  13. sbit led=P1^2;

  14. sbit key1=P1^0;
  15. sbit key2=P1^1;

  16. int numm=0,nnum=0;

  17. void delayms(unsigned int ms)
  18. {
  19.         unsigned char i=100,j;
  20.         for(;ms;ms--)
  21.         {
  22.                 while(--i)
  23.                 {
  24.                         j=10;
  25.                         while(--j);
  26.                 }
  27.         }
  28. }

  29. bit flag;           //温度变量
  30. uint temp;
  31. sbit ds=P1^3;  //温度引脚

  32. //超声波位定义
  33. sbit Trig = P2^1;
  34. sbit Echo = P2^0;
  35. uint time=0;
  36. unsigned long S=0;
  37. bit flagg=0;

  38. void delay2(uchar p)
  39.         {
  40.           uchar l,k;
  41.            for(l=p;l>0;l--)
  42.               for(k=110;k>0;k--);
  43.         }

  44. void delay(uchar z)
  45. {
  46.     while(z--);
  47. }

  48. //温度初始化函数                        
  49. void ds_reste()         
  50. {
  51.         ds=1;
  52.         delay(5);
  53.         ds=0;
  54.         delay(80);
  55.         ds=1;
  56.         delay(14);
  57.         if(ds==0)                 //判断ds总线被拉低
  58.         flag=1;
  59.         else
  60.         flag=0;
  61.         delay(20);
  62. }

  63. //读一位字节
  64. bit ds_read_byte()        
  65. {
  66.          bit dat;
  67.          ds=0;               
  68.          _nop_();
  69.          _nop_();
  70.          ds=1;
  71.          _nop_();
  72.          dat=ds;         
  73.          delay(10);
  74.          return dat;
  75. }

  76. //读一位字节
  77. uchar ds_read()        
  78. {
  79.         uchar i,j,k;
  80.       for(i=0;i<8;i++)
  81.         {
  82.         j=ds_read_byte();
  83.         k=(j<<7)|(k>>1);
  84.         }
  85.          return k;
  86. }

  87. //写入数据
  88. void ds_write(uchar dat)
  89. {
  90.          uchar i;
  91.          for(i=0;i<8;i++)
  92.     {
  93.          ds=0;
  94.          _nop_();
  95.          ds=dat&0x01;
  96.          delay(6);
  97.          ds=1;
  98.          dat=dat>>1;
  99.         }
  100.          delay(6);
  101. }

  102. //读取温度
  103. uint read_temp()         
  104. {
  105.         uchar a,b;
  106.         ds_reste();
  107.         ds_write(0xcc);
  108.         ds_write(0xbe);
  109.         a=ds_read();
  110.         b=ds_read();
  111.         temp=b;
  112.         temp=temp<<8;
  113.         temp=temp|a;
  114.         temp=temp*0.0625*10+0.5;                 
  115.         return temp;
  116. }

  117. //写入命令1602
  118. void write_com(uchar com)           
  119. {
  120.         RS=0;
  121.         RW=0;
  122.         E=0;
  123.         P0=com;           
  124.         delay2(5);
  125.         E=1;
  126.         delay2(5);
  127.         E=0;
  128. }

  129. //写入数据 1602
  130. void write_data(uchar date)        
  131. {
  132.         RS=1;
  133.         RW=0;
  134.         E=0;
  135.         P0=date;               
  136.         delay2(5);
  137.         E=1;
  138.         delay2(5);
  139.         E=0;
  140. }

  141. //1602初始化显示
  142. void init()                                 
  143. {
  144.     RS=0;
  145.         write_com(0x38);
  146.          write_com(0x0c);
  147.          write_com(0x06);
  148.         write_com(0x01);
  149.         write_com(0x80);
  150. }

  151. //温度在1602上显示出来
  152. void display(uint tempp)           
  153. {  
  154.          write_com(0x80+0x0b);                        
  155.          write_data(table[tempp/100]);         
  156.          delay2(0);
  157.   
  158.          write_com(0x80+0x0c);
  159.          write_data(table[tempp%100/10]);           
  160.          delay2(0);        

  161.             write_com(0x80+0x0d);
  162.          write_data('.');                           
  163.          delay2(0);
  164.    
  165.             write_com(0x80+0x0e);
  166.          write_data(table[tempp%100%10]);
  167.          delay2(0);                                                         

  168.          write_com(0x80+0x0f);
  169.          write_data('C');                                    
  170.          delay2(0);

  171.          write_com(0x80+0x09);
  172.          write_data('T');                                    
  173.          delay2(0);

  174.          write_com(0x80+0x0a);
  175.          write_data(':');                                 
  176.          delay2(0);

  177. }

  178. //超声波测距
  179. void Conut(void)
  180.         {  
  181.          time=TH0*256+TL0;
  182.          TH0=0;
  183.          TL0=0;
  184.          S=(time*1.7)/100+1;                //算出来测距值单位是CM
  185.          if((S>1000)||S<1||flagg==1)           //超出测量范围显示“***”
  186.          {         
  187.           flagg=0;
  188.           write_com(0x80+0x40);
  189.           write_data('c');                           
  190.           delay2(0);
  191.          
  192.           write_com(0x80+0x41);
  193.           write_data('j');                           
  194.           delay2(0);         

  195.           write_com(0x80+0x42);
  196.           write_data(':');                           
  197.           delay2(0);


  198.           write_com(0x80+0x43);
  199.           write_data('*');                           
  200.           delay2(0);

  201.           write_com(0x80+0x44);
  202.           write_data('*');                           
  203.           delay2(0);
  204.           write_com(0x80+0x45);
  205.           write_data('*');                           
  206.           delay2(0);

  207.           write_com(0x80+0x46);
  208.           write_data('M');                           
  209.           delay2(0);        //显示M
  210.           write_com(0x80+0x47);
  211.           write_data('M');                           
  212.           delay2(0);        //显示M
  213.          }
  214.       else
  215.          {
  216.            write_com(0x80+0x40);
  217.           write_data('c');                           
  218.           delay2(0);

  219.           write_com(0x80+0x41);
  220.           write_data('j');                           
  221.           delay2(0);

  222.           write_com(0x80+0x42);
  223.           write_data(':');                           
  224.           delay2(0);
  225.          
  226.           write_com(0x80+0x43);
  227.           write_data(table[S%1000/100]);                           
  228.           delay2(0);

  229.           write_com(0x80+0x44);
  230.           write_data(table[S%1000%100/10]);                           
  231.           delay2(0);

  232.           write_com(0x80+0x45);
  233.           write_data(table[S%1000%10 %10]);                           
  234.           delay2(0);

  235.           write_com(0x80+0x46);
  236.           write_data('C');                           
  237.           delay2(0);
  238.          
  239.           write_com(0x80+0x47);
  240.           write_data('M');                           
  241.           delay2(0);
  242.          }
  243.         }
  244. //显示按键输入的值
  245. void display1()
  246. {
  247.           write_com(0x80+0x00);
  248.           write_data('S');                           
  249.           delay2(0);

  250.           write_com(0x80+0x01);
  251.           write_data('z');                           
  252.           delay2(0);

  253.           write_com(0x80+0x02);
  254.           write_data(':');                           
  255.           delay2(0);            
  256.             
  257.           write_com(0x80+0x03);
  258.           write_data(table[num%1000/100]);                           
  259.           delay2(0);

  260.           write_com(0x80+0x04);
  261.           write_data(table[num%1000%100/10]);                           
  262.           delay2(0);

  263.           write_com(0x80+0x05);
  264.           write_data(table[num%1000%10 %10]);                           
  265.           delay2(0);

  266.           write_com(0x80+0x06);
  267.           write_data('C');                           
  268.           delay2(0);

  269.           write_com(0x80+0x07);
  270.           write_data('M');                           
  271.           delay2(0);
  272. }
  273. //按键控制
  274. void KEY()
  275. {
  276.    if(key1==0)
  277.    {
  278.              delay2(2);         
  279.           if(key1==0)
  280.           {         
  281.               num+=10;
  282.               if(num==1000)num=0;
  283.           }
  284.            while(!key1);
  285.            delay2(2);
  286.            while(!key1);
  287.    }

  288.       if(key2==0)
  289.    {
  290.              delay2(2);
  291.           if(key2==0)
  292.           {         
  293.              num-=10;
  294.              if(num==0)num=0;
  295.           }
  296.            while(!key2);
  297.            delay2(2);
  298.            while(!key2);
  299.    }
  300. }
  301. //蜂鸣器报警
  302. void BEEP()
  303. {
  304.    if(num<S)
  305.    {
  306.              feng=1;
  307.           led=1;
  308.           delay2(60);
  309.           feng=0;
  310.           led=0;
  311.           delay2(60);
  312.    }
  313.    else feng=0;
  314. }


  315. void  StartModule()          //启动模块
  316.   {
  317.           Trig=1;         //启动一次模块
  318.           _nop_(); _nop_(); _nop_();
  319.           _nop_(); _nop_(); _nop_();
  320.           _nop_(); _nop_(); _nop_();
  321.           _nop_(); _nop_(); _nop_();
  322.           _nop_(); _nop_(); _nop_();
  323.           _nop_(); _nop_(); _nop_();
  324.           _nop_(); _nop_(); _nop_();
  325.            
  326.           Trig=0;  
  327.          
  328.   }

  329. void tempchang(void)
  330. {
  331.            ds_reste();          //d8b20的初始化
  332.         delay2(1);
  333.         ds_write(0xcc);        //d8b20的数据
  334.         ds_write(0x44);        //d8b20的数据
  335. }

  336. void main()
  337. {        
  338.          feng=0;
  339.          led=0;
  340.          EA=1;
  341. //         IT0=1;
  342. //         EX0=1;         
  343.          TMOD=0x01;                   //设T0为方式1,GATE=1;
  344.          TH0=0;
  345.          TL0=0;
  346.          TR0=1;         
  347.          ET0=1;             //允许T0中断
  348. //       TH1=(65536-5000)/256;
  349. //         TL1=(65536-5000)%256;
  350. //         TR1=1;         
  351. //         ET1=1;         
  352.          init();                          //1602的初始化                  
  353.      
  354.          while(1)
  355.          {
  356.              display1();        //显示按键值                           
  357.              KEY();                         //按键         
  358.              BEEP();                //蜂鸣器
  359.                StartModule();
  360.              while(!Echo);          //当RX为零时等待
  361.              TR0=1;                         //开启计数
  362.              while(Echo);    //当RX为1计数并等待
  363.              TR0=0;                     //关闭计数        
  364.              Conut();             //距离显示
  365.               delayms(10);   
  366.              tempchang();    //温度开始转换
  367.              display(read_temp());//温度显示
  368. }         
  369. }
复制代码

所有资料51hei提供下载:
超声波测距及温度.zip (1.06 MB, 下载次数: 216)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:473159 发表于 2019-2-5 21:11 | 只看该作者
好的,收下了,谢谢!

评分

参与人数 3黑币 +85 收起 理由
jinsheng7533967 + 35
Trump1438 + 15
shuisheng60 + 35

查看全部评分

回复

使用道具 举报

板凳
ID:576506 发表于 2019-7-8 09:12 | 只看该作者
yoxi 发表于 2019-2-5 21:11
好的,收下了,谢谢!

想要个原理图,可以问一下LED那里如何接线吗
回复

使用道具 举报

地板
ID:576506 发表于 2019-7-8 09:13 | 只看该作者
想要个原理图。可以问一下LED那里如何接线的吗
回复

使用道具 举报

5#
ID:282095 发表于 2019-7-8 09:39 | 只看该作者
超声波和红外测距系统
回复

使用道具 举报

6#
ID:70932 发表于 2019-8-17 12:00 | 只看该作者
参考一下,找了好久
回复

使用道具 举报

7#
ID:601374 发表于 2019-8-18 20:24 | 只看该作者
找到家的感觉,希望在这里找到互相交流的朋友。
回复

使用道具 举报

8#
ID:602119 发表于 2019-8-22 22:21 | 只看该作者
请问有仿真图嘛!!楼主看看我
回复

使用道具 举报

9#
ID:610634 发表于 2019-9-19 15:50 | 只看该作者
仿真图呀,楼主
回复

使用道具 举报

10#
ID:630001 发表于 2019-10-25 13:41 | 只看该作者
谢谢楼主
回复

使用道具 举报

11#
ID:630958 发表于 2019-10-27 17:39 | 只看该作者
为什么我的Sz显示0,T显示5.9C
回复

使用道具 举报

12#
ID:706569 发表于 2020-3-14 14:09 | 只看该作者
请问有原理图
回复

使用道具 举报

13#
ID:413568 发表于 2020-5-8 10:46 | 只看该作者
这东西有问题,用不了,仿真时显示0
回复

使用道具 举报

14#
ID:191844 发表于 2020-5-16 23:04 | 只看该作者
完全 正常 显示0 是因为你的传感器接错线了
回复

使用道具 举报

15#
ID:785709 发表于 2020-6-22 10:22 | 只看该作者
大佬有没有Proteus仿真啊
回复

使用道具 举报

16#
ID:783878 发表于 2021-1-10 13:48 | 只看该作者
测距带有温度补偿吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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