for(j=0;j<200;j++)
{
_nop_();
_nop_();
}
}
/******************************************************************************/
/*****************显示扫描函数************************************************/
voidshow(uchar*p)
{uchari;
ucharseg[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x01};
for(i=0;i<4;i++)
{
if(i==1)TrZlg7289ad(0x90+i,(seg[p[i]])|0x80);
elseTrZlg7289ad(0x90+i,seg[p[i]]);
}
}
//-----------------DS18B20单总线模块----------------------------*/
staticvoidOneWire_Rst(void);
staticvoidOneWire_Init(void);
staticvoidOneWire_WriteByte(int8ucmd);
staticint8uOneWire_ReadByte(void);
staticvoidOneWire_Idle(void);
/*************************************************
子函数定义
*************************************************/
/*******************************************************************************
***函数名:
staticvoidOneWire_Init(void)
***功能描述:
***全局变量:
***输入:
NO!
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
单总线数据传输初始化;
/******************************************************************************/
staticvoidOneWire_Init(void)
{
DQ=1;
NOP();
DQ=0;//拉低数据线,准备ResetOneWireBus;
Delay_Xus(125);//延时510us,ResetOne-WireBus.
Delay_Xus(125);
DQ=1;//提升数据线;
Delay_Xus(15);//延时35us;
while(DQ)//等待Slave器件Ack信号;
{
NOP();
}
Delay_Xus(60);//延时125us;
DQ=1;//提升数据线,准备数据传输;
}
/*******************************************************************************
***函数名:
staticvoidOneWire_Rst(void)
***功能描述:
***全局变量:
No!
***输入:
NO!
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
单总线Resetpulse;
/******************************************************************************/
staticvoidOneWire_Rst(void)
{
DQ=0;//拉低数据线,准备ResetOneWireBus;
Delay_Xus(125);//延时511us,ResetOne-WireBus.
DQ=0;
Delay_Xus(125);
}
/***函数名:
staticvoidOneWire_WriteByte(int8ucmd)
***功能描述:
写一个字节;
***全局变量:
NO!
***输入:
cmd:
8bit;
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
staticvoidOneWire_WriteByte(int8ucmd)
{
int8ui;
for(i=0;i<8;i++)
{
if(cmd&0x01)//低位在前;
{
DQ=0;//结束Recoverytime;
NOP();
NOP();
NOP();
DQ=1;//发送数据;
}
else
{
DQ=0;//结束Rectime;
NOP();
NOP();
NOP();
//DQ=0;//发送数据;
}
Delay_Xus(30);//等待SlaveDevice采样;
DQ=1;//Recovery;
NOP();//RecoveryTimeStart;
cmd>>=1;
}
}
/*******************************************************************************
***函数名:
staticint8uOneWire_ReadByte(void)
***功能描述:
读取一个字节;
***全局变量:
NO!
***输入:
NO!
***输出:
8bitdata;
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
读之前必须首先写1;
/******************************************************************************/
staticint8uOneWire_ReadByte(void)
{
int8ui;
int8utmp=0;
DQ=1;//准备读;
NOP();
for(i=0;i<8;i++)
{
tmp>>=1;//低位先发;
DQ=0;//Readinit;
_nop_();//2ms;
DQ=1;//必须写1,否则读出来的将是不预期的数据;
Delay_Xus
(2);//延时9us;
_nop_();
if(DQ)//在12us处读取数据;
tmp|=0x80;
Delay_Xus(30);//延时55us;
DQ=1;//恢复OneWireBus;
NOP();
}
returntmp;
}
/*******************************************************************************
***函数名:
staticvoidOneWire_Idle(void)
***功能描述:
总线空闲模式;
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
/******************************************************************************/
staticvoidOneWire_Idle(void)
{
DQ=1;
NOP();
}
/*******************************************************************************
***函数名:
externvoidDS18B20_RomCmd(int8uromCmd)
***功能描述:
DS18B20Rom操作命令写;
***全局变量:
NO!
***输入:
romCmd;
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
0x33:
ReadRom;0x55:
MatchRom;0xcc:
Skiprom;0xf0:
Searchrom;
0xec:
AlarmSearch.
/******************************************************************************/
externvoidDS18B20_RomCmd(int8uromCmd)//仅写了SkipRom例程;
{
switch(romCmd)
{
case0xcc:
//SkipRomcommand;
OneWire_WriteByte(0xcc);
break;
default:
break;
}
}
/*******************************************************************************
***函数名:
externvoidDS18B20_MemCmd(int8umemCmd)
***功能描述:
DS18B20Memory操作命令;
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
仅写了ConvertT(0x44)和0xBE命令;
0x44:
ConvertT;0xbe:
ReadScratch-pad;
/******************************************************************************/
externvoidDS18B20_MemCmd(int8umemCmd)
{
switch(memCmd)
{
case0x44:
//StarttoConverttemperature;
OneWire_WriteByte(0x44);
NOP();
OneWire_Idle();
Delay_Xms(250);//延时750ms;
Delay_Xms(250);
Delay_Xms(250);
break;
case0xbe:
//Readscratchpad;
OneWire_WriteByte(0xbe);
break;
default:
break;
}
}
/*******************************************************************************
***函数名:
externvoidDS18B20_ReadDat(int8ulen,int8u*buf)
***功能描述:
读取DS18B20内部的Scratchpad内容;
***全局变量:
NO!
***输入:
len:
将要读取的数据长度;
***输出:
buf:
数据缓