【龙芯1B】:DS18B20测温例程

图片来自互联网

文章目录


前言

一、DS18B20是什么?

二、开发代码

1.代码

2.例图

总结


前言

文章参考官方各类书籍,以及网络知识,如有侵权,请联系我立马删帖道歉!!!谢谢各位的关注,大家的关注才是我不断更新的动力!


一、DS18B20是什么?

实物引脚图:

图片来自互联网
内部管脚说明

         DS18B20是一种单总线数字温度传感器,测试温度范围-55℃-125℃,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。

特点(参考官方数据手册):

  1. 1-Wire总线接口仅需要一个引脚来通信。
  2. 设备的内部ROM上都烧写了一个独一无二的64位序列号。
  3. 多路采集能力使得分布式温度采集应用更加简单。
  4. 能够采用数据线供电;供电范围为3.0V至5.5V。
  5. 温度可测量范围为:-55℃至+125℃(-67℉至+257℉)。
  6. 温度范围超过-10℃至85℃之外时具有+-0.5℃的精度。
  7. 内部温度采集精度可以由用户自定义为9-Bits至12-Bits

以上讲解了DS18B20一些基础的知识,具体的知识大家可以参考官方的数据手册,认真研究一下,我这里就不在展开!

二、开发代码

1.代码

DS18B20.c如下:

#include "ds18b20.h"
#include "ls1b_gpio.h"
#include "bsp.h"
#include "ls1b.h"
#include "tick.h"

void DS18B20_DQ_OUT(int a)
{
    gpio_write(DS8B20_IO,a);
}

//单总线设置为输入
void DS18B20_IO_IN(void)
{
  gpio_enable(DS8B20_IO,DIR_IN);
}


//单总线设置为输出
void DS18B20_IO_OUT(void)
{
  gpio_enable(DS8B20_IO,DIR_OUT);
}


//复位DS18B20
void DS18B20_Rst(void)
{
	DS18B20_IO_OUT(); //SET PA0 OUTPUT
    DS18B20_DQ_OUT(0); //DQ=0
    delay_us(480);    //DS1820,拉低最高600us,最低351us
    DS18B20_DQ_OUT(1); //DQ=1
	delay_us(15);     //15US
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
unsigned char DS18B20_Check(void)
{
	unsigned char retry=0;
	DS18B20_IO_IN();//SET PA0 INPUT
    while (gpio_read(DS8B20_IO)&&retry<200)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=200)return 1;
	else retry=0;
    while (!gpio_read(DS8B20_IO)&&retry<240)
	{
		retry++;
		delay_us(1);
	};
	if(retry>=240)
		return 1;
	return 0;
}

//从DS18B20读取一个位
//返回值:1/0
unsigned char DS18B20_Read_Bit(void) 			 // read one bit
{
    unsigned char data;
	DS18B20_IO_OUT();//SET PA0 OUTPUT
    DS18B20_DQ_OUT(0);
	delay_us(2);
    DS18B20_DQ_OUT(1);
	DS18B20_IO_IN();//SET PA0 INPUT
	delay_us(11);
	if(gpio_read(DS8B20_IO)&0x01)
		data=1;
    else
		data=0;
    delay_us(50);
    return data;
}

//从DS18B20读取一个字节
//返回值:读到的数据
unsigned char DS18B20_Read_Byte(void)    // read one byte
{
    unsigned char i,j,dat;
    dat=0;
	for (i=1;i<=8;i++)
	{
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}

//写一个字节到DS18B20
//dat:要写入的字节
void DS18B20_Write_Byte(unsigned char dat)
 {
    unsigned char j;
    unsigned char testb;
	DS18B20_IO_OUT();//SET PA0 OUTPUT;
	DS18B20_DQ_OUT(1);
    for (j=1;j<=8;j++)
	{
        testb=dat&0x01;
        dat=dat>>1;


        if (testb)
        {
            DS18B20_DQ_OUT(0);// Write 1
            delay_us(2);
            DS18B20_DQ_OUT(1);
            delay_us(60);
        }
        else
        {
            DS18B20_DQ_OUT(0);// Write 0
            delay_us(60);
            DS18B20_DQ_OUT(1);
            delay_us(2);

        }
    }
}

//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{
    DS18B20_Rst();
	DS18B20_Check();
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}

//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在
unsigned char DS18B20_Init(void)
{
	DS18B20_IO_OUT();
	DS18B20_DQ_OUT(1);
	DS18B20_Rst();
	return DS18B20_Check();
}


//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
float DS18B20_Get_Temp(void)
{
    unsigned char temp;
    unsigned char TL,TH;
	short tem;
	float tempreal;
    DS18B20_Start ();        // ds1820 start convert
    DS18B20_Rst();
    DS18B20_Check();
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert
    TL=DS18B20_Read_Byte(); // LSB
    TH=DS18B20_Read_Byte(); // MSB
    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;//温度为负
    }
	else
		temp=1;//温度为正

    tem=TH; //获得高八位
    tem<<=8;
    tem+=TL;//获得低八位
    tempreal=(float)tem*0.0625f;//转换
	if(temp)return tempreal; //返回温度值
	else return -tempreal;
}

main.c如下:

int main(void)
{
    float temp = 0;
	char print_buf[]={""};
    printk("\r\nmain() function.\r\n");

    ls1x_drv_init();            		/* Initialize device drivers */

    install_3th_libraries();      		/* Install 3th libraies */
    DS18B20_Init();
    //打开显示
    fb_open();
    delay_ms(200);
    fb_textout(50, 30, "DS18b20温度传感器测量");
    fb_textout(50, 50, "温度传感器");
    fb_textout(50, 70, "当前温度: ");
    fb_drawline(50,120,50,450,cidxRED);
    fb_drawline(50,450,500,450,cidxRED);
    fb_drawpixel(100,100,cidxRED);
    fb_drawpoint(150,150,6,cidxGREEN);
    /*
     * 裸机主循环
     */
    while (1)
    {
     
      delay_ms(1000);
      fb_fillrect(160, 70, 480, 106, cidxBLACK);
      temp=DS18B20_Get_Temp();	//读取温度数据
	  sprintf(print_buf,"%6.2f ℃",temp);
	  fb_textout(160, 70, print_buf);
    }

   return 0;
}

2.例图


联系我们

                vx ——>  buildupup     公众号   嵌入式up   如果文章对您有帮助,请打赏一元呗,感谢支持,分享不易,码字不易。希望对大家帮助!


这世上最不会贬值的投资,就是为自己努力。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值