欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3725|回復: 7
打印 上一主題 下一主題
收起左側

51單片機無限時間循環設計思路?

  [復制鏈接]
跳轉到指定樓層
樓主
誰能幫我用51單片機設計,類似冰箱時控器的功能,無限循環時間啟動。就是開一段時間,關一段時間,無限循環。
開和關的時間可以調整,硬件部分包含3個數碼管,顯示時間以分鐘為單位。3個按鍵,按鍵1按一次調整開的時間,再按一次調整關的時間,再按一次顯示當前計時。按鍵2和3分別是加減。
一個輸出控制繼電器。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:475444 發表于 2019-2-10 11:00 | 只看該作者
自己上網上下代碼咯

評分

參與人數 3黑幣 +78 收起 理由
春風十里吹 + 8
shuisheng60 + 35
shuisheng + 35

查看全部評分

回復

使用道具 舉報

板凳
ID:284454 發表于 2019-2-10 12:27 | 只看該作者
設置兩個定時器,一個定時器開,一個關.用兩個IO口調用按鍵的參數,然后賦值給定時器的初始值.
兩個定時器之間要在對面的定時器開頭設置關閉另一個定時器,定時器結尾又設置打開另一個定時器.兩個定時器互鎖不同時運行.保證只能有一個定時器運行,另一個停止.就這樣無限循環下去.
回復

使用道具 舉報

地板
ID:475529 發表于 2019-2-10 14:21 | 只看該作者
放到while(1)里面
回復

使用道具 舉報

5#
ID:303383 發表于 2019-2-10 15:15 | 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

6#
ID:213173 發表于 2019-2-10 17:19 | 只看該作者
本帖最后由 wulin 于 2019-2-11 07:33 編輯



//給你寫一個1~999分鐘開關機無限循環程序,利用小數點區分顯示狀態
//在實際電路中數碼管要加限流電阻
//IO口可以按實際需要自行定義
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define key_S 20                                        //宏定義短按(20ms)
#define key_L 666                                        //宏定義長按(2/3s)
#define key_M 333                                        //宏定義長按步進(1/3s)

sbit K1 = P3^4;                                                //調整選擇/退出
sbit K2 = P3^5;                                                //短按+,長按連+
sbit K3 = P3^6;                                                //短按-,長按連-
sbit OUT= P2^2;                                                //輸出
sbit LED1= P2^3;                                                //輸出顯示
sbit LED2= P2^4;                                                //停止顯示
sbit wela1=P2^5;                                                //位選1
sbit wela2=P2^6;                                                //位選2
sbit wela3=P2^7;                                                //位選3

