新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ds18b20電冰箱控制系統

        ds18b20電冰箱控制系統

        作者: 時間:2016-12-01 來源:網絡 收藏

        /*******************************DS復位函數******************************/
        void ow_reset(void)
        {
        uchar presence=1;

        本文引用地址:http://www.104case.com/article/201612/324235.htm

        while(presence)
        {
        while(presence)
        {
        DQ=1; //DQ復位
        DQ=0; //單片機將DQ拉低
        delay(50); //延時550毫秒
        DQ=1; //拉高總線
        delay(6);
        presence=DQ; //如果=0則初始化成功 =1則初始化失敗
        }
        delay(45);
        presence=~DQ;
        }
        DQ=1;
        }
        /*****************************DS寫命令函數*********************************/
        void write_byte(uchar dat) //向1-WIRE總線上寫一字節
        {
        uchar i = 0 ;
        for (i = 8 ; i > 0 ; i--)
        {
        DQ = 0 ;
        DQ = dat&0x01 ;
        delay(7) ; //0時序延時至少60US
        DQ = 1 ;
        dat>>=1 ;
        }
        }
        /*******************************DS讀一字節函數****************************************************/
        uchar read_byte(void)
        {
        uchar i = 0 ;
        uchar dat = 0 ;

        for (i = 8 ; i > 0 ; i--)
        {
        DQ = 0 ; // 給脈沖信號
        dat >>= 1 ;
        DQ = 1 ; // 給脈沖信號

        if(DQ)
        dat |= 0x80 ;
        delay(7) ;
        }
        return (dat) ;
        }

        /******************************讀出溫度函數*************************************************/
        void read_temp(void)
        {
        ow_reset();
        write_byte(0xcc);//skip ROM
        write_byte(0x44);// 啟動溫度轉換

        ow_reset();
        write_byte(0xcc);
        write_byte(0xbe); //讀取溫度寄存器

        temp_data[0]=read_byte(); //溫度低8位
        temp_data[1]=read_byte(); //溫度高8位

        }


        /*****************第二個ds18b20處理函數******************/

        /******************************讀出溫度函數*************************************************/
        void read_temp2(void)
        {
        ow_reset2();
        write_byte2(0xcc);//skip ROM
        write_byte2(0x44);// 啟動溫度轉換

        ow_reset2();
        write_byte2(0xcc);
        write_byte2(0xbe); //讀取溫度寄存器

        temp_data[0]=read_byte2(); //溫度低8位
        temp_data[1]=read_byte2(); //溫度高8位

        }
        /********************************計算溫度子函數**********************************************/
        void temp_work2(void)
        {
        disp_buff[4]=10;

        if(temp_data[1]>127)
        {temp_data[1]=(255-temp_data[1]);temp_data[0]=(255-temp_data[0])+1;disp_buff[4]=11;} //負溫度求補碼
        tt2=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
        disp_buff[5]=tt2/10;
        disp_buff[6]=tt2%10;
        disp_buff[7]=0;

        if(!disp_buff[5])
        disp_buff[5]=10;

        }
        /**********eeprom函數******************/
        ////////延時//////////////////////////////////
        voidflash()
        { ; ; }
        void x24c02_init() //24c02初始化子程序
        {
        scl=1; //拉高
        flash(); //延時
        sda=1;
        flash();//同上
        }
        void start() //啟動I2C總線
        {
        sda=1;
        flash();
        scl=1;
        flash();
        sda=0;
        flash();
        scl=0;
        flash();
        }
        void stop() //停止I2C總線
        {
        sda=0;
        flash();
        scl=1;
        flash();
        sda=1;
        flash();
        }
        void writex(uchar j) //寫一個字節
        {
        uchar i,temp;
        temp=j;
        for (i=0;i<8;i++)
        {
        temp=temp<<1;
        scl=0;
        flash();
        sda=CY;
        flash();
        scl=1;
        flash();
        }

        scl=0;
        flash();
        sda=1;
        flash();
        }
        char readx() //讀一個字節
        {
        char i,j,k=0;
        scl=0;
        flash();
        sda=1;
        for (i=0;i<8;i++)
        {
        flash();
        scl=1;
        flash();
        if (sda==1) j=1;
        else j=0;
        k=(k<<1)|j;
        scl=0;
        }
        flash();
        return(k);
        }
        void clock() //I2C總線時鐘,在此作第個時鐘
        {

        scl=1;
        flash();
        while (sda==1);//如果SDA為0即收到應答則跳過,為1則等應答
        scl=0;
        flash();
        }

        ////////從24c02的地址address中讀取一個字節數據/////

        char x24c02_read(uchar address)
        {
        char i;
        start();
        writex(0xa0);
        clock();//第9個時鐘
        writex(address);//選中24C02
        clock();
        start();
        writex(0xa1); //選中24C02中的存儲器地址
        clock();
        i=readx();
        stop();
        delay(10);
        return(i);
        }

        void x24c02_write(char address,char info)
        {
        EA=0;
        start();
        writex(0xa0);
        clock();
        writex(address);
        clock();
        writex(info);
        clock();
        stop();
        EA=1;
        delay(50);
        }

        /*******************************主函數**********************************************************/
        void main (void)
        {
        char i,num1,num2;
        TMOD=0x11; //定時器0設置方式1,定時器1設置方式1
        TH0=0xf4; //定時3ms 為了計數值顯示的需要
        TL0=0x48;

        TH1=0xbf; //定時16.6ms 為了計數值顯示的需要
        TL1=0x28;

        EA=1; //開總中斷
        ET0=1; //定時器中斷使能
        ET1=1;
        TR0=1; //啟動定時器0
        TR1=1;

        P2=0x00;

        kmbj=0;
        motordc=0;

        hghlgt=0;
        setlclgt =0;
        syslgt=1;

        opndrspk=0;


        主程序略。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 渝北区| 屯昌县| 抚顺县| 十堰市| 保山市| 枞阳县| 民乐县| 鸡东县| 桂林市| 延长县| 屯留县| 莲花县| 堆龙德庆县| 增城市| 马关县| 米脂县| 保亭| 开鲁县| 云霄县| 望奎县| 清苑县| 博湖县| 永德县| 商水县| 娱乐| 油尖旺区| 平塘县| 湘潭市| 治多县| 寿光市| 金寨县| 历史| 丹巴县| 互助| 兴国县| 天门市| 尖扎县| 论坛| 永兴县| 彭山县| 迭部县|