}
DQ18B20 = 1; return(0); }
//数据线拉高 //初始化失败返回0
else
{
_nNOP_(240); DQ18B20 = 1; return(1); }
//延时240us //数据线拉高
//初始化成功返回1
//================================================================== //函 数 名: Write18B20() //功能描述: 18B20写数据函数 //输入参数: Data //输出参数: 无 //设 计 者:
//创建日期:2012-03-03
//================================================================== void {
uchar data
i;
Write18B20(uchar
Data)
for (i=8; i>0; i--) {
DQ18B20 = 0;
DQ18B20 = Data&0x01; _nNOP_(10); DQ18B20 = 1; Data>>=1; } }
//================================================================== //函 数 名: Read18B20()
//功能描述: 读18B20两字节数据函数 //输入参数: 无 //输出参数: TempReg[] //设 计 者:
25
//创建日期:2012-03-03
//================================================================== uchar Read18B20(void) {
uchar data i=0; uchar data Data = 0; for (i=8;i>0;i--)
{
DQ18B20 = 0; Data>>=1; DQ18B20 = 1; if(DQ18B20) Data|=0x80; _nNOP_(10); }
//给脉冲信号
//给脉冲信号
return(Data); }
//================================================================== //函 数 名: GetTemp() //功能描述: 得到温度数据函数 //输入参数: 无 //输出参数: //设 计 者:
//创建日期:2012-03-03
//================================================================== void {
uchar data TempL,TempH; if(Init18B20()==0);
//初始化不成功则继续初始化 //发出跳过ROM指令 //发出温度转化命令 //延时800us
//初始化不成功则继续初始化 //发出跳过ROM指令 //发出读温度命令 //调用读程序,读出两字节
26
GetTemp(void)
Write18B20( SkipROM ); Write18B20( TempCvt ); _nNOP_(800);
if(Init18B20()==0);
Write18B20( SkipROM ); Write18B20( ReadTemp); TempL = Read18B20();
}
TempH = Read18B20(); TempReg = TempH; TempReg = TempReg<<8; TempReg = TempReg|TempL; if((TempReg&0x800)!=0x800)
NPflag = 0;
//正温度
else
{
TempReg = ~TempReg+1; NPflag = 1; }
//负温度
//================================================================== //函 数 名: DataCovt()
//功能描述: 将读出的温度数据拆分为整数和小数部分,并转为ASIC码 //输入参数: 无 //输出参数: //设 计 者:
//创建日期:2012-03-03
//================================================================== void {
uchar data Rwk1,Rwk2; uint data Rwk3; Rwk1 = (TempReg&0x07f0)>>4; Rwk2 = TempReg&0x000f;
// ssss,s|xxx,xxxx,|xxxx
// 符号位| 整数 | 小数 (整数部分-55--125,为
DataCovt(void)
//11位有效位
7位) }
27
IntgerH = Rwk1/100; IntgerM = Rwk10/10; IntgerL = Rwk1; Rwk3 = TempTab[Rwk2];
//整数部分
DecimalL = Rwk3&0x000f; //小数部分
DecimalML = (Rwk3&0x00f0)>>4; DecimalMH = (Rwk3&0x0f00)>>8; DecimalH = (Rwk3&0xf000)>>12;
//================================================================== //函 数 名: MnDS18B20() //功能描述: DS18B20驱动函数 //输入参数: 无 //输出参数: 无 //设 计 者:
//创建日期:2012-03-03
//================================================================== void { }
//================================================================== //文件名称: 数码管动态扫描
//功能说明: 4位数码管动态扫描,根据LedNum可配置为低于8位
//硬件描述: 段口P1,位口P0.0-P0.3,模拟声光报警的发光二极管占用P2.0,P2.1 //使用晶体: 11.0592M晶体 //创建日期: 2012。02.25 //软件版本: v 1.0
//================================================================== #include
#define uchar unsigned char #define uint unsigned int
//=====================常量=========================================
#define LedNum
4
//数码管个数6
//扫描时间,根据实际情况调整
Init18B20(); GetTemp(); DataCovt(); flag=1;
//采集值变换为BCD码
//初始化 //温度采集
MnDS18B20(void)
#define ScanTime 200
#define DataPort #define ComPort
P1 P0
//段口 //位口(4 bit)
//=====================变量========================================= sbit sbit
DotPort=P1^7; ring=P0^4;
28