久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機數碼管定時插座問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:285271 發表于 2018-3-4 19:34 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
想用51單片機加2位數碼管做一個0--24小時的倒計時插座,實現上電默認08小時倒計時,每過一小時數碼管顯示數字減1,直至倒計時完畢數碼管顯示––,單片機輸出電平關斷繼電器。通過短按按鍵實現+1調節需要定的0-24時間,通過長按實現快速調節。希望論壇大神給個程序思路不,勝感激。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:284230 發表于 2018-3-4 20:08 | 只看該作者
硬件部分
1 LED驅動電路
2 電源開關驅動電路
3 單片機最小系統
4 單片機電源系統。
5 按鍵電路
軟件部分
1 LED驅動電路
2 按鍵讀取與仿抖處理
3 記時功能
4 時間設定
5 開關驅動
6 低功耗處理
問題
1 系統低功耗問題
2 系統開關火線零線問題
3 系統中斷停電問題
回復

使用道具 舉報

板凳
ID:213173 發表于 2018-3-6 14:41 | 只看該作者
給你一個電路和程序,完全滿足你的要求,共陽數碼管,實際電路Q2、Q3要用PNP管才合理,位選a、b對調。圖中用NPN管只是為了仿真。#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define key_S 300                                                //宏定義短按(約20ms)
#define key_L 6000                                        //宏定義長按(約2/3s)
#define key_M 3000                                        //宏定義長按(約1/3s)
sbit K1 = P1^1;                                                //定時設置端口
sbit OUT= P1^0;                                                //輸出端口
sbit b=P3^1;                                                         //位選b端口
sbit a=P3^0;                                                         //位選a端口

