[技术问答] 有没有N76E003读取DS18B20的代码

[复制链接]
211|9
 楼主 | 2019-6-11 15:06 | 显示全部楼层 |阅读模式
在网上找了一些51的,DS18B20的代码。刚接触N76E003,不知道怎么改。
  1. /*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

  2. #include<reg52.h>

  3. #include<intrins.h>



  4. sbit Bus=P1^1;//数据单总线



  5. unsigned int Ds_Result();//返回最终结果
  6. bit DS_Init();//初始化子函数
  7. void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令)
  8. unsigned char Ds_Read();//“读”子函数(用于从总线读值)
  9. void Ds_Change();//开始转换温度
  10. unsigned int Get_Temp();//获取温度子函数
  11. void Delay10us(unsigned int t);//延时10*t微秒

  12. void Delay1ms(unsigned int t);



  13. /*ds18b20 10*t延时函数*/
  14. void Delay10us(unsigned int t)
  15. {
  16.     unsigned int i;
  17.     for(i=t;i>0;i--)
  18.     {
  19.         _nop_();  _nop_();
  20.         _nop_();  _nop_();
  21.         _nop_();  _nop_();
  22.     }
  23. }




  24. /*dsb8b20 1ms延时函数*/
  25. void Delay1ms(unsigned int t)   //误差 0us
  26. {
  27.     unsigned char a,b,c;
  28.         for(t;t>0;t--)
  29.             for(c=1;c>0;c--)
  30.                 for(b=142;b>0;b--)
  31.                     for(a=2;a>0;a--);
  32. }
  33. /*ds18b20初始化*/
  34. bit Ds_Init()
  35. {
  36.         bit ack;
  37.         Bus=0;
  38.         Delay10us(60);//最小480,最大960
  39.         Bus=1;
  40.         Delay10us(6);//15-60us
  41.         while(Bus==0);
  42.         Bus=1;//让传感器释放总线,避免影响下一步
  43.         return ack;//ack为0则响应成功
  44. }




  45. /*ds18b20写时序*/
  46. void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
  47. {
  48.         unsigned char mask;
  49.         for(mask=0x01;mask!=0;mask<<=1)
  50.         {


  51.                 Bus=0;
  52.                 _nop_();
  53.                 if((mask&dat)==0)
  54.                 {
  55.                         Bus=0;
  56.                 }
  57.                 else
  58.                 {
  59.                         Bus=1;
  60.                 }
  61.                 Delay10us(6);//15-60us采样
  62.                 Bus=1;
  63.                 _nop_();
  64.                 _nop_();
  65.         }
  66. }


  67. /*ds18b20读时序*/
  68. unsigned char Ds_Read()
  69. {
  70.         unsigned char dat=0;
  71.         unsigned char mask,fmask;
  72.         for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
  73.         {
  74.                 Bus=0;
  75.                 _nop_();
  76.                 Bus=1;
  77.                 _nop_();
  78.                 _nop_();
  79.                 _nop_();
  80.                 _nop_();
  81.                 _nop_();
  82.                 _nop_();
  83.                 if(Bus==0)//读0
  84.                 {
  85.                         fmask=~mask;
  86.                         dat=dat&fmask;
  87.                 }
  88.                 else
  89.                 {
  90.                         dat|=mask;
  91.                 }
  92.                 Delay10us(5);
  93.                 Bus=1;


  94.         }
  95.         return dat;
  96. }


  97. /*转换温度子函数*/
  98. void Ds_Change()
  99. {
  100.         Ds_Init();
  101.         Delay1ms(1);
  102.         Ds_Write(0xCC);//跳过ROM寻址
  103.         Ds_Write(0x44);//启动一次温度转换




  104. }


  105. /*ds18b20获取温度子函数*/
  106. unsigned int Get_Temp()
  107. {
  108.         unsigned int temp=0;
  109.         unsigned char LSB,MSB;//用来储存数据的第八位与高八位
  110.         Ds_Init();
  111.         Delay1ms(1);
  112.         Ds_Write(0xCC);//跳过寻址
  113.         Ds_Write(0xBE);//发送读值命令·
  114.         LSB=Ds_Read();
  115.         MSB=Ds_Read();
  116.         temp=MSB;
  117.         temp<<=8;
  118.         temp|=LSB;
  119.         return temp;
  120. }


  121. /*ds18b20  返回最终结果子函数*/
  122. unsigned int Ds_Result()
  123. {
  124.         float tp;
  125.         unsigned int temp;
  126.         Delay1ms(10);//10ms度过不稳定期
  127.          Ds_Change();//转换温度
  128.         Delay1ms(1000);//延时1s等待转化
  129.         temp=Get_Temp();
  130.         tp=temp;
  131.         temp=tp*0.0625;
  132.         return temp;//最终结果为temp
  133. }



  134. int main()

  135. {

  136.     unsigned int temp;

  137.     temp=Ds_Result();//该值即为结果

  138. }
复制代码

使用特权

评论回复
| 2019-6-11 20:38 | 显示全部楼层
不能用吗?其实51的基本上可以直接拿来用

使用特权

评论回复
 楼主 | 2019-6-12 12:38 | 显示全部楼层
无法直接使用,改了延时都不行。以接4.7K电阻

使用特权

评论回复
 楼主 | 2019-6-12 16:01 | 显示全部楼层
