ds18b20源码~

[复制链接]
1985|2
 楼主| baigame 发表于 2014-4-17 14:19 | 显示全部楼层 |阅读模式
代码如下:
ds18b20.c
  1. #include"ds18b20.h"
  2. /*********************************************************************************************************
  3. ** 全局变量
  4. ********************************************************************************************************/
  5. unsigned char Temperature;
  6. /*********************************************************************************************************
  7. ** 函数名称:Delay_us(unsigned char us)
  8. ** 函数功能:延时uS
  9. ** 入口参数:unsigned char us
  10. ** 出口参数:void
  11. ** 说    明:u,延时精度2us
  12. ********************************************************************************************************/
  13. void Delay_us (unsigned char us)                 
  14. {

  15.    while(--us);
  16. }
  17. /*********************************************************************************************************
  18. ** 函数名称:unsigned char OWTouchReset(void)
  19. ** 函数功能:复位温度传感器,并返回是否检测到信号
  20. ** 入口参数:void
  21. ** 出口参数:unsigned char,返回是否检测到信号
  22. ** 说    明:  返回值为1代表没有检测到,否则检测到
  23. ********************************************************************************************************/
  24. unsigned char OWTouchReset (void)
  25. {
  26.     unsigned char result;

  27.     DQ = 0;                                        //低电平驱动
  28.     Delay_us(TRSTL/2);          //600us复位低电平
  29.     Delay_us(TRSTL/2);
  30.     DQ = 1;                                        //高电平驱动
  31.     Delay_us(TPDHIGH);          //40us高电平存在检测            
  32.     _nop_();           
  33.     result = DQ;                                   // 检测信号
  34.     Delay_us(TPDLOW);                             //160us低电平存在检测
  35.     DQ = 1;
  36.     Delay_us(TTSTH );                             //160us低电平存在检测

  37.     return result;                                 
  38. }
  39. /*********************************************************************************************************
  40. ** 函数名称:void OWWriteBit (unsigned char BitData)
  41. ** 函数功能:往总线上写1位数据
  42. ** 入口参数:unsigned char BitData
  43. ** 出口参数:void
  44. ** 说    明:分为数据0和数据1
  45. ********************************************************************************************************/
  46. void OWWriteBit (unsigned char BitData)
  47. {
  48.     if (BitData)            //数据位为1
  49.     {
  50.         DQ = 0;                                    //低电平驱动
  51.         Delay_us( TLOW1 );         //单线写1低电平时间7us
  52.         DQ = 1;                                    // 高电平驱动
  53.         Delay_us(TSOLT );                          //时间间隙80us
  54.         DQ = 1;      
  55.     }
  56.     else            //数据位为0
  57.     {
  58.         DQ = 0;                                    // 低电平驱动
  59.         Delay_us(TLOW0);       //单线写0低电平时间80us
  60.         DQ = 1;          //高电平驱动
  61.     }
  62. }
  63. /*********************************************************************************************************
  64. ** 函数名称:unsigned char OWReadBit (void)
  65. ** 函数功能:从总线读取一个数据位
  66. ** 入口参数:void
  67. ** 出口参数:unsigned char
  68. ** 说    明:
  69. ********************************************************************************************************/
  70. unsigned char OWReadBit (void)
  71. {
  72.     unsigned char result;

  73.     DQ = 0;                                    // 低电平驱动
  74.     Delay_us(TRDV);          //获得信号时间7us
  75.     DQ = 1;                                    //高电平驱动
  76.     _nop_();
  77.     result = DQ;                               // 获取信号
  78.     Delay_us(TSOLT);                           //时间间隙80us
  79.     DQ = 1;

  80.     return result;
  81. }
  82. /*********************************************************************************************************
  83. ** 函数名称:void OWWriteByte (unsigned char Data)
  84. ** 函数功能:往总线写一字节
  85. ** 入口参数:unsigned char Data
  86. ** 出口参数:void
  87. ** 说    明:
  88. ********************************************************************************************************/
  89. void OWWriteByte (unsigned char Data)
  90. {
  91.     unsigned char i;

  92.    //发送8位数据
  93.     for (i=8;i!=0;i--)
  94.     {
  95.         OWWriteBit(Data & 0x01);
  96.         Data = (Data >> 1);
  97.     }
  98. }
  99. /*********************************************************************************************************
  100. ** 函数名称:unsigned char OWReadByte (void)
  101. ** 函数功能:从总线读取一个字节
  102. ** 入口参数:void
  103. ** 出口参数:unsigned char
  104. ** 说    明:
  105. ********************************************************************************************************/
  106. unsigned char OWReadByte (void)
  107. {
  108.     unsigned char i,result=0;

  109.     for (i=8;i!=0;i--)
  110.     {
  111.         //从高位开始存取
  112.         result = (result >> 1);
  113.         if (OWReadBit()) result |= 0x80;
  114.     }
  115.     return result;
  116. }
  117. /*********************************************************************************************************
  118. ** 函数名称:unsigned char DS18B20_Init (void)
  119. ** 函数功能:初始化温度传感器
  120. ** 入口参数:void
  121. ** 出口参数:unsigned char
  122. ** 说    明:
  123. ********************************************************************************************************/
  124. unsigned char DS18B20_Init (void)
  125. {
  126.     EA = 0;                                     //关中断

  127.     if (OWTouchReset())           
  128.     {
  129.         EA = 1;                                 //如果没有检测到,开中断
  130.         return 0xE0;
  131.     }


  132.     OWWriteByte(OW_SkipROM);                     //跳过ROM
  133.     OWWriteByte(OW_WriteScratchpad);             //写暂存器
  134.     OWWriteByte(0x3D);                          // TH=60  设置最高温度
  135.     OWWriteByte(0x00);                          // TL=0     设置最低温度
  136.     //精度设置为12-BIT
  137. OWWriteByte(0x7F);                          // DS18B20配置寄存器R1,R0=11

  138.     if (OWTouchReset())
  139.     {
  140.         EA = 1;                               //开中断
  141.         return 0xE0;
  142.     }

  143.     OWWriteByte(OW_SkipROM);     //跳过ROM
  144.     OWWriteByte(OW_CopyScratchpad);             //复制暂存器


  145.     EA = 1;                                     //关中断

  146.     return 0;
  147. }
  148. /*********************************************************************************************************
  149. ** 函数名称:unsigned char ReadDS18B20 (void)
  150. ** 函数功能:读取传感器温度
  151. ** 入口参数:void
  152. ** 出口参数:unsigned char
  153. ** 说    明:
  154. ********************************************************************************************************/
  155. unsigned char ReadDS18B20 (void)
  156. {
  157.     unsigned char i,result=0;

  158.     EA = 0;                                     //关中断

  159.     if (OWTouchReset())
  160.     {
  161.         EA = 1;                                 //开中断
  162.         return 0xE0;
  163.                
  164.     }

  165.     OWWriteByte(OW_SkipROM);                 //跳过ROM
  166.     OWWriteByte(OW_ReadScratchpad);          //读取暂存器的值,9字节
  167.    
  168.     for (i=0;i <9;i++)
  169.     {
  170.         result = OWReadByte();
  171.         if (0 == i)                        //温度低字节
  172.         {
  173.             Temperature = result >> 4;   // 温度不保留小数
  174.         }
  175.         else if (1 == i)    //温度高字节
  176.         {
  177.                  if (result & 0xF8)
  178.                  {
  179.                      Temperature = 0;           // 负温度归零
  180.                  }
  181.     else
  182.     {
  183.                 Temperature |= (( result&0x07)<<4 ); // 温度保留8bit整数
  184.     }
  185.         }
  186.     }
  187.    
  188.     EA = 1;                                     ////////////////

  189.     return 0;
  190. }
  191. /*********************************************************************************************************
  192. ** 函数名称:void DS18B20ConvT (void)
  193. ** 函数功能:转换温度
  194. ** 入口参数:void
  195. ** 出口参数:void
  196. ** 说    明:
  197. ********************************************************************************************************/
  198. void DS18B20ConvT (void)
  199. {
  200.     EA = 0;                                     //关中断
  201.    
  202.     if (OWTouchReset())
  203.     {
  204.         EA = 1;                                 //开中断
  205.         return;
  206.     }

  207.     OWWriteByte(OW_SkipROM);     //跳过ROM
  208.     OWWriteByte(OW_ConvertT);                  //温度转换

  209.     EA = 1;                                     //开中断
  210. }
