📄 ds18b20.txt
字号:
#include <reg2051.h> //头文件
#include <intrins.h> //包含延时函数
sbit DQ=P3^7; //定义接口
sbit Key_Set=P3^2; //设定键和数码管十号位
sbit Key_Up=P3^3; //上调键和数码管十位
sbit Key_Down=P3^4; //下调键和数码管个位
sbit Key_Com=P3^5; //复合键盘公共端
sbit Out_1=P3^0;
sbit Out_2=P3^1;
/***********************以下声明函数*************************/
void delay(unsigned int time);
void delay_led(void);
void Init_DS18B20(void);
ReadOneByte(void);
WriteOneByte(unsigned char dat);
ReadTemperatrue(void);
void Reset_DS18B20(void);
void Read_Alarm(void);
void WriteAlarm(unsigned char a,unsigned char k);
void display(unsigned char k);
void display_set(bit a,unsigned char b);
void key(unsigned char k);
/***********************声明函数结束*************************/
unsigned char code led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x89,0xC7,0xBF}; //定义LED笔画
unsigned char AL=0; //定义下限报警变量(全局变量)
unsigned char AH=0; //定义上限报警变量(全局变量)
unsigned char se=0; //按键防抖
bit o=0;
void main(void) //主函数
{
unsigned char tmp,j;
P1=0xFF;
Key_Com=1;
for(j=0;j<10;j++) //自检
{
for(tmp=0;tmp<40;tmp++)
{
Key_Set=0;
P1=led[j];
delay_led();
Key_Set=1;
Key_Up=0;
P1=led[j];
delay_led();
Key_Up=1;
Key_Down=0;
P1=led[j];
delay_led();
Key_Down=1;
}
}
Reset_DS18B20(); //读出上限、下限温度值,并对DS18B20进行检测,如果是新器件则初始化新器件。
for(j=0;j<30;j++) //等待DS18B20进入正常状态
{
tmp=ReadTemperatrue();
}
while(1)
{
tmp=ReadTemperatrue();
for(j=0;j<125;j++)
{
Key_Com=1;
display(tmp);
key(tmp);
}
}
}
/*************************************************************
函数功能:延时子程序(用于DS18B20时序中延时)
入口参数:
出口参数:
*************************************************************/
void delay(unsigned int time)
{
unsigned int n;
n=0;
while(n<time)
{n++;}
}
/*************************************************************
函数功能:延时子程序(用于数码管扫描)
入口参数:
出口参数:
*************************************************************/
void delay_led(void)
{
int k;
for(k=0;k<600;k++);
}
/*************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
*************************************************************/
void display(unsigned char k)
{
if((o==1)||(k>=100))
{
if(o==1) //零下标志位,1为零下温度,百位显示-已表示零下温度。
{
Key_Set=0;
P1=led[12];
delay_led();
Key_Set=1;
}
if(k>=100) //温度值小于100时百位消隐
{
Key_Set=0;
P1=led[k/100];
delay_led();
Key_Set=1;
}
}
else delay_led(); //只做延时
if(k>=10)
{
Key_Up=0;
P1=led[k%100/10];
delay_led();
Key_Up=1;
}
else delay_led();
Key_Down=0;
P1=led[k%10];
delay_led();
Key_Down=1;
}
/*************************************************************
函数功能:数码管显示子程序(上下限设置)
入口参数:a,k
出口参数:
*************************************************************/
void display_set(bit a,unsigned char k)
{
if(a==0) //通过a来判断上下限
{
Key_Set=0;
P1=led[10];
delay_led();
Key_Set=1;
}
else
{
Key_Set=0;
P1=led[11];
delay_led();
Key_Set=1;
}
Key_Up=0;
P1=led[k/10];
delay_led();
Key_Up=1;
Key_Down=0;
P1=led[k%10];
delay_led();
Key_Down=1;
a=0;
}
/*************************************************************
函数功能:按键检测及上、下降报警输出
入口参数:
出口参数:
*************************************************************/
void key(unsigned char k)
{
unsigned char a=0,b=0,temp=0;
bit c=0;
P1=0xFF; //关闭显示
Key_Com=0; //公共端输出0
if(Key_Set==0)
{
se++;
if(se==30)
{
temp=AH;
while(a!=2)
{
Key_Com=1;
display_set(c,temp);
Key_Com=0;
if(Key_Up==0) //响应上调设置
{
b++;
if(b==25)
{
temp++; //上调
if(temp==100) //当值设到最大时,从0加起
{
temp=0;
}
b=0;
}
}
if(Key_Down==0) //响应下调设置
{
b++;
if(b==25)
{
temp--; //下调设置
if(temp==0)
{
temp=99; //当上限值高到最小时,从99减起
}
b=0;
}
}
if(Key_Set==0) //响应设置键
{
b++;
if(b==25)
{
switch(a)
{
case 0:
{
a++;
c=1;
AH=temp;
temp=AL;
b=0;
}
break;
case 1:
{
a++;
AL=temp;
b=0;
}
break;
}
}
}
} //while
se=0;
WriteAlarm(AH,AL);
} //if
} //if
if(k<150)
{
if(AH!=AL)
{
if(k>=AH)
{
Out_1=0;
}
else
{
Out_1=1;
}
if(k<=AL)
{
Out_2=0;
}
else
{
Out_2=1;
}
}
else
{
Out_1=1;
Out_2=1;
}
}
else
{
Out_1=1;
Out_1=1;
}
}
/*********************************以下DS18B20驱动程序*********************************/
/*************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
*************************************************************/
void Init_DS18B20(void)
{
DQ=1; //总线释放
_nop_(); //稍延时
_nop_();
DQ=0; //发送复位脉冲
delay(85); //延时(>480us)
DQ=1; //释放总线
delay(8); //等待(15~60us)DS18B20发送存在脉冲
while(DQ==1)
{
Key_Set=0;
P1=led[12];
delay_led();
Key_Set=1;
Key_Up=0;
P1=led[12];
delay_led();
Key_Up=1;
Key_Down=0;
P1=led[12];
delay_led();
Key_Down=1;
DQ=0;
delay(85);
DQ=1;
delay(8);
}
delay(35);
}
/*************************************************************
函数功能:向DS18B20读1字节数据
入口参数:
出口参数:dat
*************************************************************/
ReadOneByte(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*************************************************************
函数功能:向DS18B20写1字节数据
入口参数:dat
出口参数:
*************************************************************/
WriteOneByte(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
/*************************************************************
函数功能:读温度值
入口参数:
出口参数:temperature
*************************************************************/
ReadTemperatrue(void)
{
unsigned char tempL=0,tempH=0,temperature=0;
Init_DS18B20(); //初始化
WriteOneByte(0xCC); //跳过ROM操作
WriteOneByte(0x44); //温度转换
delay(25); //等待DS18B20转换温度
Init_DS18B20(); //初始化
WriteOneByte(0xCC); //跳过ROM操作
WriteOneByte(0xBE); //读暂存器中的温度值
tempL=ReadOneByte();
tempH=ReadOneByte();
o=0;
if(tempH>0xF0)
{
o=1;
tempL=~tempL;
tempH=~tempH;
tempL=tempL+1;
}
temperature=((tempH*256)+tempL)*0.0625;
return(temperature);
}
/*************************************************************
函数功能:新DS18B20重新设置
入口参数:
出口参数:
*************************************************************/
void Reset_DS18B20(void)
{
unsigned char temp=0;
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0xBE);
temp=ReadOneByte();
temp=ReadOneByte();
AH=ReadOneByte(); //读出上限值
AL=ReadOneByte(); //读出下限值
temp=ReadOneByte(); //读到配置字节
if(temp!=0x1F)
{
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x4E); //写暂存器
WriteOneByte(0x05);
WriteOneByte(0x05);
WriteOneByte(0x1F); //写入分辨率为0.5
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x48);
}
}
/*************************************************************
函数功能:向DS18B20写入上限下限值
入口参数:a,b
出口参数:
*************************************************************/
void WriteAlarm(unsigned char a,unsigned char b)
{
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x4E); //写暂存器
WriteOneByte(a); //写入TH
WriteOneByte(b); //写入TL
Init_DS18B20();
WriteOneByte(0xCC);
WriteOneByte(0x48);
}
/*********************************以上DS18B20驱动程序*********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -