找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4443|回復(fù): 4
收起左側(cè)

數(shù)碼管電子鐘不能調(diào)時(shí),咋整!

[復(fù)制鏈接]
ID:221185 發(fā)表于 2017-7-20 20:54 | 顯示全部樓層 |閱讀模式
程序如下:

#include <STC12C2052AD.H> //STC頭文件

/**********************************************************************************************/
//“程序開發(fā)調(diào)試設(shè)置項(xiàng)”
#define DY_LI            9     //設(shè)置LED顯示的亮度(值域:1~9)
#define DY_DELAY        12     //設(shè)置每一個(gè)點(diǎn)顯示的時(shí)間長度(1~20)
/**********************************************************************************************/
sbit    DY_KEY = P3 ^ 7; //按鍵1

sbit    DY_LED1_L1    =P3 ^ 0; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_L2    =P3 ^ 1; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_L3    =P3 ^ 2; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_L4    =P3 ^ 3; //設(shè)置LED點(diǎn)陣屏連接的I/O口

sbit    DY_LED1_H1    =P1 ^ 0; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H2    =P1 ^ 1; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H3    =P1 ^ 2; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H4    =P1 ^ 3; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H5    =P1 ^ 4; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H6    =P1 ^ 5; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H7    =P1 ^ 6; //設(shè)置LED點(diǎn)陣屏連接的I/O口
sbit    DY_LED1_H8    =P1 ^ 7; //設(shè)置LED點(diǎn)陣屏連接的I/O口

#define DY_P1M0SET        0x00 //設(shè)置I/O口工作方式//00000000(左到右,高到低位)
#define DY_P1M1SET        0xff //設(shè)置I/O口工作方式//00101000
#define DY_P3M0SET        0x00 //設(shè)置I/O口工作方式//00000000
#define DY_P3M1SET        0x00 //設(shè)置I/O口工作方式//10010100

bit PD;//秒點(diǎn)顯示標(biāo)志
unsigned char MENU;//菜單切換標(biāo)志位
data unsigned char  DY_PWM,bn, cou  = 0, TIME_YY,TIME_MO,TIME_DD,TIME_WW,TIME_HH,TIME_MM,TIME_SS;//設(shè)置時(shí)、分、秒存放區(qū)
data bit DAY_BIT = 0;//天數(shù)增加標(biāo)志位(用于日期進(jìn)位的啟動(dòng))
unsigned int aa;
unsigned char code disdata[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 //無小數(shù)點(diǎn)數(shù)碼管段碼表(0~9)
};
/*********************************************************************************************/
void delay (unsigned int a){ // 用于點(diǎn)掃描的延時(shí)
    unsigned int i;
    while( a-- != 0){
        for(i = 0; i < DY_DELAY; i++);
    }                     
}
/*********************************************************************************************/

