×
单片机 > 单片机程序设计 > 详情

DS18B20的51单片机驱动源代码

发布时间:2020-08-21 发布时间:
|
#include
#include
#define uchar unsigned char
#define uint  unsigned int
sbit duan=P0^0;
sbit wei=P0^1;
//#define DQ RC1
//#define DQ_HIGH() TRISC1=1
//#define DQ_LOW() TRISC1=0;DQ=0
//__CONFIG(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
 }
}[page]
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()
{
// TRISD=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);
}
关键字:DS18B20  51单片机  驱动源代码 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会