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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于89S51的實(shí)時(shí)數(shù)字溫度計(jì)(DS1302 18B20)

          基于89S51的實(shí)時(shí)數(shù)字溫度計(jì)(DS1302 18B20)

          作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏




          #include
          #include
          #include

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

          #define uchar unsigned char
          #define uint unsigned int
          #define S_RST DS_RST=1
          #define C_RST DS_RST=0
          #define S_CLK DS_CLK=1
          #define C_CLK DS_CLK=0
          #define Write_Disable RW_DS1302(0x8e,0x80) //寫保護(hù)
          #define Write_Enable RW_DS1302(0x8e,0x00) //允許寫入

          sbit SET = P1^5; //設(shè)置按鍵
          sbit ADD = P1^4; //調(diào)整加
          sbit DEC = P1^6; //調(diào)整減
          #define RdefineT1 TH1=0;TL1=0;TR1=0;a=0; //初始化超時(shí)檢測


          //#define Delay2us() _nop_();_nop_(); //延時(shí)2us,每nop 1us
          //#define Delay8us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();

          #define ReDetectTime 20 //設(shè)置重復(fù)檢測次次數(shù),超出次數(shù)則超時(shí)

          //ds18b20命令
          #define SkipROM 0xCC
          #define MatchROM 0x55
          #define ReadROM 0x33
          #define SearchROM 0xF0
          #define AlarmSearch 0xEC

          #define Convert 0x44 //啟動(dòng)溫度轉(zhuǎn)換
          #define WriteScr 0x4E
          #define ReadScr 0xBE
          #define CopyScr 0x48
          #define RecallEE 0xB8
          #define ReadPower 0xB4

          #define md collect_time[0]&0x0f
          #define mg (collect_time[0]&0x70)/16
          #define fd collect_time[1]&0x0f
          #define fg (collect_time[1]&0x70)/16
          #define sd collect_time[2]&0x0f
          #define sg (collect_time[2]&0x30)/16

          sbit DS_RST = P1^2; //DS復(fù)位端
          sbit DS_CLK = P1^0; //SCLK端
          sbit DS_IO = P1^1; //IO端
          sbit DS18B20 = P1^3; //溫度傳感器接口

          bit keyboard,flash,STA=1;
          uchar choose,a;
          uchar collect_time[3]={0x45,0x23,0x11};//定義變量秒分時(shí)
          uchar collect_temperature[2] = {0};
          uchar num[10] = {0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f};
          //七段數(shù)碼管顯示的段碼
          uchar display[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};


          void delay(uint i)
          {
          uint k;
          while(i--)
          {
          for(k=0;k<120;k++){;}
          }
          }


          void Dat_Int(void)//數(shù)據(jù)初始化
          {
          P0=0xff;
          P1=0xff;
          P2=0xff;
          choose=0;
          flash=1;
          }

          void Time01_Int(void)
          {
          TMOD = 0x12; //定時(shí)器0為8位自動(dòng)重載定時(shí)采樣,定時(shí)器1為16位超時(shí)檢測處理
          TCON = 0x00;
          TH0 = 0x60;
          TL0 = 0x60;
          TR0 = 1;

          IE = 0x0a; //允許定時(shí)器0、1中斷
          IP = 0x00;
          }

          /********************************************************
          * *
          * DS18B20溫度傳感器程序段 *
          * *
          ********************************************************/
          /***********11微秒延時(shí)函數(shù)**********/
          //
          void delayus(uint t)
          {
          for(;t>0;t--);
          }

          /***********18B20復(fù)位函數(shù)**********/
          void ow_reset(void)
          {
          char presence=1;
          while(presence)
          {
          while(presence)
          {
          DS18B20 = 1;_nop_();_nop_();
          DS18B20 = 0;
          delayus(50); // 550us
          DS18B20 = 1;
          delayus(6); // 66us
          presence=DS18B20; // presence=0繼續(xù)下一步
          }
          delayus(45); //延時(shí)500us
          presence = ~DS18B20;
          }
          DS18B20 = 1;
          }


          /**********18B20寫命令函數(shù)*********/
          //向 1-WIRE 總線上寫一個(gè)字節(jié)
          void write_byte(uchar val)
          {
          uchar i;
          for (i=8; i>0; i--) //
          {
          DS18B20 = 1;_nop_();_nop_();
          DS18B20 = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
          DS18B20 = val&0x01; //最低位移出
          delayus(6); //66us
          val=val/2; //右移一位
          }
          DS18B20 = 1;
          delayus(1);
          }
          //
          /*********18B20讀1個(gè)字節(jié)函數(shù)********/
          //從總線上讀取一個(gè)字節(jié)
          uchar read_byte(void)
          {
          uchar i;
          uchar value = 0;
          for (i=8;i>0;i--)
          {
          DS18B20 = 1;_nop_();_nop_();
          value>>=1;
          DS18B20 = 0; //
          _nop_();_nop_();_nop_();_nop_(); //4us
          DS18B20 = 1;_nop_();_nop_();_nop_();_nop_(); //4us
          if(DS18B20)value|=0x80;
          delayus(6); //66us
          }
          DS18B20 = 1;
          return(value);
          }
          //
          /***********讀出溫度函數(shù)**********/
          //
          void Ds18b20_ReadEE(void)
          {
          ow_reset();
          write_byte(SkipROM); // Skip ROM
          write_byte(Convert); // 發(fā)轉(zhuǎn)換命令
          ow_reset(); //總線復(fù)位
          write_byte(SkipROM); // 發(fā)Skip ROM命令
          write_byte(ReadScr); // 發(fā)讀命令
          collect_temperature[0]=read_byte(); //溫度低8位
          collect_temperature[1]=read_byte(); //溫度高8位
          }


          /********************************************************
          * *
          * DS1302時(shí)鐘芯片程序段 *
          * *
          ********************************************************/
          void DS1302_InputByte(uchar byte) //往DS1302寫入1Byte數(shù)據(jù)
          {
          uchar i;
          uchar temp;
          temp = byte;
          for(i=8; i>0; i--)
          {
          DS_IO = temp&0x01;
          S_CLK;
          C_CLK;
          temp = temp >> 1;
          }
          }


          uchar DS1302_OutputByte(void) //從DS1302讀取1Byte數(shù)據(jù)
          {
          uchar i;
          uchar temp=0;

          for(i=0; i<8;i++)
          {
          C_CLK;
          if(DS_IO!=0) temp|=(1< S_CLK;
          }
          return(temp);
          }

          void RW_DS1302(uchar reg, uchar byte)//向DS1302寄存器寫數(shù)據(jù)
          {
          C_RST;
          C_CLK;
          S_RST;
          DS1302_InputByte(reg);
          DS1302_InputByte(byte);
          S_CLK;
          C_RST;
          }


          上一頁 1 2 下一頁

          評(píng)論


          技術(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); })();