<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        DS18B20的51單片機驅動源代碼

        作者:蕭文   來源:本站原創   點擊數:  更新時間:2014年04月01日   【字體:

        #include<reg52.h>
        #include<intrins.h>
        #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
         }
        }
        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);
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