📄 b20.c
字号:
#include <reg52.h>
sbit P00=P0^0;
sbit P01=P0^1;
sbit SCL=P0^2;
sbit SDA=P0^3;
sbit DQ=P0^4; //DS18B20 DQ线
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
bit temp;
unsigned int a;
unsigned int tempL,tempH,temp_sign,temperature;
//初始化函数
void init()
{
P0=0xff;//读前先给置1
P1=0xff;
P00=0; //电机断电
P01=0;
P10=0; //关掉LED
}
//延时函数10ms
void mdelay(unsigned char DelayTime)
{
unsigned int n;
n=0;
while(n < DelayTime)
{
n++;
}
return;
}
/*----------------------
函数:DS18B20初始化子函数
----------------------*/
init_DS18B20()
{
unsigned char x=0;
DQ=1;
mdelay(8);
DQ=0;
mdelay(90);
DQ=1;
mdelay(5);
x=DQ;
while(x);
mdelay(15);
}
//read byte
unsigned int read_byte()
{
unsigned int i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;
dat>>=1;
DQ=1; //主机数据线从高到低,在拉高产生读信号
if(DQ)
{
dat|=0x80;
}
mdelay(5);
}
return(dat);
}
//write byte
write_byte(unsigned int dat)
{
unsigned int i=0;
for(i=0;i<8;i++)
{
DQ=0; //数据线从高到低,产生写始信号
DQ=dat&0x01;
mdelay(6);
DQ=1;
dat>>=1;
}
mdelay(5);
}
/*----------------------------------
函数功能: DS18B20 read temperature
----------------------------------*/
read_temperature()
{
init_DS18B20();
write_byte(0xcc);
write_byte(0x44);
mdelay(200);
while(!DQ);
init_DS18B20();
write_byte(0xcc);
write_byte(0xbe);
tempL=read_byte();
tempH=read_byte();
temp_sign=tempH&0xf8;
tempL>>=4;
tempH<<=4;
temperature=tempH|tempL;
if(temp_sign==0xf8)
{
temperature=(~temperature)+0x01;
}
mdelay(200);
return(temperature);
}
//16 conversion 10 (error)
unsigned int conversion(unsigned int a)
{
unsigned int dat;
switch(a)
{
case 0:dat = 0x00;break;
case 1:dat = 0x01;break;
case 2:dat = 0x02;break;
case 3:dat = 0x03;break;
case 4:dat = 0x04;break;
case 5:dat = 0x05;break;
case 6:dat = 0x06;break;
case 7:dat = 0x07;break;
case 8:dat = 0x08;break;
case 9:dat = 0x09;break;
case 0x0a: dat =0x10;break;
case 0x0b: dat =0x11;break;
case 0x0c: dat =0x12;break;
case 0x0d: dat =0x13;break;
case 0x0e: dat =0x14;break;
case 0x0f: dat =0x15;break;
}
return(dat);
}
//two 16 进制
unsigned int con(unsigned int dat)
{
unsigned int m,n;
n=conversion(dat&0x0f);
m=(dat>>4)&0x0f;
m=conversion(m);
m=m*16;
n=m+n;
return(n);
}
void main(void)
{
init();
a=read_temperature();
ACC=a;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -