[菜农助学交流] 温度传感器DS18B20

[复制链接]
2844|5
 楼主| fuyaozhishang 发表于 2012-1-9 00:22 | 显示全部楼层 |阅读模式
数字式温度传感器:
芯片先初始化:
  1. UNLOCKREG(); // 芯片注册解锁
  2. SYSCLK->PWRCON.XTL12M_EN = 1; // 设定12M外部晶振

  3. DrvSYS_Delay(5000); // 等待时钟就绪
  4. LOCKREG(); //向“0x5000_0100”写入任何值,就可以重锁保护寄存器


然后再初始化串口:
  1. STR_UART_T param;

  2. DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); // 使能UART时钟
  3. DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置

  4. param.u32BaudRate = 115200; // 波特率
  5. param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
  6. param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
  7. param.u8cParity = DRVUART_PARITY_NONE; // 校验位
  8. param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
  9. param.u8TimeOut = 0; // FIFO超时设定
  10. DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值


下一步就是获取18B20的ID号:
  1. void get_rom(unsigned char* p)
  2. {
  3. unsigned char i;
  4. if (resetDS18B20()==0xff)
  5. {
  6. writeByteDS18B20(ds18b20_read_rom);
  7. for (i=0;i<8;i++)
  8. {
  9. *p++ = readByteDS18B20();
  10. }
  11. }
  12. }


初始化代码:
  1. /**********************************************************************
  2. functionName: unsigned char resetDS18B20(void)
  3. description :DS18B20初始化
  4. **********************************************************************/
  5. unsigned char resetDS18B20(void)
  6. {
  7. unsigned char errTime=0;
  8. HLD_DS18B20; //控制总线
  9. CLR_DS18B20; //强制拉低
  10. delay_nus(260); //以上延时大于480us
  11. SET_DS18B20;
  12. RLS_DS18B20; //释放总线,总线自动上拉 DDR
  13. delay_nus(7); //15~60us

  14. while (STU_DS18B20)
  15. {
  16. delay_nus(3); //5.15us
  17. errTime++;
  18. if (errTime>20)
  19. return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
  20. }
  21. errTime=0;
  22. while (!(STU_DS18B20))
  23. {
  24. delay_nus(3); //5.15us
  25. errTime++;
  26. if (errTime>50)
  27. return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
  28. }
  29. HLD_DS18B20; //控制总线
  30. SET_DS18B20; //强制拉高
  31. return(0xff);
  32. }


