ds18b20 单片机测温 干扰疑惑 谢谢

全部回答2
默认 最新
  • #include "reg51.h"#include "intrins.h" typedef unsigned char byte; sbit dq = p3^3;    //ds18b20的数据口位p3.3byte 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);    //恢复延时    }}
    0 点赞
  • 1、18b20的引线用频蔽线,外皮接地。2、利用定时器,定时复位
    0 点赞

没有更多内容了

返回顶部
产品求购 求购