uchar code table[]={                                        //共陽數碼管段碼0~f
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

uint Cnt2ms=0;                                                        //定義2ms秒變量
uchar hour=8,min=59,sec=59;                //定義時、分、秒變量
bit Twinkle;                                                        //閃爍標志
bit flag=0;                                                                //2ms數碼管動態顯示標志
bit Back=1;                                                                //倒計時標志
/***************************************
        定時器T0/T1初始化程序 @11.0592MHz
***************************************/
void Timer_Init()
{
        TMOD = 0x01;                                        //設置T0模式1,T1模式2
        TL0 = 0xCD;                                                //設置定時初值2ms
        TH0 = 0xF8;                                                //設置定時初值2ms
        TR0 = 1;                                                        //定時器0開始計時
        EA=1;                                                                //開總中斷
        ET0=1;                                                        //開定時器1中斷
}

/*************************
          按鍵掃描程序
*************************/
void key_scan()
{
        static uint count;//消抖計數變量                                               
        if(!K1)   
        {  
                count++;  
                if(count>=key_L)                        //長按快調
                {
                        hour++;
                        if(hour>=25)
                                hour=0;
                        count=key_M;
                }
        }  
        else                                                        //按鍵抬起
        {  
                if(count>key_S && count<key_L)//短按
                {
                        hour++;
                        if(hour>=25)
                                hour=0;
                }
                count=0;                                        //count清0
        }   
}
/********************************
                數碼管顯示程序
********************************/
void display()
{
        static uchar num=0;                                //分時顯示變量
        if(flag==1)
        {
                flag=0;
                switch(num)
                {
                        case 0:
                                P2=0xff;                                        //消隱
                                a=1;b=0;                                        //時十位位碼
                                if(Back==0)        P2=0xbf;        //顯示"-"
                                else        P2=table[hour/10];        //時十位段碼
                                num++;
                         break;       
               
                        case 1:
                                P2=0xff;                                        //消隱
                                a=0;b=1;                                        //時個位位碼
                                if(Back==0)        P2=0xbf;        //顯示"-"
                                else
                                {
                                        if(Twinkle==1)                //時點閃爍
                                                P2=table[hour%10]+0x80;//時個位段碼+點
                                        else
                                                P2=table[hour%10];
                                }
                                num=0;
                         break;       
                }       
        }
}
/********************************
                主程序
********************************/
void main(void)
{
        Timer_Init();                                        //初始化定時器
        OUT=1;                                                        //加電輸出
        while(1)
        {
                key_scan();                                        //按鍵掃描
                display();                                        //顯示
                if(hour==0)
                {
                        OUT=0;                                        //停止輸出
                        Back=0;                                        //倒計時標志清0
                }
                else
                {
                        OUT=1;                                        //輸出
                        Back=1;                                        //倒計時標志置1
                }               
        }
}
/*-----------------------------
  定時器0中斷服務程序  2m秒
------------------------------*/
void timer0() interrupt        1
{
        TL0 = 0xCD;                //設置定時初值2ms
        TH0 = 0xF8;                //設置定時初值2ms
        flag=1;
        if(Back==1)
        {
                Cnt2ms++;                                        //時間變量Cnt2ms自+1
                if(Cnt2ms<125)                                //閃爍頻率1Hz               
                        Twinkle=1;                                //閃爍標志
                else Twinkle=0;
                if(Cnt2ms>=500)                    //在此可以調整精度
                {
                        Cnt2ms=0;                                //變量Cnt2ms清0
                        sec--;                                        //秒自-1
                        if(sec>=60)                                //如果秒>=60
                        {
                                sec=59;                                //秒清0
                                min--;                                //分自-1
                                if(min>=60)                        //分>=60
                                {
                                        min=59;                        //分清0
                                        hour--;                  //小時自-1
                                        if(hour>=25)        //小時>=25
                                                hour=24;                //小時清0
                                }
                        }
                }
        }
}





評分

參與人數 1黑幣 +20 收起 理由
uaas + 20 贊一個!

查看全部評分

回復

使用道具 舉報

地板
ID:285271 發表于 2018-3-6 20:45 來自手機 | 只看該作者
謝謝朋友無私分享。
回復

使用道具 舉報

5#
ID:288478 發表于 2018-3-6 23:09 | 只看該作者
#define uint unsigned int
#define uchar unsigned char
#define key_S 300                                                //宏定義短按(約20ms)
#define key_L 6000                                        //宏定義長按(約2/3s)
#define key_M 3000                                        //宏定義長按(約1/3s)
sbit K1 = P1^1;                                                //定時設置端口
sbit OUT= P1^0;                                                //輸出端口
sbit b=P3^1;                                                         //位選b端口
sbit a=P3^0;                                                         //位選a端口

uchar code table[]={                                        //共陽數碼管段碼0~f
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

uint Cnt2ms=0;                                                        //定義2ms秒變量
uchar hour=8,min=59,sec=59;                //定義時、分、秒變量
bit Twinkle;                                                        //閃爍標志
bit flag=0;                                                                //2ms數碼管動態顯示標志
bit Back=1;                                                                //倒計時標志
/***************************************
        定時器T0/T1初始化程序 @11.0592MHz
***************************************/
void Timer_Init()
{
        TMOD = 0x01;                                        //設置T0模式1,T1模式2
        TL0 = 0xCD;                                                //設置定時初值2ms
        TH0 = 0xF8;                                                //設置定時初值2ms
        TR0 = 1;                                                        //定時器0開始計時
        EA=1;                                                                //開總中斷
        ET0=1;                                                        //開定時器1中斷
}

/*************************
          按鍵掃描程序
*************************/
void key_scan()
{
        static uint count;//消抖計數變量                                                
        if(!K1)   
        {  
                count++;  
                if(count>=key_L)                        //長按快調
                {
                        hour++;
                        if(hour>=25)
                                hour=0;
                        count=key_M;
                }
        }  
        else                                                        //按鍵抬起
        {  
                if(count>key_S && count<key_L)//短按
                {
                        hour++;
                        if(hour>=25)
                                hour=0;
                }
                count=0;                                        //count清0
        }   
}
/********************************
                數碼管顯示程序
********************************/
void display()
{
        static uchar num=0;                                //分時顯示變量
        if(flag==1)
        {
                flag=0;
                switch(num)
                {
                        case 0:
                                P2=0xff;                                        //消隱
                                a=1;b=0;                                        //時十位位碼
                                if(Back==0)        P2=0xbf;        //顯示"-"
                                else        P2=table[hour/10];        //時十位段碼
                                num++;
                         break;        
               
                        case 1:
                                P2=0xff;                                        //消隱
                                a=0;b=1;                                        //時個位位碼
                                if(Back==0)        P2=0xbf;        //顯示"-"
                                else
                                {
                                        if(Twinkle==1)                //時點閃爍
                                                P2=table[hour%10]+0x80;//時個位段碼+點
                                        else
                                                P2=table[hour%10];
                                }
                                num=0;
                         break;        
                }        
        }
}
/********************************
                主程序
********************************/
void main(void)
{
        Timer_Init();                                        //初始化定時器
        OUT=1;                                                        //加電輸出
        while(1)
        {
                key_scan();                                        //按鍵掃描
                display();                                        //顯示
                if(hour==0)
                {
                        OUT=0;                                        //停止輸出
                        Back=0;                                        //倒計時標志清0
                }
                else
                {
                        OUT=1;                                        //輸出
                        Back=1;                                        //倒計時標志置1
                }               
        }
}
/*-----------------------------
  定時器0中斷服務程序  2m秒
------------------------------*/
void timer0() interrupt        1
{
        TL0 = 0xCD;                //設置定時初值2ms
        TH0 = 0xF8;                //設置定時初值2ms
        flag=1;
        if(Back==1)
        {
                Cnt2ms++;                                        //時間變量Cnt2ms自+1
                if(Cnt2ms<125)                                //閃爍頻率1Hz               
                        Twinkle=1;                                //閃爍標志
                else Twinkle=0;
                if(Cnt2ms>=500)                    //在此可以調整精度
                {
                        Cnt2ms=0;                                //變量Cnt2ms清0
                        sec--;                                        //秒自-1
                        if(sec>=60)                                //如果秒>=60
                        {
                                sec=59;                                //秒清0
                                min--;                                //分自-1
                                if(min>=60)                        //分>=60
                                {
                                        min=59;                        //分清0
                                        hour--;                  //小時自-1
                                        if(hour>=25)        //小時>=25
                                                hour=24;                //小時清0
                                }
                        }
                }
        }
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品欧美一区二区三区 | 成人性生交大片 | 高清视频一区 | 中文字幕日韩欧美 | 亚洲精品专区 | av香港经典三级级 在线 | 精品国产一区二区在线 | 日韩中文字幕在线观看 | 国产1区 | 国产欧美精品区一区二区三区 | 国产成人免费视频网站高清观看视频 | 精品在线一区 | 特级毛片爽www免费版 | 成人国产精品久久久 | 欧美1区| 欧美精品一区二区三区在线 | 99视频在线播放 | 精品日韩在线 | 久久人体视频 | 免费成人在线网站 | 成人精品一区二区三区 | 国产精品久久久久一区二区三区 | 99精品一区二区三区 | 免费观看黄色一级片 | 国产91在线播放 | 亚洲精品久久嫩草网站秘色 | 欧美手机在线 | 视频一区二区在线观看 | 日韩精品av一区二区三区 | 成人日韩 | 精品无码三级在线观看视频 | 午夜激情视频 | 97caoporn国产免费人人 | 欧美日韩在线观看视频网站 | 久久久久久久久中文字幕 | 在线观看免费福利 | 中文字幕第十一页 | 欧美一级欧美三级在线观看 | 亚洲三区在线观看 | 韩国av一区二区 | 日韩精品在线视频 |