历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2021年01月10日 | 单片机MSP430 DS1B20 驱动

2021-01-10 来源:eefocus

多个共总线

ds18b20.h



#ifndef __ds18b20

#define __ds18b20


#include "msp430g2553.h"

#include

#include

#include


#define DQ_1 P2OUT |= BIT0

#define DQ_0 P2OUT &= ~BIT0

#define DQ_in   P2DIR &= ~BIT0

#define DQ_out  P2DIR |= BIT0

#define DQ_val  (P2IN & BIT0)


void read_rom(unsigned char rom[]);

void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1);


unsigned int get_one_temperature(unsigned char ch);

unsigned char DS18B20_SearchRomId(unsigned char (*pID)[8], unsigned char Num);//没用到


#endif


ds18b20.c


#include "ds18b20.h"


#define CPU_F ( (double) 8000000)

#define delay_us( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )

#define delay_ms( x )   __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )


unsigned char ds18b20_rom1[8] = { 0x80, 0x3C, 0x01, 0xA8, 0x16, 0x8D, 0xB7, 0x28 }; /* 八个DS18B20的64位ROM地址 */

unsigned char ds18b20_rom2[8] = { 0xB4, 0x3C, 0x01, 0xA8, 0x16, 0x1C, 0x9C, 0x28 };

unsigned char ds18b20_rom3[8] = { 0x6E, 0x3C, 0x01, 0xA8, 0x16, 0x8E, 0x3A, 0x28 };

unsigned char ds18b20_rom4[8] = { 0x9F, 0x3C, 0x01, 0xA8, 0x16, 0x75, 0xA3, 0x28 };


/************************************************

 ** 函数名称 : void reset(void)

 ** 函数功能 : ds18b20复位函数

 ** 输    入 : 无

 ** 输    出 : 无

 ** 说    明 :

 ************************************************/

void reset(void)

{


    DQ_out; /* 先设为输入口 */

    DQ_0; /* 主机发送复位脉冲,强制拉DQ至低电平 */

    delay_us(750); /* 延时500vs */

    DQ_1;

    delay_us(15);


//    DQ_in; /* 设为输入口,释放DQ线 */

//    while (DQ_val == 1)

//        ; /* 等待器件DS18B20应答(如果有低电平出现说明总线上有器件作出应答) */

//    delay_us(50); /* 延时 */

}

//等待DS18B20的回应

//返回1:未检测到DS18B20的存在

//返回0:存在

unsigned char DS18B20_Check(void)

