新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于89S51的實時數字溫度計(DS1302 18B20)

        基于89S51的實時數字溫度計(DS1302 18B20)

        作者: 時間:2016-11-30 來源:網絡 收藏




        #include
        #include
        #include

        本文引用地址:http://www.104case.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) //寫保護
        #define Write_Enable RW_DS1302(0x8e,0x00) //允許寫入

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


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

        #define ReDetectTime 20 //設置重復檢測次次數,超出次數則超時

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

        #define Convert 0x44 //啟動溫度轉換
        #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復位端
        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};//定義變量秒分時
        uchar collect_temperature[2] = {0};
        uchar num[10] = {0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f};
        //七段數碼管顯示的段碼
        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)//數據初始化
        {
        P0=0xff;
        P1=0xff;
        P2=0xff;
        choose=0;
        flash=1;
        }

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

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

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

        /***********18B20復位函數**********/
        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繼續下一步
        }
        delayus(45); //延時500us
        presence = ~DS18B20;
        }
        DS18B20 = 1;
        }


        /**********18B20寫命令函數*********/
        //向 1-WIRE 總線上寫一個字節
        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個字節函數********/
        //從總線上讀取一個字節
        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);
        }
        //
        /***********讀出溫度函數**********/
        //
        void Ds18b20_ReadEE(void)
        {
        ow_reset();
        write_byte(SkipROM); // Skip ROM
        write_byte(Convert); // 發轉換命令
        ow_reset(); //總線復位
        write_byte(SkipROM); // 發Skip ROM命令
        write_byte(ReadScr); // 發讀命令
        collect_temperature[0]=read_byte(); //溫度低8位
        collect_temperature[1]=read_byte(); //溫度高8位
        }


        /********************************************************
        * *
        * DS1302時鐘芯片程序段 *
        * *
        ********************************************************/
        void DS1302_InputByte(uchar byte) //往DS1302寫入1Byte數據
        {
        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數據
        {
        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寄存器寫數據
        {
        C_RST;
        C_CLK;
        S_RST;
        DS1302_InputByte(reg);
        DS1302_InputByte(byte);
        S_CLK;
        C_RST;
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 鄂托克旗| 筠连县| 乌什县| 沾化县| 汕尾市| 溧水县| 科技| 象山县| 恩平市| 临沧市| 滨州市| 甘德县| 辽宁省| 内乡县| 安丘市| 兴仁县| 青神县| 房产| 临城县| 凉城县| 乌鲁木齐县| 兴业县| 桂阳县| 青田县| 黄骅市| 旺苍县| 乐安县| 那曲县| 滁州市| 西青区| 郧西县| 平安县| 泰宁县| 曲周县| 拉孜县| 丹东市| 犍为县| 锡林浩特市| 石楼县| 漳州市| 敦煌市|