uchar code table[]={                                        //0~F數組
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uint Cnt1ms;                                                //定義1毫秒變量
uchar  Choice=0;                                        //設置狀態變量
uchar  min_ON,min_OFF;                                //倒計時變量
uchar  min_ON_1=3,min_OFF_1=2;                //倒計時設置變量
bit sign=1,flag=0;                                                //輸出狀態標志,1ms中斷標志

/**************************************
        定時器0/1初始化程序 @12.000MHz
**************************************/
void Timer0Init()        //1毫秒@12.000MHz
{
        TMOD= 0x01;                //設置定時器模式
        TL0 = 0x18;                //設置定時初值
        TH0 = 0xFC;                //設置定時初值
        TR0 = 1;                //定時器0開始計時
        EA=1;                        //開總中斷
        ET0=1;                        //開定時器0中斷
}
/*************************
          按鍵掃描程序
*************************/
void key_scan()
{
        static bit key1_sign;                        //按鍵自鎖標志
        static uint count1,count2,count3=0;//消抖計數變量                        

        if(!K1)                                                        //檢測按鍵1按下
        {
                count1++;                                        //消抖計數1自+1
                if((count1>=key_S)&&(key1_sign==0))//檢測消抖計數與按鍵1自鎖標志
                {                        
                        key1_sign=1;                        //按鍵1自鎖標志置1
                        Choice++;                                //調整選擇變量自+1
                        if(Choice>=3)                        //調整時間選擇0正常倒計時,1調開機時長,2調關機時長
                        {
                                Choice=0;                        //調整時間選擇清0
                                Cnt1ms=0;                        //時間變量Cnt200us自+1
                                min_ON=min_ON_1;        //傳遞設定開機時長
                                min_OFF=min_OFF_1;    //傳遞設定關機時長
                        }
                }
        }
        else
        {
                key1_sign=0;                                //按鍵1自鎖標志清0
                count1=0;                                        //消抖計數count1清0
        }
                                
        if(!K2)   
        {  
                count2++;  
                if(count2>=key_L)                        //長按快調
                {
                        if(Choice==1)                        //選擇變量1調min_ON_1+
                        {
                                if(min_ON_1<999)
                                        min_ON_1++;
                        }
                        if(Choice==2)                        //選擇變量2調min_OFF_1+
                        {
                                if(min_OFF_1<999)
                                        min_OFF_1++;
                        }
                        count2=key_M;
                }
        }  
        else                                                        //按鍵抬起
        {  
                if(count2>key_S && count2<key_L)//短按
                {
                        if(Choice==1)                        //選擇變量1調min_ON_1+
                        {
                                if(min_ON_1<999)
                                        min_ON_1++;
                        }
                        if(Choice==2)                        //選擇變量2調min_OFF_1+
                        {
                                if(min_OFF_1<999)
                                        min_OFF_1++;
                        }
                }
                count2=0;                                        //count2清0
        }   
        if(!K3)   
        {  
                count3++;  
                if(count3>=key_L)                        //長按
                {
                        if(Choice==1)                        //選擇變量1調min_ON_1+
                        {
                                if(min_ON_1>2)
                                        min_ON_1--;
                        }
                        if(Choice==2)                        //選擇變量2調min_OFF_1+
                        {
                                if(min_OFF_1>2)
                                        min_OFF_1--;
                        }
                        count3=key_M;
                }
        }  
        else                                                        //按鍵抬起
        {  
                if(count3>key_S && count3<key_L)//短按
                {
                        if(Choice==1)                        //選擇變量1調min_ON_1+
                        {
                                if(min_ON_1>2)
                                        min_ON_1--;
                        }
                        if(Choice==2)                        //選擇變量2調min_OFF_1+
                        {
                                if(min_OFF_1>2)
                                        min_OFF_1--;
                        }
                        count3=key_M;
                }
                count3=0;                                        //count3清0
        }   
}
/********************************
                數碼管顯示程序
********************************/
void display()
{
        static uchar num=0;
        if((Choice==0)&&(sign==1))//顯示開機倒計時
        {
                P0=0x00;        //消隱
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_ON / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_ON / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_ON % 10]|0x80;num=0;break;
                }
        }
        if((Choice==0)&&(sign==0))//顯示關機倒計時
        {
                P0=0x00;        //消隱
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_OFF / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_OFF / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_OFF % 10]|0x80;num=0;break;
                }
        }
        if(Choice==1)//顯示設置開機倒計時
        {
                P0=0x00;        //消隱
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_ON_1 / 100%10]|0x80;num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_ON_1 / 10%10];num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_ON_1 % 10];num=0;break;
                }
        }
        if(Choice==2)//顯示設置關機倒計時
        {
                P0=0x00;        //消隱
                switch(num)
                {
                        case 0:wela1=0;wela2=1;wela3=1;P0=table[min_OFF_1 / 100%10];num++;break;
                        case 1:wela1=1;wela2=0;wela3=1;P0=table[min_OFF_1 / 10%10]|0x80;num++;break;
                        case 2:wela1=1;wela2=1;wela3=0;P0=table[min_OFF_1 % 10];num=0;break;
                }
        }
}

/********************************
                主程序
********************************/
void main(void)
{
        Timer0Init();                                        //初始化定時器
        min_ON=min_ON_1;                                //開機倒計時賦初值
        min_OFF=min_OFF_1;                        //關機倒計時賦初值
        while(1)
        {
                if(min_ON>0)
                {
                        LED1=0;
                        LED2=1;
                        OUT=0;
                }
                else
                {
                        LED1=1;
                        LED2=0;
                        OUT=1;
                }
                if(flag==1)
                {
                        flag=0;
                        if(Choice==0)                //非設置狀態允許計時
                        {
                                Cnt1ms++;                        //時間變量Cnt1ms自+1
                                if(Cnt1ms>=60000)        //分鐘
                                {
                                        Cnt1ms=0;
                                        if(sign)
                                        {
                                                min_ON--;
                                                if(min_ON==0)
                                                {
                                                        sign=0;
                                                        min_OFF=min_OFF_1;
                                                }
                                        }
                                        else
                                        {
                                                min_OFF--;
                                                if(min_OFF==0)
                                                {
                                                        sign=1;
                                                        min_ON=min_ON_1;
                                                }
                                        }
                                }
                        }
                        key_scan();
                        display();
                }
        }
}
/*-----------------------------
  定時器0中斷服務程序  1ms
------------------------------*/
void timer0() interrupt        1
{
        TL0 = 0x18;                        //設置定時初值
        TH0 = 0xFC;                        //設置定時初值
        flag=1;
}

回復

使用道具 舉報

7#
ID:321301 發表于 2019-2-11 11:43 | 只看該作者
加入代碼while(1)
回復

使用道具 舉報

8#
ID:388065 發表于 2019-2-16 16:55 | 只看該作者
wulin 發表于 2019-2-10 17:19
//給你寫一個1~999分鐘開關機無限循環程序,利用小數點區分顯示狀態
//在實際電路中數碼管要加限流電 ...

感謝,程序沒有錯誤,非常好
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表