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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3351|回復: 4
收起左側

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

[復制鏈接]
ID:285271 發表于 2018-3-4 19:34 來自手機 | 顯示全部樓層 |閱讀模式
想用51單片機加2位數碼管做一個0--24小時的倒計時插座,實現上電默認08小時倒計時,每過一小時數碼管顯示數字減1,直至倒計時完畢數碼管顯示––,單片機輸出電平關斷繼電器。通過短按按鍵實現+1調節需要定的0-24時間,通過長按實現快速調節。希望論壇大神給個程序思路不,勝感激。
回復

使用道具 舉報

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
                                }
                        }
                }
        }
}
無標題.jpg




評分

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

查看全部評分

回復

使用道具 舉報

ID:285271 發表于 2018-3-6 20:45 來自手機 | 顯示全部樓層
謝謝朋友無私分享。
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久久久三级 | 完全免费av在线 | 日本精品视频一区二区三区四区 | 国产中文视频 | 亚洲欧美在线视频 | 国产一区二区三区免费观看视频 | 欧美国产精品久久久 | 日本三级电影免费 | av资源网站| 日本h片在线观看 | 日韩久久网 | 免费高清av | 欧美极品一区二区 | 国产在线观看网站 | 国产一区二区成人 | 久久激情网 | 一区二区三区免费 | 北条麻妃99精品青青久久 | 日日av| 免费久 | 美女福利视频网站 | 国产精品免费看 | 久久久精选| 成人免费淫片aa视频免费 | av黄色在线 | 免费在线观看一区二区 | 亚洲精品视频一区 | 在线观看亚洲专区 | 国产一级精品毛片 | 欧美色图另类 | 欧美片网站免费 | 一区二区小视频 | 91婷婷韩国欧美一区二区 | 日日噜 | 91精品一区 | 亚洲精品一二三区 | 久久国内精品 | 午夜精品久久 | 中文字幕精 | 欧美精品一区二区在线观看 | 99国产精品久久久久老师 |