ds1820.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:2k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <msp430x14x.h>
  2. #include "ds1820.h"
  3. #define DQ  BIT0
  4. void Init_CLK(void)
  5. {
  6.     unsigned int i;
  7. //将寄存器的内容清零
  8. //XT2震荡器开启
  9. //LFTX1工作在低频模式
  10. //ACLK的分频因子为1
  11.     BCSCTL1 = 0X00;
  12.     do 
  13.     {
  14. IFG1 &= ~OFIFG;                       // 清除OSCFault标志
  15. for (i = 0x20; i > 0; i--);                
  16.     }
  17.     while ((IFG1 & OFIFG) == OFIFG);      // 如果OSCFault =1   
  18.     BCSCTL2 = 0X00; //将寄存器的内容清零
  19.     BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
  20.     BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1
  21. }
  22. void delay(int nUs)
  23. {
  24. int nCount;
  25.     int i;
  26.     int j;
  27.     nCount = 3;
  28.     for(i = nUs; i > 0; i--)
  29.     {
  30.      for(j = nCount;j > 0;j--) ;
  31.     }
  32.     return;
  33. }
  34. char DS1820_Reset(void)
  35. {
  36. char presence;
  37. // 设定管脚为输出方向
  38. P1DIR |= DQ;
  39. // 将DQ管脚拉低
  40. P1OUT &= ~(DQ);
  41.     // 延时480微妙
  42.     delay(480); 
  43. // 将DQ管脚拉高
  44.     P1OUT |= DQ; 
  45. // 延时60微妙
  46.     delay(60); 
  47. // 设定管脚为输入方向
  48. P1DIR &= ~(DQ);
  49. // 读取数据
  50.     presence = (char)(P1IN & DQ);
  51. // 延时60微妙
  52.     delay(25);
  53.     return(presence);
  54. }
  55. char DS1820_ReadByte(void)
  56. {
  57. char i;
  58. char value = 0;
  59. char presence;
  60. for (i = 8;i > 0;i--)
  61. {
  62. value >>= 1;
  63. // 设定管脚为输出方向
  64.     P1DIR |= DQ;
  65.         // 将DQ管脚拉低
  66.     P1OUT &= ~(DQ);
  67.         // 将DQ管脚拉高
  68.         P1OUT |= DQ;
  69. // 延时1微妙
  70. delay(1);
  71. // 设定管脚为输入方向
  72.     P1DIR &= ~(DQ);
  73.     // 读取数据
  74.         presence = (char)(P1IN & DQ);
  75. if(presence) value |= 0x80;
  76. // 延时1微妙
  77. delay(60);
  78. }
  79. return value;
  80. }
  81. void DS1820_WriteByte(char val)
  82. {
  83. char i;
  84. char nBit;
  85. for (i=8; i>0; i--)
  86. {
  87. // 设定管脚为输出方向
  88.     P1DIR |= DQ;
  89.         // 将DQ管脚拉低
  90.     P1OUT &= ~(DQ);
  91. // 输出数据
  92. nBit = val & 0x01;
  93. if (nBit)
  94. {
  95.             P1OUT |= DQ;
  96. }
  97. else
  98. {
  99. P1OUT &= ~(DQ);
  100. }
  101. // 延时50微妙
  102. delay(50);
  103. // 将DQ管脚拉高
  104.     P1OUT |= DQ;
  105. val >>= 1;
  106. }
  107. // 延时5微妙
  108. delay(5);
  109. }
  110. char Read_Temperature(void)
  111. {
  112. union
  113. {
  114. char c[2];
  115. int x;
  116. } temp;
  117. // 复位
  118. DS1820_Reset();
  119. // Skip ROM
  120. DS1820_WriteByte(0xCC);
  121. // 开始转换
  122. DS1820_WriteByte(0x44);
  123. // Read Scratch
  124. DS1820_WriteByte(0xBE);
  125. //读取温度数据
  126. temp.c[1]=DS1820_ReadByte();
  127.     temp.c[0]=DS1820_ReadByte();
  128. // 返回数据
  129. return temp.x;
  130. }