数字显示温度计 - 图文 下载本文

}

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