📄 ds18b20-.txt
字号:
void delay1ms(void)
{
uchar i,j;
for(i=0;i<2;i++)
for(j=0;j<255;j++);
}
/**************************************************
;系统初始化子程序
***************************************************/
void sys_init(void)
{
uchar i;
EA="0";
s1_flag=0;
for(i=0;i<6;i++)
dispbuf[i]=0;
TMOD="0X01";
TH0=0XD8;
TL0=0XF0;
CNT="0";
ET0=1;
TR0=1;
EA="1";
}
/***************************************************
;MAX7219初始化函数
****************************************************/
void init_7219(void)
{
uchar address,cmd;
address="0x0c";
cmd="0";
write7219(0x0c,0);
delay1ms();
delay1ms();
delay1ms();
address="0x0b";
cmd="0x07";
write7219(0x0b,0x07);
address="0x0a";
cmd="0x0d";
write7219(0x0a,0x0d);
address="0x09";
cmd="0xff";
write7219(0x09,0xff);
address="0x0c";
cmd="0x01";
write7219(0x0c,0x01);
}
/*****************************************************
;MAX7219写入函数
;参数:address寄存器地址,cmd为命令数据
*****************************************************/
void write7219(uchar address,uchar cmd)
{
uchar out,i;
LOAD7219=1;
out="address";
for(i=0;i<8;i++)
{
DIN7219=(bit)(out&0x80);
out="out"<<1;
_nop_();
_nop_();
_nop_();
CLK7219=0;
_nop_();
_nop_();
_nop_();
CLK7219=1;
}
out="cmd";
for(i=0;i<8;i++)
{
DIN7219=(bit)(out&0x80);
out="out"<<1;
_nop_();
_nop_();
_nop_();
CLK7219=0;
_nop_();
_nop_();
_nop_();
CLK7219=1;
}
LOAD7219=0;
_nop_();
_nop_();
_nop_();
_nop_();
LOAD7219=1;
}
/**************************************************
;显示函数
;入口:显示内容在disbuf中(BCD码形式)
***************************************************/
void display(void)
{
uchar i,st,add,dat;
st="MAX7219STA";
for(i=0;i<8;i++)
{
dat="dispbuf"[i];
if(i==6)dat=dat|0x08;
add="st";
write7219(add,dat);
st++;
}
}
/****************************************************
;定时器0溢出中断函数,每10ms中断
****************************************************/
void time0(void)interrupt 1 using 1
{
TH0=0XD8;
TL0=0XF0;
TH1=0;
TL1=0;
sta_flag=1;
CNT="1";
TR1=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CNT="0";
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
count++;
}
/*******************************************************************
;距离计算函数
*******************************************************************/
void computer(void)
{
float c;
uint t;
float tp;
if(temp<0x8000)
tp="temp"*0.0625;
else
tp="temp"*(-0.0625);
t="jsh"*256+jsl;
c="331".4+0.61*tp;
distance="c"*t*0.001/2;
}
/********************************************************************
;数据转换函数
将转换后的数据存入显示缓冲区以供显示
待转换的数据有:温度值,距离值,并送存相应的显示缓冲区
*********************************************************************/
void hex2bcd(void)
{
float tp;
unsigned long int tmp;
fuhao="0";
if(temp<0x8000)
tp="temp"*0.0625;
else
{
bm();
tp="temp"*0.0625;
fuhao="1";
}
tp="tp"*10000.0;
tmp="tp";
dispbuf[5]=tmp/100000;
dispbuf[5]=dispbuf[5]%10;
if(fuhao)dispbuf[5]=dispbuf[5]|0x80;
tmp=tmp%100000;
dispbuf[4]=tmp/10000;
tmp=distance;
dispbuf[3]=tmp/10000;
tmp=tmp%10000;
dispbuf[2]=tmp/1000;
tmp="tmp"%1000;
dispbuf[1]=tmp/100;
tmp=tmp%100;
dispbuf[0]=tmp/10;
}
/*************************************************************************
;ds18b20复位函数
读存在脉冲,无存在脉冲刚清标志
*************************************************************************/
void init_18b20(void)
{
WDIO="1";
_nop_();
WDIO=0;
delay15(36);
WDIO=1;
delay15(6);
if(WDIO==0)
flag2=1;
else
flag2=0;
delay15(18);
}
/*************************************************************************
字节写DS18b20函数
待写参数:wr
*************************************************************************/
void write_18b20(uchar wr)
{
uchar i;
for(i=0;i<8;i++)
{
WDIO="0";
delay15(1);
_nop_();
_nop_();
WDIO="wr"&0x01;
delay15(1);
WDIO="1";
wr>>=1;
}
}
/***********************************************************************
字读DS18b20函数
***********************************************************************/
uint read_word(void)
{
uchar i;
uint u;
for(i=0;i<16;i++)
{
WDIO="0";
u>>=1;
WDIO=1;
delay15(1);
if(WDIO==1)
u|=0x8000;
_nop_();
_nop_();
_nop_();
}
return(u);
}
/**********************************************************************
启动温度函数
注意:必须启动后750ms才能读温度
**********************************************************************/
uint wd(void)
{
init_18b20();
if(flag2)
{
write_18b20(0xcc);
write_18b20(0xbe);
return(read_word());
}
}
/**********************************************************************
延时15us函数
***********************************************************************/
void delay15(uchar us)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
us--;
}while(us);
}
/***********************************************************************
对读出的温度值temp求补码函数,得到原码
***********************************************************************/
void bm(void)
{
temp=~temp;
temp=temp+1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -