历史上的今天
返回首页

历史上的今天

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

2019年01月26日 | STC 18B20温度传感器读写程序

2019-01-26 来源:eefocus

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

;WWW.STCMCU.COM

;Mobile:13922805190

;0755-82948412

温度传感器DS18B20测试程序

主芯片  : STC12C5A60S2 (1T)

工作频率: 12.000MHz

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

 

#include "REG51.H"

#include "INTRINS.H"

 

typedef unsigned char BYTE;

 

sbit DQ = P3^3;                     //DS18B20的数据口位P3.3

BYTE TPH;                           //存放温度值的高字节

BYTE TPL;                           //存放温度值的低字节

 

void DelayXus(BYTE n);

void DS18B20_Reset();

void DS18B20_WriteByte(BYTE dat);

BYTE DS18B20_ReadByte();

 

void main()

{

    DS18B20_Reset();                //设备复位

    DS18B20_WriteByte(0xCC);        //跳过ROM命令

    DS18B20_WriteByte(0x44);        //开始转换命令

    while (!DQ);                    //等待转换完成

 

    DS18B20_Reset();                //设备复位

    DS18B20_WriteByte(0xCC);        //跳过ROM命令

    DS18B20_WriteByte(0xBE);        //读暂存存储器命令

    TPL = DS18B20_ReadByte();       //读温度低字节

    TPH = DS18B20_ReadByte();       //读温度高字节

 

    while (1);

}

 

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

延时X微秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

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

void DelayXus(BYTE n)

{

    while (n--)

    {

        _nop_();

        _nop_();

    }

}

 

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

复位DS18B20,并检测设备是否存在

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

void DS18B20_Reset()

{

    CY = 1;

    while (CY)

    {

        DQ = 0;                     //送出低电平复位信号

        DelayXus(240);              //延时至少480us

        DelayXus(240);

        DQ = 1;                     //释放数据线

        DelayXus(60);               //等待60us

        CY = DQ;                    //检测存在脉冲

        DelayXus(240);              //等待设备释放数据线

        DelayXus(180);

    }

}

 

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

从DS18B20读1字节数据

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

BYTE DS18B20_ReadByte()

{

    BYTE i;

    BYTE dat = 0;

 

    for (i=0; i<8; i++)             //8位计数器

    {

        dat >>= 1;

        DQ = 0;                     //开始时间片

        DelayXus(1);                //延时等待

        DQ = 1;                     //准备接收

        DelayXus(1);                //接收延时

        if (DQ) dat |= 0x80;        //读取数据

        DelayXus(60);               //等待时间片结束

    }

 

    return dat;

}

 

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

向DS18B20写1字节数据

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

void DS18B20_WriteByte(BYTE dat)

{

    char i;

 

    for (i=0; i<8; i++)             //8位计数器

    {

        DQ = 0;                     //开始时间片

        DelayXus(1);                //延时等待

        dat >>= 1;                  //送出数据

        DQ = CY;

        DelayXus(60);               //等待时间片结束

        DQ = 1;                     //恢复数据线

        DelayXus(1);                //恢复延时

    }

}

 


1T时的  汇编程序


;**************************************

;WWW.STCMCU.COM

;Mobile:13922805190

;0755-82948412

;温度传感器DS18B20测试程序

;主芯片  : STC12C5A60S2 (1T)

;工作频率: 12.000MHz

;**************************************

 

DQ  BIT P3.3                ;DS18B20的数据口位P3.3

 

TPH DATA 20H                ;存放温度值的高字节

TPL DATA 21H                ;存放温度值的低字节

 

    ORG 0

    JMP Reset

 

    ORG 100H

Reset:

    CALL DS18B20_Reset      ;设备复位

    MOV A,#0CCH             ;跳过ROM命令

    CALL DS18B20_WriteByte  ;送出命令

    MOV A,#044H             ;开始转换

    CALL DS18B20_WriteByte  ;送出命令

    JNB DQ,$                ;等待转换完成

 

    CALL DS18B20_Reset      ;设备复位

    MOV A,#0CCH             ;跳过ROM命令

    CALL DS18B20_WriteByte  ;送出命令

    MOV A,#0BEH             ;读暂存存储器

    CALL DS18B20_WriteByte  ;送出命令

    CALL DS18B20_ReadByte   ;读温度低字节

    MOV TPL,A               ;存储数据

    CALL DS18B20_ReadByte   ;读温度高字节

    MOV TPH,A               ;存储数据

 

    JMP $

 

;**************************************

;延时X微秒(STC12C5A60S2@12M)

;不同的工作环境,需要调整此函数

;入口参数:R7

;出口参数:无

;**************************************

