DS1802.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "DS1802.h"
  2. #include "ABIS_User.h"
  3. //us级别延时函数1~20精度高20us,偏差1us
  4. void DelayUs(unsigned int Tmr)
  5. {
  6. unsigned char i;
  7. for(i=0;i<2;i++){
  8. asm("nop");
  9. asm("nop");
  10. asm("nop");
  11. }
  12. if(Tmr > 1){
  13. Tmr -= 1;
  14. for(;Tmr>0;Tmr--){
  15. for(i=0;i<3;i++){
  16. asm("nop");
  17. asm("nop");
  18. asm("nop");
  19. }
  20. asm("nop");
  21. }
  22. }
  23. }
  24. void Ds18WriteChar(unsigned char data) //向Ds18b20写函数
  25. {
  26. unsigned char i,temp;
  27. DQ_HIGH();
  28. DelayUs(3);
  29. for(i=8;i>0;i--){
  30. temp = data&0x01;
  31. DQ_LOW();
  32. DelayUs(20);
  33. if(temp == 1)DQ_HIGH();
  34. DelayUs(45);
  35. DQ_HIGH();
  36. data=data>>1;
  37. }
  38. }
  39. unsigned char Ds18ReadChar()
  40. {
  41. unsigned char i,data=0;
  42. for(i=8;i>0;i--){
  43. data=data>>1;
  44. DQ_HIGH();
  45. DelayUs(3);
  46. DQ_LOW();
  47. DelayUs(6);
  48. DQ_HIGH();
  49. DelayUs(4);
  50. if(DQ)data=data|0x80;
  51. DelayUs(30);
  52. }
  53. return (data);
  54. }
  55. void Ds18Start()
  56. {
  57. unsigned char i=10;
  58. DQ_HIGH();
  59. DelayUs(3);
  60. while(i){
  61. DQ_LOW();
  62. DelayUs(750); //延时750us
  63. DQ_HIGH();
  64. DelayUs(70); //延时70us
  65. if (DQ == 1)i--;
  66. else i = 0;
  67. DelayUs(500); //延时500us
  68. }
  69. }
  70. void Ds18Init()
  71. {
  72. Ds18Start();
  73. Ds18WriteChar(0xcc);
  74. Ds18WriteChar(0x4e);
  75. Ds18WriteChar(0x64);
  76. Ds18WriteChar(0x8a);
  77. }
  78. float DS18GetTemp()
  79. {
  80. unsigned char tl,th;
  81. float temp;
  82. Ds18Start();
  83. Ds18WriteChar(0xcc);
  84. Ds18WriteChar(0x44);
  85. Delay_ms(750); //暂时屏蔽
  86. Ds18Start();
  87. Ds18WriteChar(0xcc);
  88. Ds18WriteChar(0xbe);
  89. tl=Ds18ReadChar();
  90. th=Ds18ReadChar();
  91. Ds18Start();
  92. temp = th;
  93. temp*= 256;
  94. temp+= tl;
  95. temp*= 0.0625;
  96. return(temp);
  97. }