/*****************************************************************************/
void dis_off (void){
    P1 = ~DY_P1M1SET; //關(guān)所有顯示
    P3 = ~DY_P3M1SET;
    delay(10-DY_PWM);
}
/*********************************************************************************************/
void displayHH1 (unsigned char d){ //第1列橫向顯示程序
    unsigned char i;
    i = d & 0x01;
    if(i == 0x01){
        DY_LED1_L1 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x02;
    if(i == 0x02){
        DY_LED1_L1 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x04;
    if(i == 0x04){
        DY_LED1_L1 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x08;
    if(i == 0x08){
        DY_LED1_L1 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x10;
    if(i == 0x10){
        DY_LED1_L1 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x20;
    if(i == 0x20){
        DY_LED1_L1 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x40;
    if(i == 0x40){
        DY_LED1_L1 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x80;
    if(i == 0x80){
        DY_LED1_L1 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}
/*********************************************************************************************/
void displayHH2 (unsigned char d){ //第2列橫向顯示程序
    unsigned char i;
    i = d & 0x01;
    if(i == 0x01){
        DY_LED1_L2 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x02;
    if(i == 0x02){
        DY_LED1_L2 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x04;
    if(i == 0x04){
        DY_LED1_L2 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x08;
    if(i == 0x08){
        DY_LED1_L2 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x10;
    if(i == 0x10){
        DY_LED1_L2 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x20;
    if(i == 0x20){
        DY_LED1_L2 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x40;
    if(i == 0x40){
        DY_LED1_L2 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x80;
    if(i == 0x80){
        DY_LED1_L2 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
                                
}
/*********************************************************************************************/
void displayHH3 (unsigned char d){ //第3列橫向顯示程序
    unsigned char i;
    i = d & 0x01;
    if(i == 0x01){
        DY_LED1_L3 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x02;
    if(i == 0x02){
        DY_LED1_L3 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x04;
    if(i == 0x04){
        DY_LED1_L3 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x08;
    if(i == 0x08){
        DY_LED1_L3 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x10;
    if(i == 0x10){
        DY_LED1_L3 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x20;
    if(i == 0x20){
        DY_LED1_L3 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x40;
    if(i == 0x40){
        DY_LED1_L3 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x80;
    if(i == 0x80){
        DY_LED1_L3 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();

}
/*********************************************************************************************/
void displayHH4 (unsigned char d){ //第4列橫向顯示程序
    unsigned char i;
    i = d & 0x01;
    if(i == 0x01){
        DY_LED1_L4 = 0;DY_LED1_H1 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x02;
    if(i == 0x02){
        DY_LED1_L4 = 0;DY_LED1_H2 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x04;
    if(i == 0x04){
        DY_LED1_L4 = 0;DY_LED1_H3 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x08;
    if(i == 0x08){
        DY_LED1_L4 = 0;DY_LED1_H4 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x10;
    if(i == 0x10){
        DY_LED1_L4 = 0;DY_LED1_H5 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x20;
    if(i == 0x20){
        DY_LED1_L4 = 0;DY_LED1_H6 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x40;
    if(i == 0x40){
        DY_LED1_L4 = 0;DY_LED1_H7 = 1;}delay(DY_PWM);dis_off();
    i = d & 0x80;
    if(i == 0x80){
        DY_LED1_L4 = 0;DY_LED1_H8 = 1;}delay(DY_PWM);dis_off();
}  
/*********************************************************************************************/
void diplay_data (unsigned char l,unsigned char d){
        switch (l){//顯示的列位置        
                case 1://            
                    displayHH1(d); //將顯示數(shù)據(jù)送入        
                    break;//        
                case 2://            
                    displayHH2(d); //將顯示數(shù)據(jù)送入        
                    break;//        
                case 3://            
                    displayHH3(d); //將顯示數(shù)據(jù)送入        
                    break;//        
                case 4://            
                    displayHH4(d); //將顯示數(shù)據(jù)送入        
                    break;//        
        }
}
/*********************************************************************************************/
bit IsLeapYear(void){    //計(jì)算本年是否是潤年
    unsigned int a;
    a = 2000+TIME_YY;//加2000表示成完整的年
    if((a%4==0 && a%100!=0)||(a%400==0)){ //潤年的計(jì)算公式
            return 1;//是潤年返回1
        }else{
             return 0;//不是潤年返回0
        }
}
/**********************************************************************************************/   
void month_day(void){  
    unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
    TIME_DD++;//天加1
    TIME_WW++;//星期值加1
    if(TIME_WW > 7){
        TIME_WW = 1;//時(shí)期值限定
    }
    if(TIME_DD > mon_day[TIME_MO-1]){//檢查天是否大于當(dāng)月的最大值
        if(IsLeapYear()&&TIME_MO==2){ //計(jì)算本月是否是潤年的2月份
            TIME_DD = 29;//如果是潤年又是2月,則天為29
        }else{
            TIME_DD = 1; //否則就等于1
            TIME_MO++;//月加1
            if(TIME_MO > 12){
                TIME_MO = 1; //如果月大于12則月等于1
                TIME_YY++;//年加1 (公歷年無限積加)
            }
        }
    }
}

/*********************************************************************************************/

void xianshi()    {

                    for(aa=0;aa<1000;aa++){
                    diplay_data (3,disdata[TIME_MM/10]);
                    diplay_data (4,disdata[TIME_MM%10]);
                    if(PD){
                    diplay_data (1,disdata[TIME_HH/10]);
                    diplay_data (2,disdata[TIME_HH%10]);
                    }else{
                    diplay_data (1,disdata[TIME_HH/10]);
                    diplay_data (2,disdata[TIME_HH%10]+0x80);           
                         }
                         }                                   
                    for(aa=1000;aa<2000;aa++){
                    diplay_data (1,disdata[TIME_MO/10]);
                     diplay_data (2,disdata[TIME_MO%10]);
                    diplay_data (3,disdata[TIME_DD/10]);
                    diplay_data (4,disdata[TIME_DD%10]);
                            }
                        
                    for(aa=2000;aa<3000;aa++){
                     diplay_data (2,disdata[10]);               
                    diplay_data (3,disdata[TIME_WW]);
                    diplay_data (4,disdata[10]);
                    if(aa==3000)
                        aa=0;  
                          }
                        }                 

/*********************************************************************************************/
void init (void){ //上電初始化
    P1M0 = DY_P1M0SET;
    P1M1 = DY_P1M1SET;
    P3M0 = DY_P3M0SET;
    P3M1 = DY_P3M1SET;
    dis_off();
    DY_PWM = DY_LI;
    TMOD = 0x11;         // 定時(shí)/計(jì)數(shù)器0,1工作于方式1   
    TH0 = 0x3c;          // 預(yù)置產(chǎn)生50ms時(shí)基信號(hào)   
    TL0 = 0xb0;   
    TH1=0x3c;
    TL1=0xb0;
    EA = 1;    //中斷總開關(guān)
    ET0 = 1;             // 定時(shí)/計(jì)數(shù)器0允許中斷   
    TR0 = 1;             // 開閉定時(shí)/計(jì)數(shù)器0   
    ET1 = 1;             // 定時(shí)/計(jì)數(shù)器0允許中斷   
    TR1 = 1;             // 開閉定時(shí)/計(jì)數(shù)器0   
    TIME_DD = 19; //時(shí)間在首次使用的值,之后會(huì)在EEPROM自動(dòng)記錄上一天的值
    TIME_MO    = 7; //初始時(shí)間:2009年5月18日周一,20時(shí)13分40秒
    TIME_YY = 17;
    TIME_WW = 3;
    TIME_HH    = 22;
    TIME_MM = 40;
    TIME_SS = 0;
}
/*********************************************************************************************/
void main (void){ //主程序
    unsigned char s;
    init();
    MENU=0;
    s=0;
    aa=0;
    while (1){
                if(DAY_BIT == 1){ //檢查天數(shù)是否更新,是則計(jì)算公歷
            month_day();//計(jì)算公歷日期   
            DAY_BIT = 0;//計(jì)算完成后將日期變更標(biāo)志位置0
                     }
               if(MENU==0)    //顯示正常走時(shí)主界面
            xianshi();

            if(DY_KEY==0){
                EA = 0;    //中斷總開關(guān)
                TR1 = 0;             // 關(guān)閉定時(shí)/計(jì)數(shù)器
                s++;
                if(s>200){
                    s=0;MENU++;
                    while(DY_KEY==0){
                        diplay_data (1,disdata[TIME_HH/10]);
                        diplay_data (2,disdata[TIME_HH%10]);
                    }
                }
            }//長短按鍵處理//長按轉(zhuǎn)到MENU1
            if(DY_KEY==1 && s>10 && s<200){s=0;DY_PWM++;if(DY_PWM>4)DY_PWM=1;}//短按設(shè)置亮度
            
        }
        if(MENU==1){//設(shè)置時(shí)間:小時(shí)
            diplay_data (1,disdata[TIME_HH/10]);
            diplay_data (2,disdata[TIME_HH%10]);
            diplay_data (3,0x80);
            diplay_data (4,0x80);

            if(DY_KEY==0){

                s++;
                if(s>200){
                    s=0;MENU++;
                    while(DY_KEY==0){
                        diplay_data (3,disdata[TIME_MM/10]);
                        diplay_data (4,disdata[TIME_MM%10]);
                    }
                }
            }//長短按鍵處理//長按轉(zhuǎn)到MENU1
            if(DY_KEY==1 && s>10 && s<200){s=0;TIME_HH++;if(TIME_HH>23)TIME_HH=0;}//短按設(shè)置亮度

        }
        if(MENU==2){//設(shè)置時(shí)間:分鐘
            diplay_data (3,disdata[TIME_MM/10]+0x80);
            diplay_data (4,disdata[TIME_MM%10]+0x80);

            if(DY_KEY==0){
                s++;
                if(s>200){
                    s=0;MENU=0;
                    while(DY_KEY==0){
                        diplay_data (1,disdata[TIME_HH/10]);
                        diplay_data (2,disdata[TIME_HH%10]);
                        diplay_data (3,disdata[TIME_MM/10]);
                        diplay_data (4,disdata[TIME_MM%10]);
                    }
                }
            }//長短按鍵處理//長按轉(zhuǎn)到MENU1
            if(DY_KEY==1 && s>10 && s<200){s=0;TIME_MM++;TIME_SS=0;if(TIME_MM>59)TIME_MM=0;}//短按設(shè)置亮度
        
            }            
        }
/**********************************************************************************************/   
void tiem0(void) interrupt 1{   // T/C0中斷服務(wù)程序(產(chǎn)生50ms時(shí)基信號(hào))   
    cou++;                      // 軟計(jì)數(shù)器加1   
    if(cou > 19){                 // 計(jì)數(shù)值到100(1s)   
        cou = 0;               // 軟計(jì)數(shù)器清零   
        TIME_SS++;                 // 秒計(jì)數(shù)器加1(進(jìn)位10ms*100=1s)   
        PD =~ PD;                //秒點(diǎn)閃爍
        if(TIME_SS > 59){          // 秒計(jì)數(shù)值到60   
           
            TIME_SS = 0;           // 秒計(jì)數(shù)器清零   
            TIME_MM++;             // 分計(jì)數(shù)器加1(進(jìn)位60s=1m)  
            if(TIME_MM > 59){      // 分計(jì)數(shù)到60   
                TIME_MM = 0;       // 分計(jì)數(shù)器清零   
                TIME_HH++;         // 時(shí)計(jì)數(shù)器加1(進(jìn)位60m=1h)   
                if(TIME_HH > 23){  // 時(shí)計(jì)數(shù)到23   
                    TIME_HH = 0;   // 時(shí)計(jì)數(shù)器清零
                    DAY_BIT = 1;    //天增加標(biāo)志位

                }  
            }   
        }   
    }   
    TH0 = 0x3c;                // 重置定時(shí)常數(shù)   
    TL0 = 0xb0;   
}
/**********************************************************************************************/   
void tiem1(void) interrupt 3{   // T/C0中斷服務(wù)程序(產(chǎn)生50ms時(shí)基信號(hào))   
    TH1=0x3c;
    TL1=0xb0;
        aa++ ;
}
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-7-20 21:57 | 顯示全部樓層
本帖最后由 zl2168 于 2017-7-21 21:24 編輯

實(shí)例91  具有校正功能的時(shí)鐘1302(LCD1602顯示)
實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.68 KB, 下載次數(shù): 4)
具有校正功能的時(shí)鐘1302.jpg
Proteus仿真,確認(rèn)有效。
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。


回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-7-20 21:58 | 顯示全部樓層
本帖最后由 zl2168 于 2017-7-20 23:00 編輯

實(shí)例93  具有校正功能的時(shí)鐘1302(LED數(shù)碼管顯示)
實(shí)例93 帶校正時(shí)分秒的時(shí)鐘1302(6位LED數(shù)碼管顯示).rar (732.75 KB, 下載次數(shù): 4)
開機(jī)顯示PC機(jī)時(shí)分秒的時(shí)鐘(6位LED數(shù)碼管顯示).jpg
Proteus仿真一下,確認(rèn)有效。
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。


回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2017-7-20 21:59 | 顯示全部樓層
本帖最后由 zl2168 于 2017-7-20 22:58 編輯

實(shí)例94  模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基)
實(shí)例94 模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基).rar (43.05 KB, 下載次數(shù): 4)
模擬電子鐘.jpg
Proteus仿真一下,確認(rèn)有效。
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。




回復(fù)

使用道具 舉報(bào)

ID:221185 發(fā)表于 2017-7-20 23:47 | 顯示全部樓層
謝謝!我去參考下,我的那個(gè)程序哪里有沖突,能幫忙看看嘛?謝謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表