新聞中心

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

        ds18b20電冰箱控制系統

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

        # include "reg52.h"
        # include "math.h"
        #include

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

        # define uchar unsigned char
        # define uint unsigned int

        //寫eeprom存儲中
        sbit scl=P1^1;
        sbit sda=P1^2;

        sbit DQ = P3^0; //溫度輸入口
        sbit DQ2 = P3^1; //溫度輸入口

        sbit kmbj=P1^4; //開門報警燈入口
        sbit motordc=P3^5; //直流電機入口
        sbit hghlgt=P3^6; //溫度高于設定值入口
        sbit motorout=P3^7;

        sbit setlclgt=P3^2; //設置提示燈入口
        sbit setldlgt=P1^6; //設置提示燈入口
        sbit addlgt=P3^3; //溫度加燈入口
        sbit sublgt=P3^4; //溫度減燈入口
        sbit syslgt=P1^7; //系統工作提示燈

        sbit setbtn=P1^0; //設置按鍵入口
        sbit addbtn=P1^1; //溫度加按鍵入口
        sbit subbtn=P1^2; //溫度減按鍵入口

        sbit opndr=P1^3; //開門開關
        sbit opndrspk=P1^5; //18度報警

        uchar data temp_data[2]={0x00, 0x00,}; //讀出溫度暫存
        uchar temp_buff[3]={0x00,0x00,0x00};
        uchar disp_buff[8]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a}; //顯示緩沖單元
        uint tt=0,tt2=0,tm=0,cjtm=0,flag_cj=0,open=0,ccount=0;

        char lcsetvalue=0,ldsetvalue=0;

        uchar code TABLE[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; //共陽極0-9的代碼
        uchar code codeseat[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

        uchar flag_set=1,flag_temp=1,flag_opendr=0,flag_kmbj=0,flag_hbj=0;

        void delay(uint j)
        {
        uint i;
        for(i=0;i<=j;i++);
        }

        /*****************溫度設定函數*************************/
        void temp_set(void)
        {
        syslgt=1;
        while(flag_set) //設定冷藏室溫度和冷凍室溫度
        {
        if(flag_temp)
        {
        setbtn=1;
        if(!setbtn)
        { while(!setbtn)
        { setbtn=1;setlclgt=0; }//等待鍵的釋放
        flag_temp++;
        if(flag_temp==2)
        { setlclgt=0;setldlgt=1;}
        if(flag_temp==3)
        {setlclgt=1;addlgt=1;sublgt=1;setldlgt=0;}
        if(flag_temp==4)
        {flag_temp=1;setlclgt=1;setldlgt=1;addlgt=1;sublgt=1;syslgt=0;flag_set=0;}

        tm=0;
        disp_buff[0]=10; disp_buff[1]=10;
        disp_buff[2]=10; disp_buff[3]=10;
        }
        }
        if(flag_temp==2) //開始冷藏室溫度加或者減
        {
        addbtn=1;
        if(!addbtn)
        { while(!addbtn)
        { addbtn=1;addlgt=0;sublgt=1;}//等待鍵的釋放
        lcsetvalue++;
        if(lcsetvalue>=60)
        lcsetvalue=60;
        if(lcsetvalue<0)
        disp_buff[0]=11;
        else
        disp_buff[0]=10;

        disp_buff[1]=abs(lcsetvalue)/10;
        disp_buff[2]=abs(lcsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
        }
        subbtn=1;
        if(!subbtn)
        { while(!subbtn)
        { subbtn=1;sublgt=0;addlgt=1;}//等待鍵的釋放
        lcsetvalue--;
        if(lcsetvalue<0)
        disp_buff[0]=11;
        else
        disp_buff[0]=10;

        disp_buff[1]=abs(lcsetvalue)/10;
        disp_buff[2]=abs(lcsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
        }
        }
        if(flag_temp==3) //開始冷凍室溫度加或者減
        {
        addbtn=1;
        if(!addbtn)
        { while(!addbtn)
        { addbtn=1;addlgt=0;sublgt=1;}//等待鍵的釋放
        ldsetvalue++;
        if(ldsetvalue>=60)
        ldsetvalue=60;
        if(ldsetvalue<0)
        disp_buff[0]=11;
        else
        disp_buff[0]=10;

        disp_buff[1]=abs(ldsetvalue)/10;
        disp_buff[2]=abs(ldsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
        }
        subbtn=1;
        if(!subbtn)
        { while(!subbtn)
        { subbtn=1;sublgt=0;addlgt=1;}//等待鍵的釋放
        ldsetvalue--;
        if(ldsetvalue<0)
        disp_buff[0]=11;
        else
        disp_buff[0]=10;

        disp_buff[1]=abs(ldsetvalue)/10;
        disp_buff[2]=abs(ldsetvalue)%10;
        disp_buff[3]=0;
        if(!disp_buff[1]) {disp_buff[1]=10;}
        }
        }
        }
        }


        /********************************計算溫度子函數**********************************************/
        void temp_work(void)
        {
        disp_buff[0]=10;

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

        disp_buff[1]=tt/10;
        disp_buff[2]=tt%10;
        disp_buff[3]=0;

        if(!disp_buff[1])
        disp_buff[1]=10;
        }

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

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

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

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


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永年县| 大渡口区| 唐河县| 格尔木市| 林周县| 聂荣县| 阳信县| 资中县| 崇仁县| 遂宁市| 织金县| 无棣县| 陆河县| 深水埗区| 大同市| 海淀区| 嘉荫县| 嘉义县| 柞水县| 油尖旺区| 翁源县| 洪洞县| 昭觉县| 金门县| 定兴县| 大渡口区| 内黄县| 大名县| 青浦区| 宝兴县| 泗阳县| 阳朔县| 安国市| 英山县| 新龙县| 汶川县| 中西区| 闻喜县| 姜堰市| 阿拉善左旗| 那坡县|