ds18b20.h

  1. #ifndef ds18b20_H
  2. #define ds18b20_H
  3. /*********************************************************************************************************
  4. ** 基本环境
  5. ********************************************************************************************************/
  6. #include <intrins.h>
  7. #include<reg52.h>     
  8. /*********************************************************************************************************
  9. ** 1-Wire参数定义
  10. ********************************************************************************************************/
  11. //1-Wire Standard Speed
  12. #define TLOW0 40   //单线写0低电平时间80us
  13. #define TLOW1 1      //单线写1低电平时间7us
  14. #define TSOLT 40        //时间间隙80us
  15. #define TRDV 1          //获得信号时间7us
  16. #define TRSTL 300       //复为低电平时间 600us延时
  17. #define TPDHIGH 20      //40us高电平存在检测
  18. #define TPDLOW 80       //160us低电平存在检测
  19. #define TTSTH 200       //400us复位电平延时
  20. /*********************************************************************************************************
  21. ** 1-Wire命令定义
  22. ********************************************************************************************************/
  23. /*ROM操作命令*/
  24. #define OW_SearchROM       0xF0      //搜索ROM   
  25. #define OW_ReadROM         0x33     //读取ROM
  26. #define OW_MatchROM        0x55     //匹配ROM
  27. #define OW_SkipROM         0xCC     //跳过ROM
  28. #define OW_AlarmSearch     0xEC     //告警搜索
  29. /*存取器操作与温度变换命令*/
  30. #define OW_ConvertT        0x44     //温度转换
  31. #define OW_WriteScratchpad 0x4E     //写暂存器命令
  32. #define OW_ReadScratchpad  0xBE     //读暂存器命令
  33. #define OW_CopyScratchpad  0x48     // 复制寄存器
  34. #define OW_RecallE2        0xB8     //从新调用E2
  35. #define OW_ReadPower       0xB4     //读电源模式
  36. /*********************************************************************************************************
  37. ** 信号线声明
  38. ********************************************************************************************************/
  39. sbit DQ =P2^7;
  40. /*********************************************************************************************************
  41. ** 变量全局声明
  42. ********************************************************************************************************/
  43. extern unsigned char Temperature;   
  44. /*********************************************************************************************************
  45. ** 函数声明
  46. ********************************************************************************************************/
  47. static void          Delay_us     (unsigned char us);
  48. static unsigned char OWTouchReset (void);
  49. static void          OWWriteBit   (unsigned char BitData);
  50. static unsigned char OWReadBit    (void);
  51. static void          OWWriteByte  (unsigned char Data);
  52. static unsigned char OWReadByte   (void);
  53. extern unsigned char DS18B20_Init (void);
  54. extern unsigned char ReadDS18B20  (void);
  55. extern void          DS18B20ConvT (void);

  56. /**********************end****************************************/
  57. #endif

