<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機(jī) 8255 18b20 數(shù)碼管顯示溫度C程序

          51單片機(jī) 8255 18b20 數(shù)碼管顯示溫度C程序

          作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
          #include

          #include
          #include
          #define uint unsigned int
          #define uchar unsigned char
          #define PA 0x7cff //PA口
          #define PB 0x7dff //PB口
          #define con 0x7fff //控制字

          本文引用地址:http://www.ex-cimer.com/article/201611/321016.htm

          sbit A8=P2^0; //地址線A0
          sbit A9=P2^1; //地址線A1
          sbit cs=P2^7; //片選
          sbit wr=P3^6; //讀端口
          uint temp;
          uchar tplsb,tpmsb; // 溫度值低位、高位字節(jié)
          sbit date=P1^2; //數(shù)據(jù)通信線

          uchar code tableshi[]=
          {0x3f,0x06,0x5b,0x4f,0x66,
          0x6d,0x7d,0x07,0x7f,0x6f};
          //數(shù)碼管段選 十位

          uchar code tablege[]=
          {0xbf,0x86,0xdb,0xcf,0xe6,
          0xed,0xfd,0x87,0xff,0xef};
          //數(shù)碼管段選 個位 帶小數(shù)點(diǎn)

          //uchar code tablewei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
          //數(shù)碼管位選



          void delay(uchar i)
          {
          uchar j,k;
          for(j=i;j>0;j--)
          for(k=125;k>0;k--);
          }


          void init()
          {
          uint i;
          date=1;
          delay(1);

          date = 0;
          i = 100; //拉低約900us
          while (i>0) i--;

          date= 1; // 產(chǎn)生上升沿
          i = 4;
          while (i>0) i--;
          }


          void wait()
          {
          uint i;
          while(date);
          while(~date); // 檢測到應(yīng)答脈沖
          i = 4;
          while (i>0) i--;
          }


          bit readbit()
          {
          uint i;
          bit b;
          date = 0;
          i++;
          date = 1;
          i++;i++; // 延時15us以上,讀時隙下降沿后15us,DS18B20輸出數(shù)據(jù)才有效
          b = date;
          i = 8;
          while(i>0) i--;
          return (b);
          }


          uchar readbyte()
          {
          uchar i,j,b;
          b = 0;
          for (i=1;i<=8;i++)
          {
          j = readbit();
          b = (j<<7)|(b>>1);//讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個字節(jié)在DATE里
          }
          return(b);
          }


          void writebyte(uchar b)//
          {
          uint i;
          uchar j;
          bit btmp;
          for(j=1;j<=8;j++)
          {
          btmp = b&0x01;
          b = b>>1; // 取下一位(由低位向高位)
          if (btmp) // 寫1
          {

          date = 0;
          i++;i++; // 延時,使得15us以內(nèi)拉高
          date = 1;
          i = 8;
          while(i>0) i--; // 整個寫1時隙不低于60us
          }
          else // 寫0
          {

          date = 0;
          i = 8;
          while(i>0) i--; // 保持低在60us到120us之間
          date = 1;
          i++;
          i++;
          }
          }
          }


          void convert()
          {
          init(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
          wait(); // 等待DS18B20給出應(yīng)答脈沖
          delay(1); // 延時
          writebyte(0xcc); // 跳過rom 命令
          writebyte(0x44); // convert T 命令

          }


          uint readtemp()
          {
          float tt;
          init(); // 產(chǎn)生復(fù)位脈沖,初始化DS18B20
          wait(); // 等待DS18B20給出應(yīng)答脈沖
          delay(1); // 延時
          writebyte(0xcc); // 跳過rom命令
          writebyte(0xbe); // read scratchpad 讀暫存器命令
          tplsb=readbyte(); // 溫度值低位字節(jié)(其中低4位為二進(jìn)制的"小數(shù)"部分)
          tpmsb=readbyte(); // 溫度值高位字節(jié)(其中高5位為符號位)
          temp=tpmsb;
          temp<<=8; //合成一個字
          temp=temp|tplsb;
          tt=temp*0.0625;
          temp=tt*10+0.5;
          return temp;
          }


          void display(uint temp)
          {
          uchar A1,A2,A3;
          A1=temp/100;
          A2=temp%100/10;
          A3=temp%10;


          wr=1;
          XBYTE[PB]=0xdf; //選通第一位數(shù)碼管
          wr=0;
          delay(1);

          wr=1;
          XBYTE[PA]=tableshi[A1]; //顯示百位
          wr=0;
          delay(10);

          wr=1;
          XBYTE[PA]=0x00; //關(guān)掉顯示百位
          wr=0;

          wr=1;
          XBYTE[PB]=0xef; //選通第2位數(shù)碼管
          wr=0;
          delay(1);

          wr=1;
          XBYTE[PA]=tablege[A2];//顯示十位
          wr=0;
          delay(10);

          wr=1;
          XBYTE[PA]=0x00; //關(guān)掉顯示十位
          wr=0;

          wr=1;
          XBYTE[PB]=0xf7; //選通第3位數(shù)碼管
          wr=0;
          delay(1);

          wr=1;
          XBYTE[PA]=tableshi[A3]; //顯示個位
          wr=0;
          delay(10);

          wr=1;
          XBYTE[PA]=0x00; //關(guān)掉顯示個位
          wr=0;


          }

          void main()
          {

          wr=1;
          XBYTE[con]=0x80;//A組輸入B組輸出方式0
          wr=0;
          delay(1); // 延時1ms
          convert(); // 啟動溫度轉(zhuǎn)換,需要750ms
          delay(1000); // 延時1s
          while(1)
          {
          convert();
          display(readtemp());
          }

          }



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();