延时函数改成了新唐的延时也是行,有没有大牛帮改一下。
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/21/2017
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 UART-0 Mode3 demo code
  14. //***********************************************************************************************************
  15. #include "N76E003.h"
  16. #include "SFR_Macro.h"
  17. #include "Common.h"
  18. #include "Delay.h"
  19. #include "Function_define.h"
  20. #include "string.h"

  21. unsigned int temp0;
  22. sbit Bus=P0^1;//数据单总线



  23. unsigned int Ds_Result();//返回最终结果
  24. bit DS_Init();//初始化子函数
  25. void Ds_Write(unsigned char dat);//“写”子函数(用于向总线写命令)
  26. unsigned char Ds_Read();//“读”子函数(用于从总线读值)
  27. void Ds_Change();//开始转换温度
  28. unsigned int Get_Temp();//获取温度子函数

  29. /*ds18b20初始化*/
  30. bit Ds_Init()
  31. {
  32.         bit ack;
  33.         Bus=0;
  34.              
  35.         Timer3_Delay10us(60);//最小480,最大960
  36.         Bus=1;
  37.         Timer3_Delay10us(6);//15-60us
  38.         while(Bus==0);
  39.         Bus=1;//让传感器释放总线,避免影响下一步
  40.         return ack;//ack为0则响应成功
  41. }
  42. /*ds18b20写时序*/
  43. void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
  44. {
  45.         unsigned char mask;
  46.         for(mask=0x01;mask!=0;mask<<=1)
  47.         {
  48.                 Bus=0;
  49.                 _nop_();
  50.                 if((mask&dat)==0)
  51.                 {
  52.                         Bus=0;
  53.                 }
  54.                 else
  55.                 {
  56.                         Bus=1;
  57.                 }
  58.                 Timer3_Delay10us(6);//15-60us采样
  59.                 Bus=1;
  60.                 _nop_();
  61.                 _nop_();
  62.         }
  63. }


  64. /*ds18b20读时序*/
  65. unsigned char Ds_Read()
  66. {
  67.         unsigned char dat=0;
  68.         unsigned char mask,fmask;
  69.         for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
  70.         {
  71.                 Bus=0;
  72.                 _nop_();
  73.                 Bus=1;
  74.                 _nop_();
  75.                 _nop_();
  76.                 _nop_();
  77.                 _nop_();
  78.                 _nop_();
  79.                 _nop_();
  80.                 if(Bus==0)//读0
  81.                 {
  82.                         fmask=~mask;
  83.                         dat=dat&fmask;
  84.                 }
  85.                 else
  86.                 {
  87.                         dat|=mask;
  88.                 }
  89.                 Timer3_Delay10us(5);
  90.                 Bus=1;


  91.         }
  92.         return dat;
  93. }


  94. /*转换温度子函数*/
  95. void Ds_Change()
  96. {
  97.         Ds_Init();
  98.         Timer0_Delay1ms(1);
  99.         Ds_Write(0xCC);//跳过ROM寻址
  100.         Ds_Write(0x44);//启动一次温度转换
  101. }

  102. /*ds18b20获取温度子函数*/
  103. unsigned int Get_Temp()
  104. {
  105.         unsigned int temp=0;
  106.         unsigned char LSB,MSB;//用来储存数据的第八位与高八位
  107.         Ds_Init();
  108.         Timer0_Delay1ms(1);
  109.         Ds_Write(0xCC);//跳过寻址
  110.         Ds_Write(0xBE);//发送读值命令·
  111.         LSB=Ds_Read();
  112.         MSB=Ds_Read();
  113.         temp=MSB;
  114.         temp<<=8;
  115.         temp|=LSB;
  116.         return temp;
  117. }


  118. /*ds18b20  返回最终结果子函数*/
  119. unsigned int Ds_Result()
  120. {
  121.         float tp;
  122.         unsigned int temp;
  123.         Timer0_Delay1ms(10);//10ms度过不稳定期
  124.         Ds_Change();//转换温度
  125.         Timer0_Delay1ms(1000);//延时1s等待转化
  126.         temp=Get_Temp();
  127.         tp=temp;
  128.         temp=tp*0.0625;
  129.         return temp;//最终结果为temp
  130. }

  131. void main (void)
  132. {
  133.    Set_All_GPIO_Quasi_Mode;
  134.          while(1)
  135.    {   
  136.     temp0=Ds_Result();//该值即为结果       
  137.           //Delay1ms(500);
  138.    }
  139. }


复制代码

使用特权

评论回复
 楼主 | 2019-6-12 18:14 | 显示全部楼层
还是延迟问题。N76E003的延迟在1MS以上精度还是可以的,可是US怎么都调不好。误差好高。官方的一样误差很高。我用示波器显示的相差好多。

使用特权

评论回复
 楼主 | 2019-6-12 18:26 | 显示全部楼层
QQ截图20190612182522.png 1个nop高达2.833

使用特权

评论回复
 楼主 | 2019-6-13 13:11 | 显示全部楼层
终于弄好了,就是延迟问题,调好就OK了

使用特权

评论回复
| 2019-6-13 22:11 | 显示全部楼层
对,时序对了,就是延时问题。

使用特权

评论回复
| 2019-6-13 23:47 | 显示全部楼层
这个是不是跟DHT11的读取时序一样啊

使用特权

评论回复
| 2019-6-13 23:48 | 显示全部楼层
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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