display.c

  1. //程序:display.c键盘显示子程序
  2. //功能:显示所需要显示的数字
  3. //函数返回值:unsigned char                     
  4. #include"display.h"
  5. //sbit LED1=P2^0;
  6. // 数码管0~1, A,B所对应的数码管键值
  7. uchar code disp_save_num[12]={0X88, 0XBE, 0XC4, 0X94, 0XB2, 0X91,
  8.                                        0X81, 0XBC, 0X80,0X90,0XA0,0XFF};

  9. //读取所需显示的数字,并显示                                          
  10. void Display(uchar *disp_num)
  11. {
  12.      uchar move_number,move_bit;
  13.      uchar disp_number;
  14.   
  15.                               
  16.    SS_CLK  = 0;
  17.   
  18.      for(move_number=0;move_number<4;move_number++)
  19.      {
  20.        disp_number=disp_save_num[*(disp_num+move_number)];//读取所需显示的数字
  21.                                                         //并从所对应的键值里
  22.                                                         //选择对应的键值                     

  23.         for(move_bit=0; move_bit<8; move_bit++)
  24.             {//显示对应键值
  25. //                        P0=disp_save_num[3];
  26.   //                                               LED1=0;
  27.             SS_DATA = disp_number&0x80;
  28.       
  29.              SS_CLK = 1;
  30.              SS_CLK = 0;
  31.              disp_number<<=1;
  32.               }
  33.      }
  34. }
  35.   

display.h
  1. //程序:display.h数码管显示子程序头文件
  2. //功能:显示数码管所需数字
  3. //函数说明:
  4. //      void Display(uchar *disp_num)
  5. //      读取四个数码管所需显示的数值,并显示
  6. //////////////////////////////////////////////////////////////////////////////            
  7. #ifndef _DISPLAY_H
  8. #define _DISPLAY_H

  9. #include<reg52.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. void Display(uchar *disp_num);
  13. sbit  SS_DATA =P0^0;
  14. sbit  SS_CLK =P2^0;

  15. #endif

