当前位置:首页 > 技术学院 > 热搜器件
[导读][cpp] view plaincopy /*温度传感器18B20--串口显示温度*/ #include<reg52.h> #include <intrins.h> typedef unsigned char uint8; typedef unsigned int uint16; typedef

  1. /*温度传感器18B20--串口显示温度*/  
  2. #include<reg52.h>  
  3. #include <intrins.h>   
  4.   
  5. typedef unsigned char uint8;  
  6. typedef unsigned int  uint16;  
  7. typedef          char int8;  
  8. typedef          int int16;  
  9. sbit DQ=P3^2;    //温度输入口  
  10.   
  11. void nops()  
  12. {  
  13.     _nop_();  
  14.     _nop_();  
  15.     _nop_();  
  16.     _nop_();  
  17. }  
  18.   
  19. void delay(uint16 n)  
  20. {  
  21.     while(n--);  
  22. }  
  23.   
  24. void delay_ms(uint16 n)  
  25. {  
  26.     uint8 m=120;  
  27.   
  28.     while (n--)  
  29.         while (m--);  
  30. }  
  31.   
  32. void DS18b20_reset(void)  
  33. {  
  34.     bit flag=1;  
  35.         while (flag)  
  36.         {  
  37.             DQ = 1;  
  38.             delay(1);   //7.5us  
  39.             DQ = 0;  
  40.             delay(50); //139.8us  
  41.             DQ = 1;   
  42.             delay(6);  // 21us  
  43.             flag = DQ;  
  44.         }  
  45.     delay(45);    //延时500us  
  46.     DQ=1;  
  47. }  
  48.   
  49.   
  50. /* 
  51.  * 18B20写1个字节函数 
  52.  * 向1-WIRE总线上写一个字节 
  53. */  
  54. void write_byte(uint8 val)  
  55. {  
  56.     uint8 i;  
  57.   
  58.     for (i=0; i<8; i++)  
  59.     {  
  60.         DQ = 1;  
  61.         _nop_();     //两次传送间隔大于1us  
  62.         DQ = 0;  
  63.         nops(); //4us  
  64.         DQ = val & 0x01;      //最低位移出  
  65.         delay(6);           //66us  (30US)  
  66.         val >>= 1;          //右移一位  
  67.     }  
  68.     DQ = 1;  
  69.     delay(1);    
  70. }  
  71.   
  72.   
  73. /* 
  74.  * 18B20读1个字节函数 
  75.  * 从1-WIRE总线上读取一个字节 
  76. */  
  77. uint8 read_byte(void)  
  78. {  
  79.     uint8 i, value=0;  
  80.   
  81.     for (i=0; i<8; i++)  
  82.     {  
  83.         value >>= 1;  
  84.         DQ=1;  
  85.         _nop_();  
  86.         DQ = 0;  
  87.         nops();   //4us  
  88.         DQ = 1;  
  89.         nops();   //4us   
  90.         if (DQ)  
  91.             value|=0x80;  
  92.         delay(6);           //66us  
  93.     }  
  94.     DQ=1;  
  95.     return value;  
  96. }  
  97.   
  98.   
  99. /* 
  100.  * 启动温度转换 
  101. */  
  102. void start_temp_sensor(void)  
  103. {  
  104.    DS18b20_reset();  
  105.    write_byte(0xCC); // 发Skip ROM命令  
  106.    write_byte(0x44);// 发转换命令  
  107. }  
  108.   
  109.   
  110. /* 
  111.  * 读出温度 
  112. */  
  113. int16 read_temp(void)  
  114. {  
  115.     uint8 temp_data[2]; // 读出温度暂放  
  116.     int16 temp;  
  117.   
  118.     DS18b20_reset();  // 复位  
  119.     write_byte(0xCC); // 发Skip ROM命令  
  120.     write_byte(0xBE); // 发读命令  
  121.     temp_data[0]=read_byte();  //温度低8位  
  122.     temp_data[1]=read_byte();  //温度高8位  
  123.   
  124.     temp = temp_data[1];  
  125.     temp <<= 8;  
  126.     temp |= temp_data[0];  
  127.     temp >>= 4;     //注意是移动四位  
  128.   
  129.     return temp;  
  130. }  
  131.   
  132. /** 
  133.  * UART初始化 
  134.  * 波特率:9600 
  135. */  
  136. void uart_init(void)  
  137. {  
  138.     TMOD = 0x21;        // 定时器1工作在方式2(自动重装)  
  139.     SCON = 0x50;        // 10位uart,允许串行接受  
  140.   
  141.     TH1 = 0xFD;  
  142.     TL1 = 0xFD;  
  143.   
  144.     TR1 = 1;  
  145. }  
  146.   
  147. /** 
  148.  * UART发送一字节 
  149. */  
  150. void UART_Send_Byte(uint8 dat)  
  151. {  
  152.     SBUF = dat;  
  153.     while (TI == 0);  
  154.     TI = 0;  
  155. }  
  156.   
  157. /** 
  158.  * 将数据转换成ASC码并通过UART发送出去 
  159. */  
  160. void UART_Send_Dat(uint8 dat)    //100度以下温度可用  
  161. {  
  162.     UART_Send_Byte(dat/10%10 + '0');  
  163.     UART_Send_Byte(dat%10 + '0');  
  164. }  
  165.   
  166.    
  167.   
  168. main()  
  169. {  
  170.     int16 ans;  
  171.   
  172.     uart_init();  
  173.     start_temp_sensor();  
  174.     while (1)  
  175.     {  
  176.         delay_ms (1000); // 延时1秒  
  177.   
  178.         ans=read_temp();  
  179.       
  180.         if (ans < 0)  
  181.         {  
  182.             UART_Send_Byte('-');  
  183.             ans = -ans;  
  184.         }  
  185.       
  186.         UART_Send_Dat(ans);  
  187.         UART_Send_Byte('r');  
  188.         UART_Send_Byte('n');  
  189.     }  
  190.   
  191. }  

 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Pt100温度传感器和Pt1000温度传感器的铂基传感器是正温度系数 (PTC) 传感器,可提供高达 500°C 的准确温度测量。在0摄氏度时Pt100是100欧,Pt1000是1000欧。

