ds18b20c语言程序,1T单片机的DS18B20源程序(c语言和汇编语言的都有)

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

温度传感器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);                //恢复延时

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值