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

DS18B20的51单片机驱动源代码

时间:2024-04-30 18:07:09

#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit duan=P0^0;
sbit wei=P0^1;
//#define DQ RC1
//#define DQ_HIGH() SC1=1
//#define DQ_LOW() TRISC1=0;DQ=0
//__CFIG(0x3B31);
sbit DQ=P1^3;
//const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
// 0x07,0x7f,0x6f};
//////////* 共阴极字形表*//////////
uchar code tableduan[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40,0x00};
//const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
// 0x87,0xff,0xef};
//////////* 共阴极数码管字形表*//////////
uchar code tableduan1[]={
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef,0x71,0x40,0x00};
//////数码管的位码表//////
uchar code tablewei[]={0xf7,0xef,0xdf,0xbf,0x7f};
uchar zhengfu;//判断是否正负
uint temper;
uchar a1,a2,a3,a4;
void delay(uint x);
//void delayus(uint,uchar);
void init();
void disp(uchar num1,uchar num2,uchar num3,uchar num4);
void display1(uchar duan1,uchar wei1);
void display(uchar duan1,uchar wei1);
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void delay20us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=7;a>0;a--);
}
void delay30us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=3;a>0;a--);
}
void delay45us(void) //误差 0us
{
unsigned char a;
for(a=21;a>0;a--);
}
void delay70us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=32;a>0;a--);
}
void delay750us(void) //误差 0us
{
unsigned char a,b;
for(b=83;b>0;b--)
for(a=3;a>0;a--);
}
void delay500us(void) //误差 0us
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
void delay2us(void) //误差 0us
{
}
void delay6us(void) //误差 0us
{
unsigned char a;
for(a=1;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
void delay4us(void) //误差 0us
{
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
void main()
{
init();
while(1)
{
/* delayus(0,0);//20
delayus(1,1);//30
delayus(2,2);//45
delayus(4,4);//70
delayus(70,30);//750
delayus(50,10);//500*/
// uchar num;
get_tem();
// for(num=20;num>0;num--)
// disp(a1,a2,a3,a4);
}
}
void reset()
{
uchar st=1;
// DQ_HIGH();
DQ=1;
// NOP();NOP();
delay2us();
while(st)
{
// DQ_LOW();
DQ=0;
// delayus(70,30);
delay750us();
// DQ_HIGH();
DQ=1;
// delayus(4,4);
delay70us();
if(DQ==1)
st=1;
else
st=0;
// delayus(50,10);
delay500us();
}
}
void write_byte(uchar date)
{
uchar i,temp;
// DQ_HIGH();
DQ=1;
// NOP();NOP();
delay2us();
for(i=8;i>0;i--)
{
temp=date&0x01;//01010101
// DQ_LOW();
DQ=0;
// delayus(0,0);
delay20us();
if(temp==1)
// DQ_HIGH();
DQ=1;
// delayus(2,2);
delay45us();
// DQ_HIGH();
DQ=1;
date=date>>1;//00101010
}
}
uchar read_byte()
{
uchar i,date;
static bit j;
for(i=8;i>0;i--)
{
date=date>>1;
//DQ_HIGH();
DQ=1;
// NOP();NOP();
delay2us();
// DQ_LOW();
DQ=0;
// NOP();NOP();NOP();NOP();NOP();NOP();
delay6us();
// DQ_HIGH();
DQ=1;
// NOP();NOP();NOP();NOP();
delay4us();
j=DQ;
if(j==1)
date=date|0x80;//1000 0000
// delayus(1,1);
delay30us();
}
return (date);
}
void get_tem()
{
uchar tem1,tem2,num;
float aaa;
reset(); //复位
write_byte(0xCC);//跳过ROM
write_byte(0x44);//温度转换
for(num=100;num>0;num--)
disp(a1,a2,a3,a4);
reset();
write_byte(0xCC);
write_byte(0xBE);
tem1=read_byte();
tem2=read_byte();
zhengfu=tem2&0xf8;
if(zhengfu!=0xf8)
{
aaa=(tem2*256+tem1)*6.25;
temper=(int)aaa;
}
else
{
aaa=(~(tem2*256+tem1)+1)*6.25;
temper=(int)aaa;
}
a1=temper/1000;
a2=temper%1000/100;
a3=temper%100/10;
a4=temper%10;
}
/*void delayus(uint x,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
*/
/*void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}*/
void delayms(uchar x) //误差 0us
{
uchar a,b,c;
for(c=x;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void init()
{
// TR=0;
// TRISA=0;
// PORTD=0;
// PORTA=0;
P0=P1=P2=0xff;
}
/*void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
PORTD=table[num1];//显示第一个数码管
PORTA=0x20;//0010 0000
delay(2);
PORTD=table1[num2];//显示第二个数码管
PORTA=0x10;//0001 0000
delay(2);
PORTD=table[num3];//显示第三个数码管
PORTA=0x08;//0000 1000
delay(2);
PORTD=table[num4];//显示第四个数码管
PORTA=0x04;//0000 0100
delay(2);
PORTD=table[num5];//显示第五个数码管
PORTA=0x02;//0000 0010
delay(2);
PORTD=table[num6];//显示第六个数码管
PORTA=0x01;//0000 0001
delay(2);*/
//*/
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
if(zhengfu!=0xf8)
{
if(num1==0)num1=11;
display(num1,1);
display1(num2,2);
display(num3,3);
display(num4,4);
}
else
{
if(num1==0)num1=11;
display(10,0);
display(num1,1);
display1(num2,2);
display(num3,3);
display(num4,4);
}
}
void display(uchar duan1,uchar wei1)
{
P2=0xff;
duan=0;
wei=0;
P2=tableduan[duan1];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[wei1];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}
void display1(uchar duan1,uchar wei1)
{
P2=0xff;
duan=0;
wei=0;
P2=tableduan1[duan1];
duan=1;
//delayms(1);
duan=0;
P2=tablewei[wei1];
wei=1;
//delayms(1);
wei=0;
delayms(1);
}


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

相关文章