新聞中心

        EEPW首頁 > 消費電子 > 設計應用 > 基于單片機做電風扇簡易定時控制器

        基于單片機做電風扇簡易定時控制器

        作者: 時間:2017-06-08 來源:網絡 收藏

        自己的床頭風扇的機械定時器壞掉了,準備51給設計了一個.程序在實驗板初步調試通過,等待元件寄到就可以做板子了,只是有點浪費的資源。

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

        一,設計思路:

        開始通過手動鍵給供電。直到電源指示燈LED4亮.單片機運行,繼電器2工作給單片機供電。通過按鍵設置繼電器2的工作時間,實現系統的自動斷電,通過設置繼電器1的工作時間,實現風扇的間歇轉動,實現節能。

        1.顯示部分:通過按鍵,在風扇轉動時間,暫停時間,和系統關閉剩余時間切換顯示。數碼顯示兩位,為“分”走時,其中系統關閉剩余時間為“小時”走時,LED為紅,黃,藍,分別點亮對應的風扇轉動,暫停,和系統關閉剩余時間的狀態。

        2.按鍵部分:

        lK1為時間調整移位鍵,按下此鍵,數碼閃爍,同時對應的燈閃爍。在風扇轉動時間,暫停時間,和系統之間切換

        lK2為加一和狀態切換顯示鍵,當有K1按下,為時間加1。否則,在在風扇轉動時間,暫停時間,和系統之間切換顯示。

        lK3為減1和備用鍵,當有K1按下,為時間加1,否則無效。

        3.繼電器部分:

        l繼電器1控制風扇的電源線,實現風扇的轉動和暫時。

        l繼電器2控制單片機系統的電源,實現系統定時關閉。

        二,原理圖


        三,程序清單

        /*********************************************
        系統名稱:簡易
        創鍵人:w418781840日期:2008.7.6
        系統功能:
        **********************************************/
        /*********************************************
        函數名稱:聲明區
        功能描述:
        **********************************************/
        #include
        #defineucharunsignedchar
        #defineuintunsignedint
        #defineSEGP0//數碼管段選.
        #defineDIGP2//數碼管位選
        uchardis[2];//數碼驅動組
        ucharcodeTAB[]={0xC0,0xF9,0xA4,0xB0,0x99,//0-4共陽.
        0x92,0x82,0xF8,0x80,0x90,0xff};//5-9,熄滅符
        ucharstart,stop,close,sum,time;//各其本變量
        ucharfliflag,cflag,zflag,x,y;//各標志位
        uintcount_T0,count_T1,c_count;//計數變量
        sbitK1=P3^7;//功能移位鍵
        sbitK2=P3^2;//加一鍵和切換移位鍵.
        sbitK3=P3^3;//減一.
        sbitRLED=P2^2;//紅燈,表風扇轉動狀態.
        sbitYLED=P2^3;//黃燈,表風扇暫停狀態
        sbitBLED=P2^4;//藍燈,表系統狀態
        sbitCLED=P2^6;//風扇控制位
        sbitZLED=P2^7;//系統工作控制位
        /*********************************************
        函數名稱:延時1MS函數
        功能描述:顯示調用.
        **********************************************/
        voiddelay1ms(ucharx)
        {
        uchari,j;
        for(i=0;iX;I++)
        for(j=0;j120;j++);
        }

        /*********************************************
        函數名稱:顯示函數
        功能描述:顯示分走時,兩位顯示.
        **********************************************/
        voiddisplay(void)
        {
        uchari,scan=1;
        for(i=0;i2;i++)
        {SEG=0xff;
        DIG=~scan;
        SEG=TAB[dis[i]];
        delay1ms(5);
        scan=1;
        }
        }
        /*********************************************
        函數名稱:延時5MS函數
        功能描述:按鍵消抖調用.
        **********************************************/
        voiddelay5ms(ucharx)
        {
        ucharj;
        for(j=0;jX;J++)
        display();
        }

        /*********************************************
        函數名稱:初始化函數
        功能描述:各變量初始化.
        **********************************************/
        voidinit()
        {fliflag=0;//閃爍標志.
        cflag=1;//風扇狀態標志.
        zflag=0;//轉動標志.
        x=30;//暫存
        y=10;//暫存
        CLED=1;//系統工作.
        sum=0;//移位
        start=30;//風扇轉動時間
        stop=10;//暫停時間.
        close=5;//系統關閉剩余時間
        count_T0=0;//T0,T1相關
        count_T1=0;
        c_count=0;
        TMOD=0x11;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        ET0=1;
        ET1=1;
        TR0=1;
        }
        /*********************************************
        函數名稱:分離函數
        功能描述:分離顯示十位,個位
        **********************************************/
        voiddisnner(void)
        {if(cflag==1)//1
        {RLED=0;YLED=1;BLED=1;//紅燈閃爍.
        time=start;//顯示轉動時間.
        }
        if(cflag==2)
        {RLED=1;YLED=0;BLED=1;
        time=stop;
        }
        if(cflag==3)
        {RLED=1;YLED=1;BLED=0;
        time=close;
        }
        dis[0]=time/10;
        dis[1]=time%10;
        }
        /*********************************************
        函數名稱:T0中斷函數
        功能描述:產生1分鐘.
        **********************************************/
        voidtimer0(void)interrupt1
        {TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        if(++count_T0==1200)//一分鐘.
        {count_T0=0;
        if(zflag==0)//為0
        {ZLED=1;//則轉動.
        if(start!=99)//轉動時間為99,顯示99,不切換標志.一直轉動.
        {
        start--;//不,則倒計時.
        if(start==0)
        {zflag=1;//倒時時間到.切換標志.
        cflag=2;
        start=x;//重賦值
        }
        }
        }
        else
        {ZLED=0;//否則暫停.
        stop--;//倒計時計數.
        if(stop==0)
        {cflag=1;//時間到.
        zflag=0;
        stop=y;
        }
        }
        if(close!=99)//系統時間為99,顯示99,系統一直工作..
        {if(++c_count==60)//對一分計數60,即一小時后.
        {c_count=0;
        close--;//做一小時倒計時.
        if(close==0)//時間到,系統斷電.
        CLED=0;//低電平有效.
        }
        }
        }
        disnner();//分離.送顯示/
        }
        /*********************************************
        函數名稱:T1中斷服務函數
        功能描述:調整時間閃爍用.
        **********************************************/
        voidtimer1(void)interrupt3
        {
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        if(++count_T1==6)//閃爍周期30MS
        {
        count_T1=0;
        fliflag=~fliflag;//切換
        if(fliflag==0)//標志有效.
        {
        if(sum==1)cflag=1;//選用狀態閃爍.
        if(sum==2)cflag=2;
        if(sum==3)cflag=3;
        disnner();//閃爍用.
        dis[0]=10;//放熄滅符.
        dis[1]=10;
        }
        else//否則,正常顯示.
        {
        RLED=1;YLED=1;BLED=1;
        dis[0]=time/10;
        dis[1]=time%10;
        }
        }
        }
        /*********************************************
        函數名稱:鍵掃描函數
        功能描述:調整時間
        **********************************************/
        voidscanner(void)
        {if(K1==0)//為0,表有鍵按下.
        {
        delay5ms(100);//延時500MS.
        if(K1==0)//還按下.剛退出.
        {
        while(K1==0)display();//等待釋放.
        delay5ms(2);//消抖.
        cflag=1;//退出顯示狀態1.
        count_T0=0;
        TR0=1;//啟動T0
        TR1=0;//關閃爍
        sum=0;//歸位.
        x=start;//暫存.
        y=stop;//暫存.
        }
        else
        {//否則,有移位鍵按下.
        TR0=0;//時間走動停止.
        TR1=1;//開閃爍.
        sum++;//移位.
        if(sum==4)
        sum=1;
        }
        }

        if(K2==0)
        {
        delay5ms(2);
        if(K2==0)
        {
        while(K2==0)display();
        delay5ms(2);
        if(sum)//有移位
        {if(sum==1)
        {
        start++;
        if(start==61)
        start=99;
        if(start==100)
        start=30;
        }
        if(sum==2)
        {
        stop++;
        if(stop==61)
        stop=5;
        }
        if(sum==3)
        {
        close++;
        if(close==9)
        close=99;
        if(close==100)
        close=1;
        }
        }
        else//沒移位.
        {
        cflag++;//則進行顯示狀態移位.
        if(cflag==4)
        cflag=1;
        }
        }
        }
        if(K3==0)
        {
        delay5ms(2);
        if(K3==0)
        {
        while(K3==0)display();
        delay5ms(2);
        if(sum==1)
        {start--;
        if(start==29)
        start=99;
        if(start==98)
        start=60;
        }
        if(sum==2)
        {stop--;
        if(stop==4)
        stop=60;
        }
        if(sum==3)
        {close--;
        if(close==0)
        close=99;
        if(close==98)
        close=8;
        }
        }
        }
        }
        /*********************************************
        函數名稱:主函數
        功能描述:
        **********************************************/
        main()
        {
        init();
        while(1)
        {
        display();//顯示
        scanner();//檢測按鍵..
        }
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 镇赉县| 麦盖提县| 平和县| 前郭尔| 武胜县| 望奎县| 岑溪市| 台中市| 吴江市| 乳山市| 剑川县| 五大连池市| 武冈市| 延长县| 和平县| 乳山市| 宁化县| 华宁县| 广州市| 清丰县| 马鞍山市| 集贤县| 彰化市| 阿图什市| 固始县| 伊宁县| 樟树市| 诸暨市| 雅江县| 五原县| 高清| 南充市| 嘉鱼县| 阜阳市| 罗甸县| 交口县| 上蔡县| 桂阳县| 钟祥市| 合水县| 榆中县|