DelayXus:                   ;6 此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    DJNZ R7,DelayXus        ;4

    RET                     ;4

 

;**************************************

;复位DS18B20,并检测设备是否存在

;入口参数:无

;出口参数:无

;**************************************

DS18B20_Reset:

    CLR DQ                  ;送出低电平复位信号

    MOV R7,#240             ;延时至少480us

    CALL DelayXus

    MOV R7,#240

    CALL DelayXus

    SETB DQ                 ;释放数据线

    MOV R7,#60              ;等待60us

    CALL DelayXus

    MOV C,DQ                ;检测存在脉冲

    MOV R7,#240             ;等待设备释放数据线

    CALL DelayXus

    MOV R7,#180

    CALL DelayXus

    JC DS18B20_Reset         ;如果设备不存在,则继续等待

    RET

 

;**************************************

;从DS18B20读1字节数据

;入口参数:无

;出口参数:ACC

;**************************************

DS18B20_ReadByte:

    CLR A

    PUSH 0

    MOV 0,#8                ;8位计数器

ReadNext:

    CLR DQ                  ;开始时间片

    MOV R7,#1               ;延时等待

    CALL DelayXus

    SETB DQ                 ;准备接收

    MOV R7,#1

    CALL DelayXus

    MOV C,DQ                ;读取数据

    RRC A

    MOV R7,#60              ;等待时间片结束

    CALL DelayXus

    DJNZ 0,ReadNext

    POP 0

    RET

 

;**************************************

;向DS18B20写1字节数据

;入口参数:ACC

;出口参数:无

;**************************************

DS18B20_WriteByte:

    PUSH 0

    MOV 0,#8                ;8位计数器

WriteNext:

    CLR DQ                  ;开始时间片

    MOV R7,#1               ;延时等待

    CALL DelayXus

    RRC A                   ;输出数据

    MOV DQ,C

    MOV R7,#60              ;等待时间片结束

    CALL DelayXus

    SETB DQ                 ;准备送出下一位数据

    MOV R7,#1

    CALL DelayXus

    DJNZ 0,WriteNext

    POP 0

    RET

 

    END

 


12T的C51程序


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

;WWW.STCMCU.COM

;Mobile:13922805190

;0755-82948412

温度传感器DS18B20测试程序

主芯片  : STC90C52RC (12T)

工作频率: 12.000MHz

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

 

#include "REG51.H"

#include "INTRINS.H"

 

typedef unsigned char BYTE;

 

sbit DQ = P3^3;                     //DS18B20的数据口位P3.3

BYTE TPH;                           //存放温度值的高字节

BYTE TPL;                           //存放温度值的低字节

 

void DelayXus(BYTE n);

void DS18B20_Reset();

void DS18B20_WriteByte(BYTE dat);

BYTE DS18B20_ReadByte();

 

void main()

{

    DS18B20_Reset();                //设备复位

    DS18B20_WriteByte(0xCC);        //跳过ROM命令

    DS18B20_WriteByte(0x44);        //开始转换命令

    while (!DQ);                    //等待转换完成

 

    DS18B20_Reset();                //设备复位

    DS18B20_WriteByte(0xCC);        //跳过ROM命令

    DS18B20_WriteByte(0xBE);        //读暂存存储器命令

    TPL = DS18B20_ReadByte();       //读温度低字节

    TPH = DS18B20_ReadByte();       //读温度高字节

 

    while (1);

}

 

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

延时X*10微秒(STC90C52RC@12M)

不同的工作环境,需要调整此函数

当改用1T的MCU时,请调整此延时函数

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

void DelayX0us(BYTE n)

{

    while (n--)

    {

        _nop_();

        _nop_();

    }

}

 

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

复位DS18B20,并检测设备是否存在

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

void DS18B20_Reset()

{

    CY = 1;

    while (CY)

    {

        DQ = 0;                     //送出低电平复位信号

        DelayX0us(48);              //延时至少480us

        DQ = 1;                     //释放数据线

        DelayX0us(6);               //等待60us

        CY = DQ;                    //检测存在脉冲

        DelayX0us(42);              //等待设备释放数据线

    }

}

 

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

从DS18B20读1字节数据

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

BYTE DS18B20_ReadByte()

{

    BYTE i;

    BYTE dat = 0;

 

    for (i=0; i<8; i++)             //8位计数器

    {

        dat >>= 1;

        DQ = 0;                     //开始时间片

        _nop_();                    //延时等待

        _nop_();

        DQ = 1;                     //准备接收

        _nop_();                    //接收延时

        _nop_();

        if (DQ) dat |= 0x80;        //读取数据

        DelayX0us(6);               //等待时间片结束

    }

 

    return dat;

}

 

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

