锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

DS18B20延时函数版

时间:2024-05-18 19:07:10

程序运行效果图:


//晶振12MHZ 常温下测量0--99.9度

#include
#include
#define uchar unsigned char
#define uint unsigned int
sfr wdtrst=0xa6;
uchar code seg7[]={0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60}; //整数
sbit dec=P0^5;//数码管小数位
sbit Dq=P3^4; //DS18B20读写口
sbit alarm=P3^3; //喇叭报警位
uint warning=0;//报警温度变量
//-------------------
void rst() //看门狗系统复位函数晶振是12MHZ则看门狗自动复位时间为16ms
{
wdtrst=0x1e;
wdtrst=0xe1;
}
//----------------------------
void alarmstart()interrupt 3 //报警中断子函数
{
if(warning>270)//温度大于27度喇叭报警
{alarm=~alarm;}
TH1=0xff;
=0x60;
TF1=0;
EA=1;
ET1=1;
}

//-----------------------------延时函数集---------------------
void delay10us() //延时10us
{
_nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_();
}
//----------
void delay610us() //延时610us
{
uchar i,j;
for(i=0;i<2;i++)
for(j=0;j<100;j++);
}

//----------
void delay34us() //延时34us
{
uchar i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++);
}
//----------
void delay(uint k) //常用延时函数
{
uchar i,j;
for(i=0;i for(j=0;j<100;j++);
}

//-----------------DS18B20初始化函数----------
uchar init18b20()
{
uint k=0;
Dq=0;
delay610us(); //延时610us
Dq=1; //释放总线
delay10us(); //延时10us
while(Dq==1) //18b20应答信号判断是否超时
{
if(k<800)k++;
else return 1;
}
k=0;
while(Dq==0) //18b20是否释放判断
{
if(k<800)k++;
else return 2;
}
return 3; //启动成功返回 3
}

//---------读1字节函数------------
uchar readbyte()
{
uchar i,byte=0;
for(i=0;i<8;i++)
{
Dq=0;
byte>>=1;
Dq=1;
if(Dq)
{
byte=byte|0x80;
}
delay34us();
}
return byte;
}

//-----------写1字节函数--------
void writebyte(uchar byt)
{
uchar i;
for(i=0;i<8;i++)
{
Dq=0;
Dq=byt&0x01;
delay34us();
Dq=1;
byt>>=1;
}
}

//---------温度读取函数--------
uint readtemp()
{
uint temp=0;
uchar TH,TL;
if(init18b20()!=3)return 1;//启动失败返回值1
writebyte(0xcc);
writebyte(0x44);
;;
if(init18b20()!=3)return 1; //启动失败返回值1
writebyte(0xcc);
writebyte(0xbe);
TL=readbyte();
TH=readbyte();
temp=TH;
temp<<=8;
temp=temp+TL;
temp=temp*0.0625*10; //乘以10取出小数部分
return temp;
}


//------------主函数----------

void main()
{
uint num=0;
TMOD=0x50;
TH1=0xff;
TL1=0x60;
EA=1;
ET1=1;
TR1=1;
rst(); //看门狗
while(1)
{
start:num=readtemp();
if(num==1) //启动失败数码管最高位设置为1
{
warning=1; //启动失败报警变量设置为 1
P0=seg7[1];
P2=0xfe;
delay(40);
goto start; //启动失败重新启动判断,直到成功才显示温度数值,然后启动判断失败1消失。
}
rst();//看门狗
warning=num;
P0=seg7[num/100];
P2=0xdf;
delay(10);
P0=seg7[num%100/10];
dec=0;
P2=0xbf;
delay(10);
P0=seg7[num%100%10];
dec=1;
P2=0x7f;
delay(10);
}
}


-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章