打印
[技术问答]

有没有N76E003读取DS18B20的代码

[复制链接]
3160|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在网上找了一些51的,DS18B20的代码。刚接触N76E003,不知道怎么改。
/*所用单片机型号为STC89C52RC,晶振为11.0592MHz*/

#include<reg52.h>

#include<intrins.h>



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



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

void Delay1ms(unsigned int t);



/*ds18b20 10*t延时函数*/
void Delay10us(unsigned int t)
{
    unsigned int i;
    for(i=t;i>0;i--)
    {
        _nop_();  _nop_();
        _nop_();  _nop_();
        _nop_();  _nop_();
    }
}




/*dsb8b20 1ms延时函数*/
void Delay1ms(unsigned int t)   //误差 0us
{
    unsigned char a,b,c;
        for(t;t>0;t--)
            for(c=1;c>0;c--)
                for(b=142;b>0;b--)
                    for(a=2;a>0;a--);
}
/*ds18b20初始化*/
bit Ds_Init()
{
        bit ack;
        Bus=0;
        Delay10us(60);//最小480,最大960
        Bus=1;
        Delay10us(6);//15-60us
        while(Bus==0);
        Bus=1;//让传感器释放总线,避免影响下一步
        return ack;//ack为0则响应成功
}




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


                Bus=0;
                _nop_();
                if((mask&dat)==0)
                {
                        Bus=0;
                }
                else
                {
                        Bus=1;
                }
                Delay10us(6);//15-60us采样
                Bus=1;
                _nop_();
                _nop_();
        }
}


/*ds18b20读时序*/
unsigned char Ds_Read()
{
        unsigned char dat=0;
        unsigned char mask,fmask;
        for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
        {
                Bus=0;
                _nop_();
                Bus=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                if(Bus==0)//读0
                {
                        fmask=~mask;
                        dat=dat&fmask;
                }
                else
                {
                        dat|=mask;
                }
                Delay10us(5);
                Bus=1;


        }
        return dat;
}


/*转换温度子函数*/
void Ds_Change()
{
        Ds_Init();
        Delay1ms(1);
        Ds_Write(0xCC);//跳过ROM寻址
        Ds_Write(0x44);//启动一次温度转换




}


/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
        unsigned int temp=0;
        unsigned char LSB,MSB;//用来储存数据的第八位与高八位
        Ds_Init();
        Delay1ms(1);
        Ds_Write(0xCC);//跳过寻址
        Ds_Write(0xBE);//发送读值命令·
        LSB=Ds_Read();
        MSB=Ds_Read();
        temp=MSB;
        temp<<=8;
        temp|=LSB;
        return temp;
}


/*ds18b20  返回最终结果子函数*/
unsigned int Ds_Result()
{
        float tp;
        unsigned int temp;
        Delay1ms(10);//10ms度过不稳定期
         Ds_Change();//转换温度
        Delay1ms(1000);//延时1s等待转化
        temp=Get_Temp();
        tp=temp;
        temp=tp*0.0625;
        return temp;//最终结果为temp
}



int main()

{

    unsigned int temp;

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

}

使用特权

评论回复
沙发
643757107| | 2019-6-11 20:38 | 只看该作者
不能用吗?其实51的基本上可以直接拿来用

使用特权

评论回复
板凳
yunxiang521|  楼主 | 2019-6-12 12:38 | 只看该作者
无法直接使用,改了延时都不行。以接4.7K电阻

使用特权

评论回复
地板
yunxiang521|  楼主 | 2019-6-12 16:01 | 只看该作者
延时函数改成了新唐的延时也是行,有没有大牛帮改一下。
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

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

//***********************************************************************************************************
//  File Function: N76E003 UART-0 Mode3 demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Common.h"
#include "Delay.h"
#include "Function_define.h"
#include "string.h"

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



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

/*ds18b20初始化*/
bit Ds_Init()
{
        bit ack;
        Bus=0;
             
        Timer3_Delay10us(60);//最小480,最大960
        Bus=1;
        Timer3_Delay10us(6);//15-60us
        while(Bus==0);
        Bus=1;//让传感器释放总线,避免影响下一步
        return ack;//ack为0则响应成功
}
/*ds18b20写时序*/
void Ds_Write(unsigned char dat)//一个写周期为60-120us,主机在15--45us内对信号采样
{
        unsigned char mask;
        for(mask=0x01;mask!=0;mask<<=1)
        {
                Bus=0;
                _nop_();
                if((mask&dat)==0)
                {
                        Bus=0;
                }
                else
                {
                        Bus=1;
                }
                Timer3_Delay10us(6);//15-60us采样
                Bus=1;
                _nop_();
                _nop_();
        }
}