向DS18B20写1字节数据

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

void DS18B20_WriteByte(BYTE dat)

{

    char i;

 

    for (i=0; i<8; i++)             //8位计数器

    {

        DQ = 0;                     //开始时间片

        _nop_();                    //延时等待

        _nop_();

        dat >>= 1;                  //送出数据

        DQ = CY;

        DelayX0us(6);               //等待时间片结束

        DQ = 1;                     //恢复数据线

    }

}

 


 


12T 汇编程序


;**************************************

;WWW.STCMCU.COM

;Mobile:13922805190

;0755-82948412

;温度传感器DS18B20测试程序

;主芯片  : STC90C52RC (12T)

;工作频率: 12.000MHz

;**************************************

 

DQ  BIT P3.3                ;DS18B20的数据口位P3.3

 

TPH DATA 20H                ;存放温度值的高字节

TPL DATA 21H                ;存放温度值的低字节

 

    ORG 0

    JMP Reset

 

    ORG 100H

Reset:

    CALL DS18B20_Reset      ;设备复位

    MOV A,#0CCH             ;跳过ROM命令

    CALL DS18B20_WriteByte  ;送出命令

    MOV A,#044H             ;开始转换

    CALL DS18B20_WriteByte  ;送出命令

    JNB DQ,$                ;等待转换完成

 

    CALL DS18B20_Reset      ;设备复位

    MOV A,#0CCH             ;跳过ROM命令

    CALL DS18B20_WriteByte  ;送出命令

    MOV A,#0BEH             ;读暂存存储器

    CALL DS18B20_WriteByte  ;送出命令

    CALL DS18B20_ReadByte   ;读温度低字节

    MOV TPL,A               ;存储数据

    CALL DS18B20_ReadByte   ;读温度高字节

    MOV TPH,A               ;存储数据

 

    JMP $

 

;**************************************

;延时X*10微秒(STC90C52RC@12M)

;不同的工作环境,需要调整此函数

;入口参数:R7

;出口参数:无

;**************************************

DelayX0us:                  ;2 当改用1T的MCU时,请调整此延时函数

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    NOP                     ;1

    DJNZ R7,DelayX0us       ;2

    RET                     ;2

 

;**************************************

;复位DS18B20,并检测设备是否存在

;入口参数:无

;出口参数:无

;**************************************

DS18B20_Reset:

    CLR DQ                  ;送出低电平复位信号

    MOV R7,#48              ;延时至少480us

    CALL DelayX0us

    SETB DQ                 ;释放数据线

    MOV R7,#6               ;等待60us

    CALL DelayX0us

    MOV C,DQ                ;检测存在脉冲

    MOV R7,#42              ;等待设备释放数据线

    CALL DelayX0us

    JC DS18B20_Reset        ;如果设备不存在,则继续等待

    RET

 

;**************************************

;从DS18B20读1字节数据

;入口参数:无

;出口参数:ACC

;**************************************

DS18B20_ReadByte:

    CLR A

    PUSH 0

    MOV 0,#8                ;8位计数器

ReadNext:

    CLR DQ                  ;开始时间片

    NOP

    NOP

    SETB DQ                 ;准备接收

    NOP

    NOP

    MOV C,DQ                ;读取数据

    RRC A

    MOV R7,#6               ;等待时间片结束

    CALL DelayX0us

    DJNZ 0,ReadNext

    POP 0

    RET

 

;**************************************

;向DS18B20写1字节数据

;入口参数:ACC

;出口参数:无

;**************************************

DS18B20_WriteByte:

    PUSH 0

    MOV 0,#8                ;8位计数器

WriteNext:

    CLR DQ                  ;开始时间片

    NOP

    NOP

    RRC A                   ;输出数据

    MOV DQ,C

    MOV R7,#6               ;等待时间片结束

    CALL DelayX0us

    SETB DQ                 ;准备送出下一位数据

    DJNZ 0,WriteNext

    POP 0

    RET

 

    END

 


推荐阅读

史海拾趣

川晶科技公司的发展小趣事

品质是川晶科技的生命线。公司始终将品质管理贯穿于产品研发、生产、销售等各个环节,严格执行质量管理体系标准。通过引进先进的检测设备和方法,加强产品质量控制和检验,确保每一件产品都符合客户的要求和期望。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和服务。川晶科技凭借卓越的品质和优质的服务赢得了客户的信赖和支持。

Advanced Thermal Solutions公司的发展小趣事