main.c
  1. /*文件名:测试DS18B20.C
  2. /功能:使用数码管测试温度传感器
  3. */
  4. /****************************************************************************************
  5. *包含文件声明
  6. ***************************************************************************************/
  7. #include<reg52.h>
  8. #include"display.h"
  9. #include"ds18b20.h"
  10. #include <intrins.h>

  11. /**********************************************************************************
  12. *函数声明
  13. ********************************************************************************/
  14. void delay_50ms(unsigned int )  ;    //延时精度50ms
  15. void  hextobcd( void) ;      //将十六进制转换为BCD

  16. /************************************************************************************
  17. *全局变量声明
  18. ***********************************************************************************/
  19. extern unsigned char Temperature;
  20. uchar disp_data[4] = {0,0,0,0};                 //数码管显示数据



  21. /**********************************************************************************
  22. *主程序
  23. ********************************************************************************/

  24. /*******************************************************************************
  25. ** 函数名称:void main ()
  26. ** 函数功能:使用数码管测试温度传感器
  27. ** 入口参数:void
  28. ** 出口参数:void
  29. ** 说    明:
  30. **************************************************************************************/
  31. void main(void)
  32. {
  33.     Display(disp_data);
  34. delay_50ms(10);   

  35.     DS18B20_Init();                   //温度传感器初始化
  36.     while (1)
  37.     {
  38.       
  39.         delay_50ms(1);            
  40.   DS18B20ConvT();          //转换温度
  41.   delay_50ms(16);         //800ms转换时间等待
  42.         ReadDS18B20();          //读取温度
  43.   hextobcd();                                 //将温度转换为BCD
  44.   _nop_();
  45.   Display(disp_data);
  46.     }
  47. }

  48. /***************************************************************************************
  49. ** 函数名称:void delay_50ms(unsigned int t)
  50. ** 函数功能:延时程序
  51. ** 入口参数:unsigned int t
  52. ** 出口参数:void
  53. ** 说    明:延时精度50ms
  54. ****************************************************************************************/

  55. void delay_50ms(unsigned int t)
  56. {
  57. unsigned int j;
  58. for(;t>0;t--)
  59.   for(j = 6245;j>0;j--)
  60. ;
  61. }
  62. /***************************************************************************************
  63. ** 函数名称:void  hextobcd( void)
  64. ** 函数功能:将十六进制转换为BCD
  65. ** 入口参数:void
  66. ** 出口参数:void
  67. ** 说    明:使用了全局变量
  68. ***************************************************************************************/
  69. void  hextobcd( void)
  70. {
  71. unsigned int high = 0,low = 0, temp =0, high_temp = 0, low_temp =0;
  72. high_temp = (Temperature>>4) *0x16;  
  73. low_temp = Temperature&0x0F;
  74. if(low_temp > 9)
  75. {
  76.   low_temp = low_temp -10 + 0x10;
  77. }
  78. temp = high_temp + low_temp;
  79. high = temp>>4;
  80. low = temp & 0x0F;
  81. if(low>9)
  82. {
  83.   high +=1;
  84.   low -=10;
  85. }

  86. disp_data[1]= high;
  87. disp_data[0] = low;

  88. }
代码在keil中编译错误,错误代码如下
..\BAI\DS18B20.C(30): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(31): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(33): error C202: 'TPDHIGH': undefined identifier
..\BAI\DS18B20.C(36): error C202: 'TPDLOW': undefined identifier
..\BAI\DS18B20.C(38): error C202: 'TTSTH': undefined identifier
..\BAI\DS18B20.C(54): error C202: 'TLOW1': undefined identifier
..\BAI\DS18B20.C(56): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(62): error C202: 'TLOW0': undefined identifier
..\BAI\DS18B20.C(78): error C202: 'TRDV': undefined identifier
..\BAI\DS18B20.C(82): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(142): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(143): error C202: 'OW_WriteScratchpad': undefined identifier
..\BAI\DS18B20.C(155): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(156): error C202: 'OW_CopyScratchpad': undefined identifier
..\BAI\DS18B20.C(183): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(184): error C202: 'OW_ReadScratchpad': undefined identifier
..\BAI\DS18B20.C(227): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(228): error C202: 'OW_ConvertT': undefined identifier
compiling main.c...
..\BAI\MAIN.C(42): warning C206: 'DS18B20_Init': missing function-prototype
..\BAI\MAIN.C(47): warning C206: 'DS18B20ConvT': missing function-prototype
..\BAI\MAIN.C(49): warning C206: 'ReadDS18B20': missing function-prototype
..\BAI\MAIN.C(80): error C141: syntax error near '1'
..\BAI\MAIN.C(80): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(81): error C202: 'high_temp': undefined identifier
..\BAI\MAIN.C(82): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(83): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(85): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(87): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(88): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(89): error C202: 'temp': undefined identifier


仿真图如下:

有时间的坛友帮看下,程序那里有问题,应该怎么改。非常感谢~~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
dirtwillfly 发表于 2014-4-17 16:46 | 显示全部楼层
外部函数,要先声明再使用
uconny720 发表于 2014-4-22 14:47 | 显示全部楼层
ds18b20购买可以参考一下这里http://www.86yuanjian.com/1417.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

82

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部