/*ds18b20读时序*/
unsigned char Ds_Read()
{
        unsigned char dat=0;
        unsigned char mask,fmask;
        for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成
        {
                Bus=0;
                _nop_();
                Bus=1;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                if(Bus==0)//读0
                {
                        fmask=~mask;
                        dat=dat&fmask;
                }
                else
                {
                        dat|=mask;
                }
                Timer3_Delay10us(5);
                Bus=1;


        }
        return dat;
}


/*转换温度子函数*/
void Ds_Change()
{
        Ds_Init();
        Timer0_Delay1ms(1);
        Ds_Write(0xCC);//跳过ROM寻址
        Ds_Write(0x44);//启动一次温度转换
}

/*ds18b20获取温度子函数*/
unsigned int Get_Temp()
{
        unsigned int temp=0;
        unsigned char LSB,MSB;//用来储存数据的第八位与高八位
        Ds_Init();
        Timer0_Delay1ms(1);
        Ds_Write(0xCC);//跳过寻址
        Ds_Write(0xBE);//发送读值命令·
        LSB=Ds_Read();
        MSB=Ds_Read();
        temp=MSB;
        temp<<=8;
        temp|=LSB;
        return temp;
}


/*ds18b20  返回最终结果子函数*/
unsigned int Ds_Result()
{
        float tp;
        unsigned int temp;
        Timer0_Delay1ms(10);//10ms度过不稳定期
        Ds_Change();//转换温度
        Timer0_Delay1ms(1000);//延时1s等待转化
        temp=Get_Temp();
        tp=temp;
        temp=tp*0.0625;
        return temp;//最终结果为temp
}

void main (void)
{
   Set_All_GPIO_Quasi_Mode;
         while(1)
   {   
    temp0=Ds_Result();//该值即为结果       
          //Delay1ms(500);
   }
}


使用特权

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

使用特权

评论回复
6
yunxiang521|  楼主 | 2019-6-12 18:26 | 只看该作者
1个nop高达2.833

使用特权

评论回复
7
yunxiang521|  楼主 | 2019-6-13 13:11 | 只看该作者
终于弄好了,就是延迟问题,调好就OK了

使用特权

评论回复
评论
不易1 2021-8-29 22:05 回复TA
可以贴一下代码吗 
8
heisexingqisi| | 2019-6-13 22:11 | 只看该作者
对,时序对了,就是延时问题。

使用特权

评论回复
9
dongnanxibei| | 2019-6-13 23:47 | 只看该作者
这个是不是跟DHT11的读取时序一样啊

使用特权

评论回复
10
dongnanxibei| | 2019-6-13 23:48 | 只看该作者
11
不易1| | 2021-8-29 21:34 | 只看该作者
我也遇到这个问题,读出来的数是错的,你能把N76E003的代码贴出来吗?谢谢

使用特权

评论回复
12
pixhw| | 2021-9-1 21:26 | 只看该作者
最简单的就是宏定义实现的。   

使用特权

评论回复
13
sdlls| | 2021-9-1 21:26 | 只看该作者
就是IO口的操作吧   

使用特权

评论回复
14
febgxu| | 2021-9-1 21:26 | 只看该作者
代码不兼容吗?      

使用特权

评论回复
15
xiaoyaodz| | 2021-9-1 21:26 | 只看该作者
你可以参考一些stm32的操作方式  

使用特权

评论回复
16
fentianyou| | 2021-9-1 21:26 | 只看该作者
对基本的IO代码操作会吗   

使用特权

评论回复
17
selongli| | 2021-9-1 21:27 | 只看该作者
这个最难是延时函数的操作。  

使用特权

评论回复
18
minzisc| | 2021-9-1 21:27 | 只看该作者
推荐sht30吧      

使用特权

评论回复
19
lzmm| | 2021-9-1 21:27 | 只看该作者
DS18B20的代码网上有很多。   

使用特权

评论回复
20
kkzz| | 2021-9-1 21:28 | 只看该作者
延时函数调整好了就行。   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

100

帖子

0

粉丝