中科因仑“3+1”工程特种兵精英论坛
标题:
018、STC12C5A60S2单片机之DS18B20温度传感器1T
[打印本页]
作者:
张衍波
时间:
2015-5-5 16:50
标题:
018、STC12C5A60S2单片机之DS18B20温度传感器1T
/********************************************************************
汇诚科技
实现功能:STC12C5A60S2单片机之DS18B20温度传感器1T
使用芯片:STC12C5A60S2
晶振:11.0592MHZ
波特率:115200
编译环境:Keil
作者:zhangxinchun
网站:
www.ourhc.cn
淘宝店:
汇诚科技
http://ourhc.taobao.com
郑兴电子直销部
http://shop68451856.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
*********************************************************************/
#include "REG52.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); //恢复延时
}
}
/********************************************************************
结束
*********************************************************************/
[attach]2696[/attach]
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/)
Powered by Discuz! X3.4