STC12C5A60S2控制温度传感器DS18B20 c程序
STC12C5A60S2控制温度传感器DS18B20 c程序工作频率:12.000MHz
#include"REG51.H"
#include"INTRINS.H" typedefunsignedcharBYTE; sbitDQ=P3^3;//DS18B20的数据口位P3.3
BYTETPH;//存放温度值的高字节
BYTETPL;//存放温度值的低字节 voidDelayXus(BYTEn);
voidDS18B20_Reset();
voidDS18B20_WriteByte(BYTEdat);
BYTEDS18B20_ReadByte(); voidmain()
{
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不同
**************************************/
voidDelayXus(BYTEn)
{
while(n--)
{
_nop_();
_nop_();
}
} /**************************************
复位DS18B20,并检测设备是否存在
**************************************/
voidDS18B20_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字节数据
**************************************/
BYTEDS18B20_ReadByte()
{
BYTEi;
BYTEdat=0; for(i=0;i8;i++)//8位计数器
{
dat>>=1;
DQ=0;//开始时间片
DelayXus(1);//延时等待
DQ=1;//准备接收
DelayXus(1);//接收延时
if(DQ)dat|=0x80;//读取数据
DelayXus(60);//等待时间片结束
} returndat;
} /**************************************
向DS18B20写1字节数据
**************************************/
voidDS18B20_WriteByte(BYTEdat)
{
chari; for(i=0;i8;i++)//8位计数器
{
DQ=0;//开始时间片
DelayXus(1);//延时等待
dat>>=1;//送出数据
DQ=CY;
DelayXus(60);//等待时间片结束
DQ=1;//恢复数据线
DelayXus(1);//恢复延时
}
}
传感器相关文章:传感器工作原理
风速传感器相关文章:风速传感器原理 尘埃粒子计数器相关文章:尘埃粒子计数器原理
评论