文档介绍:1 / 6
数字温度计
韩哲
[摘要]本数字式温度计由AT89S1为控制器,通过DS18B20传感器检测并采集信号,把连续信号离散化,然后通过AT89S1处理DS1820采集到的离散信号,最后由单片机控制四位共阳极.
[关键词]AT;time<2;time++>
; //延时约6us,使主机在15us内采样
if<DQ==1>
dat|=0x80; //如果读到的数据是1,那么将1存入dat
else
dat|=0x00;//如果读到的数据是0,那么将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for<time=0;time<8;time++>
; //延时3us,两个读时序之间必须有大于1us的恢复期
}
return<dat>; //返回读出的十进制数据
}
/*****************************************************
函数功能:向DS18B20写入一个字节数据
***************************************************/
void WriteOneChar<unsigned char dat>
{
unsigned char i=0;
for <i=0; i<8; i++>
{
DQ =1; // 先将数据线拉高
_nop_<>; //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for<time=0;time<10;time++>
4 / 6
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
for<time=0;time<1;time++>
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1; //将dat中的各二进制位数据右移1位
}
for<time=0;time<4;time++>
; //稍作延时,给硬件一点反应时间
}
/*****************************************************
函数功能:做好读温度的准备
***************************************************/
void ReadyReadTemp<void>
{
Init_DS18B20<>; //将DS18B20初始化
WriteOneChar<0xCC>; // 跳过读序号列号的操作
WriteOneChar<0x44>; // 启动温度转换
for<t