#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); //恢复延时 }}