找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2370|回复: 1
收起左侧

msp430开发板温度传感器DS18B20控制程序,显示环境温度

[复制链接]
ID:277100 发表于 2018-1-17 18:21 | 显示全部楼层 |阅读模式
/********************************************************************
//DM430-L型开发板温度传感器DS18B20控制程序,显示环境温度,未校准
//将温度的个位显示在LED8上,触摸传感器LED灯会变化,测试参考用
//DS18b20的C语言驱动程序,读取当前环境温度,显示精度达0.1度,温度范围0-99度
//DS18B20 详细引脚功能描述1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下
//也可以向器件提供电源;3、VDD可选择的VDD 引脚。当工作于寄生电源时,此引脚必须接地。
//DS18B20 的使用方法。DS18B20 采用的是1-Wire 总线协议方式
//即在一根数据线实现数据的双向传输,数据脚接在P17上
********************************************************************/
  1. #include <msp430x14x.h>
  2. #include "Config.h"
  3. uint    temp_value;
  4. uint    temp,A1,A2,A3;                 //定义的变量,显示数据处理
  5. //*************************************************************************
  6. //   初始化IO口子程序
  7. //*************************************************************************
  8. void Port_Init()
  9. {
  10.   LED8DIR  = 0xFF;                      //设置IO口方向为输出
  11.   LED8 = 0xFF;                      //P2口初始设置为FF
  12. }
  13. //*************************************************************************
  14. //   DS18B20初始化
  15. //*************************************************************************
  16. unsigned char DS18B20_Reset(void)                //初始化和复位
  17. {
  18.   unsigned char i;
  19.   DQ_OUT;
  20.   DQ_CLR;
  21.   delay_us(500);    //延时500uS(480-960)
  22.   DQ_SET;
  23.   DQ_IN;
  24.   delay_us(80);            //延时80uS
  25.   i = DQ_R;
  26.   delay_us(500);    //延时500uS(保持>480uS)

  27.   if (i)
  28.   {
  29.     return 0x00;
  30.   }
  31.   else
  32.   {
  33.     return 0x01;
  34.   }
  35. }
  36. //*************************************************************************
  37. //   DS18B20读一个字节函数
  38. //*************************************************************************
  39.    
  40. unsigned char ds1820_read_byte(void)
  41. {
  42.   unsigned char i;
  43.   unsigned char value = 0;
  44.   for (i = 8; i != 0; i--)
  45.   {
  46.     value >>= 1;
  47.     DQ_OUT;
  48.     DQ_CLR;
  49.     delay_us(4);           //*延时4uS
  50.     DQ_SET;
  51.     DQ_IN ;
  52.     delay_us(10);           //*延时10uS
  53.     if (DQ_R)
  54.     {
  55.       value|=0x80;  
  56.     }
  57.     delay_us(60);           //*延时60uS
  58.   }
  59.   return(value);
  60. }
  61. //*************************************************************************
  62. //   向18B20写一个字节函数
  63. //*************************************************************************  
  64. /*DS18B20字节写入函数*/
  65. void ds1820_write_byte(unsigned char value)
  66. {
  67.   unsigned char i;
  68.   for (i = 8; i != 0; i--)
  69.   {
  70.     DQ_OUT;
  71.     DQ_CLR;
  72.     delay_us(4);     //延时4uS
  73.     if (value & 0x01)
  74.     {
  75.       DQ_SET;  
  76.     }
  77.     delay_us(80);     //延时80uS
  78.     DQ_SET;             //位结束
  79.     value >>= 1;
  80.   }
  81. }
  82. //*************************************************************************
  83. //    发送温度转换命令
  84. //*************************************************************************
  85. /*启动ds1820转换*/
  86. void ds1820_start(void)
  87. {
  88.   DS18B20_Reset();
  89.   ds1820_write_byte(0xCC);           //勿略地址
  90.   ds1820_write_byte(0x44);           //启动转换
  91. }
  92. //*************************************************************************
  93. //    DS8B20读取温度信息
  94. //*************************************************************************
  95. unsigned int ds1820_read_temp(void)
  96. {
  97.   unsigned int i;
  98.   unsigned char buf[9];
  99.   DS18B20_Reset();
  100.   ds1820_write_byte(0xCC);           //勿略地址
  101.   ds1820_write_byte(0xBE);           //读取温度
  102.   for (i = 0; i < 9; i++)
  103.   {
  104.     buf[i] = ds1820_read_byte();
  105.   }
  106.   i = buf[1];
  107.   i <<= 8;
  108.   i |= buf[0];
  109.   temp_value=i;
  110.   temp_value=(uint)(temp_value*0.625);    //不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据
  111.                             //比如温度本身为27.5度,为了在后续的数据处理程序中得到BCD码,我们先放大到275
  112.                                           //然后在显示的时候确定小数点的位置即可,就能显示出27.5度了
  113.   return i;
  114. }
  115. //*************************************************************************
  116. //  温度数据处理函数
  117. //*************************************************************************
  118. void data_do(uint temp_d)
  119. {
  120.    uint A2t;
  121.    A1=temp_d/100;                         //分出百,十,和个位
  122.    A2t=temp_d%100;
  123.    A2=A2t/10;
  124.    A3=A2t%10;
  125. }
  126. //***********************************************************************
  127. //            主程序
  128. //***********************************************************************
  129. void main(void)
  130. {
  131.   uchar j;
  132.   
  133.   WDT_Init();                             //看门狗初始化
  134.   Clock_Init();                           //时钟初始化
  135.   Port_Init();                            //端口初始化,用于控制IO口输入或输出
  136.   DS18B20_Reset();     //复位D18B20
  137.   while(1)
  138.   {
  139.     ds1820_start();            //启动一次转换
  140.     ds1820_read_temp();            //读取温度数值
  141.     data_do(temp_value);                  //处理数据,得到要显示的值
  142.     for(j=0;j<200;j++)
  143.     {     
  144.       //Display_DS18B20(A1,A2,A3);        //显示温度值,用户外扩显示器件后可用
  145.       LED8 = A2;                          //将温度的个位显示在LED8上,触摸传感器LED灯会变化        
  146.       
  147.     }
  148.   }
  149. }
复制代码


回复

使用道具 举报

ID:584195 发表于 2021-11-14 10:23 | 显示全部楼层
有没有低功耗的例子
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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