{

    unsigned char retry = 0;

    DQ_in; //SET PA0 INPUT

    while (DQ_val && retry < 200)

    {

        retry++;

        delay_us(1);

    };

    if (retry >= 200)

        return 1;

    else

        retry = 0;

    while (!DQ_val && 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;

    DQ_out;            //SET PA0 OUTPUT

    DQ_0;

    delay_us(2);

    DQ_1;

    DQ_in;            //SET PA0 INPUT

    delay_us(12);

    if (DQ_val)

        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;

    DQ_out;    //SET PA0 OUTPUT;

    for (j = 1; j <= 8; j++)

    {

        testb = dat & 0x01;

        dat = dat >> 1;

        if (testb)

        {

            DQ_0;    // Write 1

            delay_us(2);

            DQ_1;

            delay_us(60);

        }

        else

        {

            DQ_0;    // Write 0

            delay_us(60);

            DQ_1;

            delay_us(2);

        }

    }

}

//开始温度转换

void DS18B20_Start(void)    // ds1820 start convert

{

    reset();

    DS18B20_Check();

    DS18B20_Write_Byte(0xcc);    // skip rom

    DS18B20_Write_Byte(0x44);    // convert

}


/************************************************

 ** 函数名称 : void read_rom(unsigned char rom[])

 ** 函数功能 : 从ds18b20中读出64位序列号

 ** 输    入 : 无

 ** 输    出 : 无

 ** 说    明 :

 ************************************************/

void read_rom(unsigned char rom[])

{

    unsigned char i;

    reset();

    DS18B20_Check();

    DS18B20_Write_Byte(0x33);

    for (i = 8; i > 0; i--)

    {

        rom[i - 1] = DS18B20_Read_Byte();

    }

}


/************************************************

 ** 函数名称 : bit match_rom(uchar *rom)

 ** 函数功能 : 64位的ROM序列号匹配

 ** 输    入 : 无

 ** 输    出 : 无

 ** 说    明 :

 ************************************************/

char match_rom(unsigned char *rom)

{

    unsigned char i;

    reset();

    DS18B20_Check();

    DS18B20_Write_Byte(0x55);

    for (i = 8; i > 0; i--)

    {

        DS18B20_Write_Byte(*(rom + i - 1));

    }

    return (1);

}

//写入配置 分辨率多少位 默认12位

void WRITE_ROM(unsigned char T_H, unsigned char T_L, unsigned char CONFIG1)

{

    reset(); /*复位 */

    DS18B20_Write_Byte(0xCC); /* SKIP ROM */

    DS18B20_Write_Byte(0x4E); /* 写RAM命令 */

    DS18B20_Write_Byte(T_H); /* 温度报警高限值 */

    DS18B20_Write_Byte(T_L); /* 温度报警低限值 */

    DS18B20_Write_Byte(CONFIG1); /* 配置位 */

    reset(); /* 重新复位 */

    DS18B20_Write_Byte(0xCC); /* SKIP ROM */

    DS18B20_Write_Byte(0x48); /* 将RAM拷贝到EEPROM */

    delay_ms(12); /* 耗时约10MS */

}


/* 读取温度 */

unsigned int get_one_temperature(unsigned char ch)

{

    unsigned int Temp_l = 0, Temp_h = 0, Temp = 0;

    float f_temp;


    switch (ch)

    {

    case 1:

        match_rom(ds18b20_rom1);

        break;

    case 2:

        match_rom(ds18b20_rom2);

        break;

    case 3:

        match_rom(ds18b20_rom3);

        break;

    case 4:

        match_rom(ds18b20_rom4);

        break;

    }

    DS18B20_Write_Byte(0xbe);                    // convert

    Temp_l = DS18B20_Read_Byte(); // LSB

    Temp_h = DS18B20_Read_Byte(); // MSB


    DS18B20_Start();                    // ds1820 start convert


    Temp_h <<= 8;

    Temp = Temp_h + Temp_l;

    f_temp = Temp * 0.0625; /* 18b20的分辨率是0.0625 */

    Temp = f_temp * 10 + 0.5; /* 乘以10表示小数点后面取一位,加0.5是四舍五入 */

    return (Temp); /* Temp是整型 */

}


/*****************************************************************

 * @brief   :DS18B20_WriteBit() 主机向总线写1bit 数据

 * @param   : bit:要写入位的值 0或1

 * @retval  :无

 ****************************************************************/

void DS18B20_WriteBit(unsigned char bit)

{

    DQ_out; /* 主机端口推挽输出模式 */

    DQ_0; /* Write 0 拉低总线10-15us */

    delay_us(12);


    if (bit & 0x01)

    {


        DQ_1;  // Write 1


    }

    else

    {

        DQ_0;    // Write 0


    }


    delay_us(30); /* 写入数据位,保持20-45us */

    DQ_1; /* 释放总线 */

    delay_us(5);

}


/*****************************************************************

 * @brief   :DS18B20_Read2Bit() 主机从总线上读取2位的数据

 * @param   :无

 * @retval  :读到到的数据 :00H,01H,10H,11H

 ****************************************************************/

unsigned char DS18B20_Read2Bit(void)

{

    unsigned char i, data = 0;


    for (i = 0; i < 2; i++)

    {

        data <<= 1;

        if (DS18B20_Read_Bit())

            data |= 1;

    }

    return (data);

}

/*****************************************************************

 * @brief   :DS18B20_CRC8() DS18B20 ROMID CRC校验

 * @param   :*pRomId :要校验诉RomID

 * @retval  :返回校验值

 ****************************************************************/

unsigned char DS18B20_CRC8(unsigned char *pRomId)

{

    unsigned char i, x;

    unsigned char crcbuff;

    unsigned char crc;

    crc = 0;

    for (x = 0; x < 8; x++)

    {

        crcbuff = pRomId[x];

        for (i = 0; i < 8; i++)

        {

            if (((crc ^ crcbuff) & 0x01) == 0)

                crc >>= 1;

            else

            {

                crc ^= 0x18; /* crc=x8+x5+x4+1 */

                crc >>= 1;

                crc |= 0x80;

推荐阅读

史海拾趣

ATM [Advanced Technical Materials]公司的发展小趣事

随着科技的进步,ATM也在不断进行技术创新和升级。从最初的简单取款功能,到现在的存款、转账、查询等多种功能,ATM的功能日益丰富。同时,随着移动支付和互联网金融的兴起,ATM也在逐渐与这些新技术融合,提供更加便捷、安全的金融服务。

南京绿芯(Grenergy)公司的发展小趣事

然而,随着ATM的普及,安全问题也日益凸显。黑客攻击、恶意软件植入等事件时有发生,给ATM的安全运营带来了挑战。为了应对这些挑战,ATM行业加强了技术研发和安全防护,采用更加先进的加密技术和安全机制,确保用户的资金安全。

以上五个故事虽然不直接涉及ATM公司的具体发展,但展示了ATM技术在电子行业中的发展历程和重要事件。这些故事反映了ATM从诞生到广泛应用,再到技术创新和安全挑战的整个过程,也展示了电子行业在推动ATM发展中的重要作用。

Everbuild公司的发展小趣事

Everbuild公司成立于2005年,创始人李明是一位对电子技术充满热情的年轻人。在创业初期,公司只有几个员工和一间狭小的办公室。李明带领团队日夜兼程地研发电子元器件,但由于资金短缺和市场竞争激烈,产品销量并不理想。然而,他们并没有放弃,通过不断的技术创新和成本控制,终于在一年后推出了一款具有竞争力的电源管理芯片,赢得了市场的认可。

HELUKABEL公司的发展小趣事

随着公司的逐步发展,Everbuild开始注重技术研发和品牌建设。公司投入大量资金引进先进的生产设备和技术人才,不断推出具有创新性的电子产品。其中,一款高性能的智能手机处理器在市场上引起了热烈反响,成为公司的明星产品。同时,Everbuild还加强了品牌宣传和推广,提高了品牌的知名度和美誉度。

Component General Inc公司的发展小趣事

在技术创新的基础上,Component General Inc公司开始积极拓展市场。公司不仅在国内市场取得了良好的销售业绩,还积极开拓国际市场,与多家海外企业建立了合作关系。同时,公司也注重品牌建设,通过参加各种行业展会、举办技术研讨会等方式,提升公司的知名度和影响力。

Cygnal Integrated Products Inc公司的发展小趣事

为了进一步扩大市场份额,Cygnal决定进入国际市场。公司通过参加国际电子展、与海外代理商合作等方式,积极推广其产品和服务。同时,Cygnal还针对不同地区的市场需求进行了产品定制和优化,使其产品更加符合当地消费者的需求。这些努力使Cygnal在国际市场上取得了显著的成功。

问答坊 | AI 解惑

怎样选择台式示波器

几年前模拟示波器是台式示波器唯一的候选产品。现今,便宜的数字存储示波器(DSO)的推出,已经为工程师们提供了几十种可供选择的型号。----DSO是很有吸引力的,因为它可以存储波形、求信号平均,并支持各种触发和分析选件。但DSO并非都是一样的。 ...…

查看全部问答>

TOTA EMS(设备管理系统)简介

TOTA EMS(设备管理系统)简介生产设备,对一个制造型企业来说越来越重要,它是代表制造业先进生产力不可或缺的元素。目前,制造型企业所采用的生产设备是否更智能化,数量是否更多等,这些指标在一定程度上也标识了一个制造型企业的竞争力。然而如 ...…

查看全部问答>

DXP不能生成PCB,真心求救,挺着急的

大家好,我在做一个毕设,按照nRF2402的数据手册建好了原理图,protel dxp没有2402的封装,我就自己建了个库,可是怎么也编译不过去,真是挺着急的,我把我做的东西都传上来,麻烦大家帮忙看看,学生不尽感激..... 这是几张截图,大家能发现问题的 ...…

查看全部问答>

S3C6410 CAMERA 如何接收灰度图像

我有一个灰度显示的摄像头,也就是只有流明度信息 Y,一个BYTE表示一个像素点,看了S3C6410的手册,发现要么数据时YUV,要么是RGB, DMA后的内存组织方式是YUV三通道分量存储,或者是插入式存储,能够比较高效的直接将Y通道数据一一对应像素点的顺 ...…

查看全部问答>

关于NdisSend发送数据包的流量统计

        MPSendPackets(){ ....                        pAdapt->nTotalPacketsSeen[pVElan->NetworkConnection]++;       ...…

查看全部问答>

调试RDA出错

我调试下的RDA实例程序,提示LINK : fatal error LNK1104: cannot open file \'ca_mergex20.lib\' 我按照书中的提示已经在Tool|Options中将ca_mergex20.lib所在的路径添加了,可是还是提示找不到ca_mergex20.lib,请问各位是什么原因? 在线等待中... ...…

查看全部问答>

linux内核级定时中断执行用户级回调函数

各位大虾:      最近有个问题困扰小弟很长时间了,请帮帮忙给点启示,在此多谢了!      我在linux内核里实现了一个1ms的定时器驱动,每当定时器到期时会发生定时中断,我想在我的定时中断处理函数(驱 ...…

查看全部问答>

51单片机地址清零操作是?

51单片机地址清零操作是?…

查看全部问答>

三大浏览器GPU加速测试,有谁欢喜有谁愁?

  我们浏览网页必然需要浏览器,所以一个好的浏览器是至关重要的,可以保证我们浏览器网页、看视频、玩游戏的流畅和清晰。之前看到说Firefox和chrome都支持GPU硬件加速,前段时间发布的IE9Beta版据说也对GPU加速和Html5有着很好的支持,不知道效 ...…

查看全部问答>

有没有人在搞C8051F350啊??今天刚开始弄这个单片机

项目要求: 两线制电源供电,输出4~20mA电流信号(用XTR115处理电流及电源) 传感器模拟信号直接进入单片机的24位AD进行处理 RS232芯片可以与电脑进行通信(如果功耗允许的话会选择485通信) 4位数码管屏幕显示,3个按键操作 利用单片机的PWM输出电压 ...…

查看全部问答>