下面就是一些DS18B20的常用读写操作,只要服从DATASHEET的时序规范就可以了:
  1. /**********************************************************************
  2. functionName: unsigned char readByteDS18B20(void)
  3. description :读DS18B20一个字节
  4. **********************************************************************/
  5. unsigned char readByteDS18B20(void)
  6. {
  7. unsigned char i;
  8. unsigned char retVal=0;
  9. //RLS_DS18B20; //释放总线
  10. for (i=8;i>0;i--)
  11. {
  12. retVal>>=1;
  13. HLD_DS18B20; //控制总线
  14. CLR_DS18B20; //强制拉低
  15. delay_nus(1); //延时大于1us
  16. SET_DS18B20; //释放总线,DS18B20会将总线强制拉低
  17. RLS_DS18B20; //释放总线
  18. delay_nus(1);

  19. if (STU_DS18B20)
  20. retVal|=0x80;
  21. delay_nus(15); //31us

  22. }
  23. HLD_DS18B20; //控制总线
  24. SET_DS18B20; //强制拉高
  25. return(retVal);
  26. }

  27. /**********************************************************************
  28. functionName: unsigned char readByteDS18B20(void)
  29. description :写DS18B20一个字节
  30. **********************************************************************/
  31. void writeByteDS18B20(unsigned char wb)
  32. {
  33. unsigned char i;
  34. unsigned char temp;

  35. //RLS_DS18B20; //释放总线
  36. for (i=0;i<8;i++)
  37. {
  38. HLD_DS18B20; //控制总线
  39. CLR_DS18B20; //强制拉低
  40. delay_nus(1); //14.92us
  41. temp=wb>>i;
  42. if (temp&=0x01)
  43. SET_DS18B20; //释放总线
  44. else
  45. CLR_DS18B20; //强制拉低
  46. delay_nus(15); //30.38us
  47. SET_DS18B20; //释放总线
  48. delay_nus(1); //2.71us(大于1us就行了)
  49. }
  50. }

  51. /**********************************************************************
  52. functionName: get_rom(unsigned char* p)
  53. description :读ROM
  54. **********************************************************************/
  55. void get_rom(unsigned char* p)
  56. {
  57. unsigned char i;
  58. if (resetDS18B20()==0xff)
  59. {
  60. writeByteDS18B20(ds18b20_read_rom);
  61. for (i=0;i<8;i++)
  62. {
  63. *p++ = readByteDS18B20();
  64. }
  65. }
  66. }

  67. /**********************************************************************
  68. functionName: void set_ds18b20(char th,char tl,unsigned char config)
  69. description :设定DS18B20模式
  70. **********************************************************************/
  71. void set_ds18b20(char th,char tl,unsigned char config)
  72. {
  73. if (resetDS18B20()==0xff)
  74. {
  75. writeByteDS18B20(ds18b20_skip_rom);
  76. writeByteDS18B20(ds18b20_write_ram);
  77. writeByteDS18B20(th);
  78. writeByteDS18B20(tl);
  79. writeByteDS18B20(config);
  80. }
  81. }
  82. /**********************************************************************
  83. functionName: convert_ds18b20(void)
  84. description :写DS18B20一个字节
  85. **********************************************************************/
  86. void convert_ds18b20(void)
  87. {
  88. if (resetDS18B20()==0xff)
  89. {
  90. writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
  91. writeByteDS18B20(ds18b20_convert_tem); //启动温度转换
  92. }
  93. }

  94. /**********************************************************************
  95. functionName: unsigned int readTempDS18B20(void)
  96. description :读DS18B20温度 有正负符号标志和两个小数点精度
  97. **********************************************************************/
  98. unsigned int readTempDS18B20(void)
  99. {
  100. unsigned char tempL,tempH,wm0,wm2;
  101. unsigned int x;

  102. if (resetDS18B20()==0)
  103. return 0;
  104. writeByteDS18B20(ds18b20_skip_rom); //跳过ROM
  105. writeByteDS18B20(ds18b20_read_ram); //读数据
  106. tempL=readByteDS18B20();
  107. tempH=readByteDS18B20();
  108. wm0=tempL;
  109. wm0=wm0>>4;
  110. tempH=tempH<<4;
  111. wm2=wm0+tempH; //温度的整数值
  112. if (wm2&0x80) //测试符号位
  113. {
  114. DS18B20_sign_flag=1;
  115. wm2=256-wm2;
  116. }
  117. else
  118. DS18B20_sign_flag=0;

  119. x = wm2*100; //字符型赋给整形,扩大100倍

  120. if (tempL&0x08) //提高测试精度
  121. {
  122. x=x+50;
  123. }
  124. if (tempL&0x04)
  125. {
  126. x=x+25;
  127. }
  128. if (tempL&0x02)
  129. {
  130. x=x+12;
  131. }
  132. if (tempL&0x01)
  133. {
  134. x=x+6;
  135. }

  136. convert_ds18b20();//启动温度转换
  137. return(x);
  138. }



最后上效果演示图:

本帖子中包含更多资源

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

×
Swallow_0322 发表于 2012-1-9 07:41 | 显示全部楼层
hotpower 发表于 2012-1-9 08:40 | 显示全部楼层
最好把唯一ID显示出来。
yulri 发表于 2012-2-9 15:29 | 显示全部楼层
记下了,先!!
neo_bright 发表于 2012-2-16 21:23 | 显示全部楼层
:)学习
技美电子 发表于 2012-2-16 21:34 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

17

帖子

1

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