1、初始化时序:
首先,DSPORT保持低电平480到960微秒之间,然后将其拉高以产生复位脉冲,若产生复位脉冲,则表示初始化成功。
复位脉冲:产生60~240微秒的低电平后释放总线。
防止while语句产生死循环,设置当5毫秒后仍然没有产生低电平(复位脉冲)。则跳出while循环,初始化失败。
2、写时序:
若写0时序,则DSPORT一直是低电平
若写1时序,则DSPORT由低电平到高电平
因此可以看出应该用“与”逻辑。
综上,思路为先将DSPORT置为低电平,然后写入数据(采用与逻辑),而后需要释放总线(DSPORT为1)
3、读时序:
根据写时序,在写入时序之前,DSPORT先低后高,所以在读数据之前,也应将其置为先底后高。
读取数据之后,需要延时50微秒。
4、温度的读取过程:
复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始转换命令(0x44,具体见RAM指令表)
复位(初始化时序)——发出SKIP ROM(0xcc,具体见ROM指令表)——发出开始存储命令(0xbe,具体见RAM指令表)
连续读出两个字节的命令(即温度),先读低8位,后读高8位。
5、将温度转换成10进制数,用数码管显示出来
若温度为负数,则将其转换为补码,然后进行转换。
uint change_date(int temp)
{
float tp;
if(temp<0)
{
disp_num[0] = 0x40;//负数符号数码管的编码
temp = temp - 1;//转化为补码
temp = ~temp;
tp = temp;
temp = tp*0.0625*100+0.5;//温度扩大100倍,0.5则是提高精度,四舍五入法的应用
}
else
{
disp_num[0] = 0x00;
tp = temp;
temp = tp*0.0625*100+0.5;
}
return temp;
}
原代码:
uchar Init()
{
uchar i;
DSPORT = 0;
i= 70;
while(i--);
DSPORT = 1;
i = 0;
while(DSPORT)
{
i++;
delay1ms(1);
if(i>5)
return 0;
}
return 1;
}
void write_byte(uchar date)
{
uchar i,j;
for(i=0;i<8;i++)
{
DSPORT = 0;
j++;
DSPORT |= date&0x01;
j= 6;
while(j--);
DSPORT = 1;
date >>= 1;
}
}
uchar read_byte()
{
uchar i,j;
uchar bi,byte;
for(i=0;i<8;i++)
{
DSPORT = 0;//根据时序图先将总线拉低10微秒左右
j++; //时序图为最少1微妙,但单片机的一个指令周期最少为10微秒左右
DSPORT = 1;//释放总线
j++; //保持数据稳定
bi = DSPORT;
byte = (byte>>1)|(bi<<7);
j=4; //写入数据后,需要延时50微妙左右
while(j--);
}
return byte;
}
void ChangeTemp()
{
Init();
delay1ms(1);
write_byte(0xcc);//Skip ROM,该命令允许总线64位ROM编码,而直接访问存储空间,从而节约时间,适合用于单点系统
write_byte(0x44); //启动温度传感器
}
void ReadTemp_command()
{
Init();
delay1ms(1);
write_byte(0xcc);
write_byte(0xbe);//读取温度传感器中的温度
}
int ReadTempture()
{
uchar th,tl;
uint date;
ChangeTemp();
ReadTemp_command();
tl = read_byte();//选读低8位,后读高8位
th = read_byte();
date |= th;
date<<=8;
date = tl;
return date;
}