ATS公司成立于1989年,最初是一家专注于电子产品热管理咨询的公司。创始人团队凭借其深厚的电子工程背景和敏锐的市场洞察力,识别到电子产品热管理领域的潜在机遇。经过数月的研究和开发,ATS成功研发出了一种新型散热技术,显著提高了电子设备的散热效率。这一技术突破迅速赢得了市场的认可,ATS开始收到来自各大电子产品制造商的咨询和合作请求。

爱特姆(ATOM)公司的发展小趣事

爱特姆在国内市场取得一定成绩后,开始积极拓展国际市场。通过与欧洲、美国等国家的知名企业建立合作关系,爱特姆的产品逐渐打入国际市场,并赢得了良好的口碑。同时,公司还积极参加国际电子展会,与全球同行交流学习,不断提升自身的国际竞争力。

Global Communications公司的发展小趣事
温度传感器的输出与温度之间的线性关系也很重要,因为这直接影响到补偿电路的准确性和稳定性。
Crameda Intersys公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Crameda Intersys公司始终将质量管理放在首位,建立了严格的质量管理体系。公司从原材料采购、生产制造到产品检验等各个环节都严格把关,确保产品质量的稳定性和可靠性。这种对质量的执着追求赢得了客户的信任和好评,也为公司的长期发展奠定了坚实的基础。

EECO Switch公司的发展小趣事

EECO Switch公司成立于1947年,最初作为加利福尼亚州的一家电子工程公司,致力于电子产品的设计与制造。随着技术的不断进步和市场需求的变化,公司逐渐将业务重心转向人机界面产品的设计与开发。在这个过程中,EECO Switch凭借其深厚的技术积累和创新精神,成功开发出了一系列具有领先技术的人机界面产品,从而确立了其在该领域的领先地位。

问答坊 | AI 解惑

WiMAX技术综述

人类的科学总是不断进步的,技术总是为应运而生的。WiMAX 作为一项新兴技术,能够在比Wi-Fi更广阔的地域范围内提供“最后一公里”宽带连接性,由此支持企业客户享受T1 类服务以及居民用户拥有相当于线缆/DSL 的访问能力。凭借其在任意地点的1~6 英 ...…

查看全部问答>

wince eboot之flash管理问题

我使用S3C2410芯片和K9F1208的FLASH。现在我的EBOOT可以实现直接下载NK.BIN并在RAM中启动,但是无法在FLASH中启动。 超级终端显示如下: TFTP: Desktop losing ACK, block number = 18570, Ack again TFTP: Desktop losing ACK, block number = ...…

查看全部问答>

请教高手:单片机中断处理的问题

我在单片机中编程如下,SendKey_Protocl();是一个费时的操作,超过30ms,小于600ms,我得不到想要的结果,请问:--在中断处理服务程序中,如果费时的函数调用没有处理完是否在后台处理?还是被舍弃?。。。请问高手应该怎么处理? //TIMER0 ini ...…

查看全部问答>

关于eboot下flash的问题

最近在修改eboot,(ep9315的cpu)现在发现有个擦flash的问题,运行到 Continue to Erase the rest of Flash. *pFlash        = EA0003FF . ERROR: Error while erasing flash 就发生错误 不是硬件的问题,因为用自 ...…

查看全部问答>

请教个问题

请问哪里可以找到wind river的snmp v2或者v3的代码包 如果全的话 包里一共是多少个文件 谢谢大家了 …

查看全部问答>

MTK中如何调整HIGHTLIGHT的高度啊

MTK中如何调整HIGHTLIGHT的高度啊…

查看全部问答>

如何给430增加usb功能?

不是五系列的,想给1611做的一个系统增加usb功能,不知道应该选用什么样的usb控制芯片,做怎样的工作,需要增加多少代码,不知道1611的flash是不是够?希望高手指教…

查看全部问答>

宝工的东西好用吗?

本帖最后由 minjiang 于 2014-7-22 20:08 编辑 现在喜欢耍嘴皮子的人越来越多了,干活的人到少了。最近教育部好像在提 以后很多学校要改成技术类的学校,包括985类的高校。不过现在高校又有 多少老师能真正干活呢?在这里大家来讨论从事电子行 ...…

查看全部问答>

【瑞萨R7F0C80212】当年的入门

仿真器坏了,这是当时做的一个入门的小程序,可能不能入门各位法眼了。 小观一下吧。 安装方法的。。。。 点击安装,一般在win7上好用,在xp没有安装成功,可能更新的太少了。。。。。。。。 一下的步骤就不用再说了。。。。 ...…

查看全部问答>

求助,24V 5A的电源设计方案

  各位大神,求输出24V 5A的恒压电源,电压精度±5%,需要过流、过压、短路保护、保护功能需要MCU来实现。有没有大神提供下方案,不胜感激! …

查看全部问答>