关键字: ntc 热敏电阻 pt100 温度传感器

上海2024年4月17日 /美通社/ -- 每年4月17日是世界血友病日。今年,世界血友病日以"认识出血性疾病,积极预防和治疗"为主题,呼吁关注所有出血性疾病,提升科学认知,提高规范化诊疗水平,让每一位出血性疾病患者享有...

关键字: VII 动力学 软件 BSP

伦敦2024年4月16日 /美通社/ -- ATFX宣布任命Siju Daniel为首席商务官。Siju在金融服务行业拥有丰富的经验和专业知识,曾在全球各地的高管职位上工作了19年以上。Siju之前担任FXCM首席商务官...

关键字: NI AN SI BSP

PT100是铂热电阻,它的阻值会随着温度的变化而改变。PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。它的工作原理:当PT100在0摄氏度的时候它的阻值为100欧姆,它的阻值会随着...

关键字: PT100 铂热电阻 温度传感器

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

关键字: ds18b20 温度传感器 数字信号

为增进大家对电磁炉的认识,本文将对电磁炉的一些异常予以介绍,并介绍电磁炉的一些使注意事项。

关键字: 电磁炉 指数 温度传感器

温度传感器ad590测温电路是一种较常见的应用电路,关于这电路你了解多少呢?你知道它的原理吗?本文就来介绍关于温度传感器ad590测温电路的电路原理。

关键字: 温度传感器 ad590 电路原理

AD590温度传感器是一种功能强大、性能优良的温度传感器。其具有高精度、线性度好、稳定性强等多种优点,可以广泛应用于各种工业应用领域。

关键字: 温度传感器 ad590 电压放大器

MCP998x系列是单一供应商提供的最大车规级远程温度传感器产品组合之一

关键字: 温度传感器 后视镜控制 电动车窗
关闭
关闭