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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7056|回復: 14
收起左側

單片機電子時鐘如何設置按鍵來控制時間的加減呢?

  [復制鏈接]
ID:364479 發表于 2018-7-4 08:57 | 顯示全部樓層 |閱讀模式
51單片機的電子時鐘,如何設置按鍵來控制時間的加減呢?
回復

使用道具 舉報

ID:320306 發表于 2018-7-4 11:26 | 顯示全部樓層
設置變量,加就變量加一,減就變量減一!!!!!!!!!!!
回復

使用道具 舉報

ID:364700 發表于 2018-7-4 11:44 | 顯示全部樓層
要設置開關來控制
回復

使用道具 舉報

ID:164602 發表于 2018-7-4 12:20 | 顯示全部樓層
給你一個例子吧,雖然程序有很多BUG,但自己搞懂了,就可以變成自己的程序了。
main.c:——————————————————————
/*******************************************************************************
* 實驗名                           : 萬年歷實驗
* 使用的IO             :
* 實驗效果       :1602顯示時鐘,按K3進入時鐘設置,按K1選擇設置的時分秒日月,按K2選擇
*選擇設置加1。
*        注意                                         :
*******************************************************************************/

#include<reg51.h>
#include"lcd.h"
#include"ds1302.h"

sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;

void Int0Configuration();
void LcdDisplay();
unsigned char SetState,SetPlace;
void Delay10ms(void);   //誤差 0us
/*******************************************************************************
* 函數名         : main
* 函數功能                   : 主函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void main()
{
        unsigned char i;
        Int0Configuration();
        LcdInit();
        Ds1302Init();
        while(1)
        {       
                if(SetState==0)
                {
                        Ds1302ReadTime();
                }
                else
                {
                        if(K1==0)                //檢測按鍵K1是否按下
                        {
                                Delay10ms();        //消除抖動
                                if(K1==0)
                                {
                                        SetPlace++;
                                        if(SetPlace>=7)
                                                SetPlace=0;                                       
                                }

                                while((i<50)&&(K1==0))         //檢測按鍵是否松開
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                        }
                        if(K2==0)                //檢測按鍵K2是否按下
                        {
                                Delay10ms();        //消除抖動
                                if(K2==0)
                                {
                                        TIME[SetPlace]++;
                                        if((TIME[SetPlace]&0x0f)>9)                                         //換成BCD碼。
                                        {
                                                TIME[SetPlace]=TIME[SetPlace]+6;
                                        }
                                        if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小時只能到23
                                        {
                                                TIME[SetPlace]=0;
                                        }
                                        if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
                                        {
                                                TIME[SetPlace]=0;       
                                        }
                                        if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
                                        {
                                                TIME[SetPlace]=0;
                                        }       
                                        if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //周只能到7
                                        {
                                                TIME[SetPlace]=1;
                                        }               
//                                        if(SetPlace==5)                //月只能到12
//                                        {
//                                                TIME[SetPlace]=;
//                                        }       
                                }
                               
                                while((i<50)&&(K2==0))         //檢測按鍵是否松開
                                {
                                        Delay10ms();
                                        i++;
                                }
                                i=0;
                               
                        }                                               
                }
        LcdDisplay();       
        }
       
}
/*******************************************************************************
* 函數名         : LcdDisplay()
* 函數功能                   : 顯示函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void LcdDisplay()
{
        LcdWriteCom(0x80+0X40);
        LcdWriteData('0'+TIME[2]/16);                                //時
        LcdWriteData('0'+(TIME[2]&0x0f));                                 
        LcdWriteData('-');
        LcdWriteData('0'+TIME[1]/16);                                //分
        LcdWriteData('0'+(TIME[1]&0x0f));       
        LcdWriteData('-');
        LcdWriteData('0'+TIME[0]/16);                                //秒
        LcdWriteData('0'+(TIME[0]&0x0f));

        LcdWriteCom(0x80);
        LcdWriteData('2');
        LcdWriteData('0');
        LcdWriteData('0'+TIME[6]/16);                        //年
        LcdWriteData('0'+(TIME[6]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[4]/16);                        //月
        LcdWriteData('0'+(TIME[4]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[3]/16);                        //日
        LcdWriteData('0'+(TIME[3]&0x0f));
        LcdWriteCom(0x8D);
        LcdWriteData('0'+(TIME[5]&0x07));        //星期                         
}
/*******************************************************************************
* 函數名         : Int0Configuration()
* 函數功能                   : 配置外部中斷0
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Int0Configuration()
{
        //設置INT0
        IT0=1;//跳變沿出發方式(下降沿)
        EX0=1;//打開INT0的中斷允許。
        EA=1;//打開總中斷       
}
/*******************************************************************************
* 函數名         : Int0()
* 函數功能                   : 外部中斷0 中斷函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

void Int0() interrupt 0                 
{
        Delay10ms();
        if(K3==0)
        {
                SetState=~SetState;
                SetPlace=0;
                Ds1302Init();       
        }
}
/*******************************************************************************
* 函數名         : Delay10ms
* 函數功能                   : 延時函數,延時10ms
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/
void Delay10ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
1302.c______________________
#include"ds1302.h"

//---DS1302寫入和讀取時分秒的地址命令---//
//---秒分時日月周年 最低位讀寫位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---//
//---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
uchar TIME[7] = {0x00, 0x00, 0x12, 0x01, 0x01, 0x02, 0x13};

/*******************************************************************************
* 函 數 名         : Ds1302Write
* 函數功能                   : 向DS1302命令(地址+數據)
* 輸    入         : addr,dat
* 輸    出         : 無
*******************************************************************************/

void Ds1302Write(uchar addr, uchar dat)
{
        uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1; //然后將RST(CE)置高電平。
        _nop_();

        for (n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//寫入8位數據
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;//傳送數據結束
        _nop_();
}

/*******************************************************************************
* 函 數 名         : Ds1302Read
* 函數功能                   : 讀取一個地址的數據
* 輸    入         : addr
* 輸    出         : dat
*******************************************************************************/

uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }

        RST = 0;
        _nop_();        //以下為DS1302復位的穩定時間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}

/*******************************************************************************
* 函 數 名         : Ds1302Init
* 函數功能                   : 初始化DS1302.
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void Ds1302Init()
{
        uchar n;
        Ds1302Write(0x8E,0X00);                 //禁止寫保護,就是關閉寫保護功能
        for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
        }
        Ds1302Write(0x8E,0x80);                 //打開寫保護功能
}

/*******************************************************************************
* 函 數 名         : Ds1302ReadTime
* 函數功能                   : 讀取時鐘信息
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/

void Ds1302ReadTime()
{
        uchar n;
        for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年
        {
                TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
               
}
1302.h______________________________
#ifndef __DS1302_H_
#define __DS1302_H_

//---包含頭文件---//
#include<reg51.h>
#include<intrins.h>

//---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

//---定義ds1302使用的IO口---//
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;

//---定義全局函數---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();

//---加入全局變量--//
extern uchar TIME[7];        //加入全局變量

#endif
LCD.c________________________________
#include"lcd.h"

/*******************************************************************************
* 函 數 名         : Lcd1602_Delay1ms
* 函數功能                   : 延時函數,延時1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
*******************************************************************************/

void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
           
}

/*******************************************************************************
* 函 數 名         : LcdWriteCom
* 函數功能                   : 向LCD寫入一個字節的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
#ifndef         LCD1602_4PINS         //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;     //使能
        LCD1602_RS = 0;           //選擇發送命令
        LCD1602_RW = 0;           //選擇寫入
       
        LCD1602_DATAPINS = com;     //放入命令
        Lcd1602_Delay1ms(1);                //等待數據穩定

        LCD1602_E = 1;                  //寫入時序
        Lcd1602_Delay1ms(5);          //保持時間
        LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)          //寫入命令
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫入命令
        LCD1602_RW = 0;         //選擇寫入

        LCD1602_DATAPINS = com;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

//        Lcd1602_Delay1ms(1);
        LCD1602_DATAPINS = com << 4; //發送低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;         //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名         : LcdWriteData
* 函數功能                   : 向LCD寫入一個字節的數據
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/                  
#ifndef         LCD1602_4PINS                  
void LcdWriteData(uchar dat)                        //寫入數據
{
        LCD1602_E = 0;        //使能清零
        LCD1602_RS = 1;        //選擇輸入數據
        LCD1602_RW = 0;        //選擇寫入

        LCD1602_DATAPINS = dat; //寫入數據
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;   //寫入時序
        Lcd1602_Delay1ms(5);   //保持時間
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //寫入數據
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //選擇寫入數據
        LCD1602_RW = 0;          //選擇寫入

        LCD1602_DATAPINS = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;

        LCD1602_DATAPINS = dat << 4; //寫入低四位
        Lcd1602_Delay1ms(1);

        LCD1602_E = 1;          //寫入時序
        Lcd1602_Delay1ms(5);
        LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名       : LcdInit()
* 函數功能                 : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數據指針起點
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //將8位總線轉為4位總線
        LcdWriteCom(0x28);         //在四位線下的初始化
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數據指針起點
}
#endif
LCD.h_________________________________
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
當使用的是4位數據傳輸的時候定義,
使用8位取消這個定義
**********************************/
#define LCD1602_4PINS

/**********************************
包含頭文件
**********************************/
#include<reg51.h>

//---重定義關鍵詞---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

/**********************************
PIN口定義
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

/**********************************
函數聲明
**********************************/
/*在51單片機12MHZ時鐘下的延時函數*/
void Lcd1602_Delay1ms(uint c);   //誤差 0us
/*LCD1602寫入8位命令子函數*/
void LcdWriteCom(uchar com);
/*LCD1602寫入8位數據子函數*/       
void LcdWriteData(uchar dat)        ;
/*LCD1602初始化子程序*/               
void LcdInit();                                                  

#endif

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:364770 發表于 2018-7-4 13:38 | 顯示全部樓層
電子時鐘用單片機控制
回復

使用道具 舉報

ID:280206 發表于 2018-7-4 14:15 | 顯示全部樓層
我是這樣做的

1893878478.jpg
1894796573.jpg
1891574732.jpg

評分

參與人數 1黑幣 +90 收起 理由
admin + 90 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:280206 發表于 2018-7-4 14:17 | 顯示全部樓層

                   ;電子鐘程序
                   ;
                          ;STC12C5A60S2  12MC  12T
                          ;
                          ;
                          ;以下定義中斷向量地址
ORG 0000H
LJMP CHUSI
ORG 0003H
RETI
ORG 000BH         ;定時器0中斷向量
LJMP DSQ0      
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 002BH         ;定時器2中斷向量
RETI
NOP
        NOP
        NOP
        NOP
        ORG 0064H
                          ;初始化和定義寄存器用途
CHUSI: CLR A             ;清零
MOV 87H,A         ;置CPU功率方式
MOV IE,A          ;禁止中斷
MOV IP,A          ;禁止中斷優先控制
MOV SCON,A        ;關閉串行控制
MOV TMOD,A        ;計數器控制
MOV TCON,A        ;計數器控制
MOV SP,#080H      ;設置棧底
                   ;
MOV P0,#0FFH      ;顯示劃驅動低有效
        MOV P2,#0FFH      ;顯示位驅動,低有效
        MOV P3,#0FFH      ;按鍵,低電平有效
   MOV 21H,#0        ;62.5mS計數器
        MOV 22H,#0        ;
MOV 23H,#0        ;秒計數暫存位
MOV 24H,#10        ;分計數暫存位
MOV 25H,#9        ;時計數暫存位
MOV 26H,#2       ;日計數暫存位,上電為16
        MOV 27H,#7       ;月計數暫存位,上電為7
        MOV 28H,#1        ;星期計數器
   CLR 0H            ;時間/日期標志,0=時間,1=日期
        MOV 30H,#0        ;
        MOV 31H,#0        ;
        MOV 32H,#0        ;
        MOV 33H,#0H       ;
                          ;設置定時器0為16位計數器方式(65536-62500)
        MOV TL0,#213      ;重裝定時器0寄存器低位(T0=62.5毫微秒)
        MOV TH0,#0BH      ;重裝定時器0高位重裝入寄存器
        NOP               ;
                                 ;
        NOP               ;   TMOD       GATE  C/T M1 M0 GATE C/T M1 M0
        MOV TMOD,#01H     ;定時/計數       0     0  0  0   0    0  0  1
                          ;
NOP               ;   TCON       TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
        MOV TCON,#00H     ;啟動定時器0    0   0   0   0   0   0   0   0
                          ;
                          ;
        MOV IP,#0H        ;中斷優先控制  X  X  PT2  PS  PT1  PX1  PT0  PX0   
                          ;              0  0   0   0   0    0    0    0
                          ;
                    ;中斷控制   EA -- ET2 ES ET1 EX1 ET0 EX0
        MOV IE,#10001010B;             1     0  0   1   0   1   0
        LJMP XIANSHI
        NOP
        NOP
        ORG 0100H                            ;
XIANSHI:NOP
        JNB P3.2,AJS4      ;查詢按鍵 顯示日期
        MOV A,23H          ;23H里有秒計數器
        CJNE A,#5,M6       ;每分鐘第5秒到第10秒顯示日期
        SETB 0H
        LJMP D1
M6:     CJNE A,#6,M7
        SETB 0H
        LJMP D1
M7:     CJNE A,#7,M8
        SETB 0H
        LJMP D1
M8:     CJNE A,#8,M9
        SETB 0H
        LJMP D1
M9:     CJNE A,#9,M10   
        SETB 0H
        LJMP D1
M10:    CLR 0H            ;非5 6 7 8 9 顯示時間
        LJMP D1            ;S4=1 沒按
AJS4:   SETB 0H            ;S4=0 按下
        SETB TR0           ;啟動用
D1:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第一位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ1        ;BIT0為1顯示日期
        MOV B,#10         ;小時計數器0-23
        MOV A,25H         ;小時計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        CJNE A,#0,SWW0    ;十位為0不顯示
        LCALL YSQ1        ;調用延時器1
        LJMP D2
XSRQ1:  MOV B,#10         ;月份計數器1-12
        MOV A,27H          ;月份計數器計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        CJNE A,#0,SWW0    ;十位為0不顯示
        LCALL YSQ1        ;調用延時器1
        LJMP D2
SWW0:   LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.0          ;顯示第一位   
        LCALL YSQ1        ;調用延時器1
        NOP   
        NOP
        NOP
D2:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第二位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ2        ;BIT0為1顯示日期
        MOV B,#10         ;小時計數器0-23
        MOV A,25H          ;小時計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        MOV A,B           ;個位數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.1          ;顯示第二位
        LCALL YSQ1        ;調用延時器1
        LJMP D3
XSRQ2:  MOV B,#10         ;月份計數器1-12
        MOV A,27H          ;月份計數器計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        MOV A,B           ;個位數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.1          ;顯示第二位
        LCALL YSQ1        ;調用延時器1
        NOP
        NOP
        NOP
D3:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第三位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ3        ;BIT0為1顯示日期
        MOV A,#0BFH        ;中間劃
        MOV P0,A          ;顯示劃驅動
        CLR P2.2          ;顯示第三位
        LCALL YSQ1        ;調用延時器1
        LJMP D4
XSRQ3:  MOV A,#0F7H       ;下邊劃
        MOV P0,A          ;顯示劃驅動
        CLR P2.2          ;顯示第三位
        LCALL YSQ1        ;調用延時器1
        NOP   
        NOP
        NOP
D4:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第四位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ4        ;BIT0為1顯示日期
        MOV B,#10         ;分位計數器0-59
        MOV A,24H          ;分計數器
        DIV AB            ;分計數器除10,商在A,余數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.3          ;顯示第四位
        LCALL YSQ1        ;調用延時器1
        LJMP D5
XSRQ4:  MOV B,#10         ;日期計數器1-31
        MOV A,26H          ;日期計數器計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        CJNE A,#0,SWW4    ;十位為0不顯示
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.3          ;顯示第四位
        LCALL YSQ1        ;調用延時器1
        LJMP D5
SWW4:   LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.3          ;顯示第位
        LCALL YSQ1        ;調用延時器1
        NOP   
        NOP
        NOP
D5:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第五位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ5         ;BIT0為1顯示日期
        MOV B,#10         ;小時計數器0-23
        MOV A,24H          ;小時計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        MOV A,B           ;個位數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.4          ;顯示第五位
        LCALL YSQ1        ;調用延時器1
        LJMP D6
XSRQ5:  MOV B,#10         ;月份計數器1-12
        MOV A,26H          ;月份計數器計數器
        DIV AB            ;小時計數器除10,商在A,余數在B
        MOV A,B           ;個位數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.4          ;顯示第五位
        LCALL YSQ1        ;調用延時器1
        NOP
        NOP
        NOP
D6:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第六位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ6        ;BIT0為1顯示日期
        MOV A,#0BFH        ;中間劃
        MOV P0,A          ;顯示劃驅動
        CLR P2.5          ;顯示第六位
        LCALL YSQ1        ;調用延時器1
        LJMP D7
XSRQ6:  MOV A,#0F7H       ;下邊劃
        MOV P0,A          ;顯示劃驅動
        CLR P2.5          ;顯示第六位
        LCALL YSQ1        ;調用延時器1
        NOP   
        NOP
        NOP
D7:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第七位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ7        ;BIT0為1顯示日期
        MOV B,#10         ;秒計數器0-59
        MOV A,23H          ;秒計數器
        DIV AB            ;秒計數器除10,商在A,余數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.6          ;顯示第七位
        LCALL YSQ1        ;調用延時器1
        LJMP D8
XSRQ7:  MOV A,#0F7H       ;星期計數器
        MOV P0,A          ;顯示劃驅動
        CLR P2.6          ;顯示第七位
        LCALL YSQ1        ;調用延時器1
        NOP
        NOP
D8:     MOV P0,#0FFH      ;關閉顯示劃驅動,準備顯示第八位
        MOV P2,#0FFH      ;關閉顯示位驅動
        JB 0,XSRQ8        ;BIT0為1顯示日期
        MOV B,#10         ;秒計數器0-59
        MOV A,23H         ;秒計數器
        DIV AB            ;秒計數器除10,商在A,余數在B
        MOV A,B           ;個位數在B
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.7          ;顯示第八位
        LCALL YSQ1        ;調用延時器1
        LJMP XIANSHI
XSRQ8:  MOV A,28H         ;星期計數器計數器
        LCALL YMQ         ;調用譯碼器      
        MOV P0,A          ;顯示劃驅動
        CLR P2.7          ;顯示第八位
        LCALL YSQ1        ;調用延時器1
        LJMP XIANSHI
        NOP
        NOP
        NOP
        LJMP XIANSHI
        LJMP XIANSHI      
DSQ0:   PUSH PSW          ;程序狀態字入棧
        PUSH ACC          ;累加器入棧
        NOP               ;空操作 每插入一個操作可增大每日誤差115.2毫秒 每8天一秒
        NOP               ;
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        MOV TL0,#197      ;重裝定時器0寄存器低位(T0=62.5毫秒)( 減小變慢 增大變快)
        MOV TH0,#0BH      ;重裝定時器0高位重裝入寄存器(每調整一個數日誤差1.3824秒)
        SETB TR0          ;啟動定時器0
        INC 21H           ;定時器0的第1計數器(62.5mS)
        LCALL S30         ;查詢調秒按鍵
        MOV A,21H         ;62.5毫秒+1
        CJNE A,#8,P16     ;不到8 半秒則返回
        LCALL AJ          ;到半秒查詢調時分鍵
        LJMP DSQ0W
P16:    CJNE A,#16,DSQ0W  ;不到整秒時間則返回
        MOV 21H,#0        ;62.5毫秒重新計數
        INC 23H           ;分計數+1
        LCALL AJ          ;調用按鍵
        MOV A,23H         ;比較
        CJNE A,#60,DSQ0W ;60秒嗎
        MOV 23H,#0       ;秒重新計數
        INC 24H          ;分計數
        MOV A,24H         ;
        CJNE A,#60,DSQ0W ;不到時間則返回
        MOV 24H,#0       ;分重新計數
        INC 25H          ;小時計數
        MOV A,25H         ;
        CJNE A,#24,DSQ0W  ;24嗎
        MOV 25H,#0       ;重新計數
        INC 28H          ;星期加1
        MOV A,28H
        CJNE A,#7,RQJS   ;每星期7天 顯示 0 1 2 3 4 5 6
        MOV 28H,#0
RQJS:   INC 26H          ;日期計數
   MOV DPTR,#TSZS   ;設置每月天數指示
        MOV A,27H        ;把當前月數送A
MOVC A,@A+DPTR   ;讀取該月應有天數
        CJNE A,26H,DSQ0W ;比較,如相等,滿月了,否則從中斷返回
        MOV 26H,#1       ;日寄存器置1
        INC 27H          ;月寄存器加1
        MOV A,27H
CJNE A,#13,DSQ0W; 如等于13,月寄存器置1,否則從中斷返回
        MOV 27H,#1         ;
DSQ0W:  POP ACC           ;程序狀態字出棧
  POP PSW           ;累加器出棧
       RETI              ;從定時器0中斷返回
        NOP
        NOP   
        NOP
YMQ:    MOV DPTR,#YMSJ    ;設置譯碼數據地址指針
       MOVC A,@A+DPTR    ;讀取譯碼數據
        RET
        RET
YMSJ:   DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0
        NOP
        NOP
        RET                ;返回
        NOP
YSQ1:   CLR P3.1
        MOV 30H,#255       ;延時3
YSQ:    NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        DJNZ 30H,YSQ       ;5
        SETB P3.1
        RET
TSZS:   DB 0H,32,29,32,31 ;月中天數數據(+1)
        DB 32,31,32,32,31
        DB 32,31,32
        NOP
        NOP
        NOP
AJ:     NOP                ;查詢按鍵程序
        JNB P3.3,S1        ;查詢按鍵 小時 月
        JNB P3.6,S2        ;查詢按鍵 分鐘 日
        JNB P3.7,S3        ;查詢按鍵 秒 星期
        RET                ;沒有按鍵  返回     
S1:     JNB P3.2,S14       ;檢查日期顯示鍵 如有效調月份
        MOV A,25H          ;讀取小時到A
        CJNE A,#24,XY23    ;小于23嗎
        MOV 25H,#0         ;23+1=24(0)
        RET
XY23:   INC 25H            ;
        RET
        NOP
S14:    MOV A,27H          ;讀取月份到A
        CJNE A,#12,XY12    ;小于12嗎
        MOV 27H,#1         ;12+1=1
        RET
XY12:   INC 27H            ;
        RET
        RET
        RET                ;
        NOP
S2:     JNB P3.2,S24       ;檢查日期顯示鍵 如有效調月份
        MOV A,24H          ;讀取分到A
        CJNE A,#59,XY59    ;小于23嗎
        MOV 24H,#0         ;59+1=60(0)
        RET
XY59:   INC 24H            ;
        RET
        NOP
S24:    MOV DPTR,#TSZS   ;設置每月天數指示
        MOV A,27H        ;把當前月數送A
MOVC A,@A+DPTR   ;讀取該月應有天數
        DEC A
        CJNE A,26H,XYDQY ;比較,如相等,滿月了,
        MOV 26H,#1        ;12+1=1
        RET
XYDQY:  INC 26H            ;
        RET
        RET
        RET                ;
S3:     JNB P3.2,S34       ;檢查日期顯示鍵 如有效調月份
        RET
S34:    MOV A,28H          ;讀取星期到A
        CJNE A,#6,XY6      ;小于6嗎
        MOV 28H,#0         ;6+1=0
        RET
XY6:    INC 28H            ;
        RET
        RET
        RET                ;
        NOP
S30:    JB P3.7,AJFH       ;查詢按鍵 秒 星期
        JNB P3.2,AJFH      ;檢查日期顯示鍵 如有效調月份
S31:    MOV A,23H          ;讀取秒到A
        CJNE A,#30,XY33    ;等于30嗎
S331:   MOV 23H,#0         ;等于30退到0
        MOV 21H,#0
        RET
XY33:   JC S331
        MOV 23H,#0
        MOV 21H,#0
        INC 24H          ;分計數
        MOV A,24H         ;
        CJNE A,#60,AJFH  ;不到時間則返回
        MOV 24H,#0       ;分重新計數
        INC 25H          ;小時計數                    ;
AJFH:   RET
        NOP
        RET
        RET
        RET                ;
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        END

回復

使用道具 舉報

ID:364810 發表于 2018-7-4 14:45 | 顯示全部樓層
先通過按鍵加減來設置好變量參數,然后將數值通過寫入函數寫入時鐘芯片
回復

使用道具 舉報

ID:358998 發表于 2018-7-4 14:49 | 顯示全部樓層
按鍵 長按 觸發 功能 是怎么完成的
回復

使用道具 舉報

ID:16255 發表于 2018-7-4 14:55 | 顯示全部樓層

評分

參與人數 1黑幣 +70 收起 理由
admin + 70 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:365230 發表于 2018-7-4 22:46 | 顯示全部樓層
同求個電子鐘程序
回復

使用道具 舉報

ID:280206 發表于 2018-7-5 14:12 | 顯示全部樓層
回復11樓 求知心  ,7樓是完整的51系列單片機作時鐘的程序,用兩組端口掃描方式驅動8只數碼管,用四個端口作校時控制,利用內部定時器0,分頻定時,中斷計數,程序支持8051系列40腳的系列,我用的是STC12C560S2,試驗通過,日誤差能控制到0.125秒
回復

使用道具 舉報

ID:363756 發表于 2018-7-5 14:33 | 顯示全部樓層
寫一個延時函數通過按鍵改變延時函數參數就行
回復

使用道具 舉報

ID:111634 發表于 2018-7-7 16:14 | 顯示全部樓層
實例94  模擬電子鐘(由80C51定時器產生秒時基)
Proteus仿真一下,確認有效。
實例94 模擬電子鐘(由80C51定時器產生秒時基).rar (43.05 KB, 下載次數: 5)
回復

使用道具 舉報

ID:111634 發表于 2018-7-7 16:16 | 顯示全部樓層
本帖最后由 zl2168 于 2018-7-7 16:21 編輯

實例93  具有校正功能的時鐘1302(LED數碼管顯示)
Proteus仿真一下,確認有效。
實例93 帶校正時分秒的時鐘1302(6位LED數碼管顯示).rar (732.75 KB, 下載次數: 5)

評分

參與人數 1黑幣 +5 收起 理由
樂呵呵的小鵬 + 5

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩亚洲国产综合 | 欧美国产视频 | 亚洲色图婷婷 | 91欧美 | 国产色婷婷精品综合在线播放 | 精精国产xxxx视频在线野外 | 在线观看你懂的网站 | 欧美激情国产精品 | 亚洲一二三区在线观看 | 爱高潮www亚洲精品 中文字幕免费视频 | av手机在线播放 | 国产美女黄色片 | 欧美一区二区三区国产 | 日日操av | 91久久精品一区二区二区 | 四虎午夜剧场 | 欧美一级二级在线观看 | 国产欧美性成人精品午夜 | 亚洲精品中文字幕在线观看 | 一区二区免费 | 精品三级在线观看 | 国产午夜精品一区二区三区四区 | 欧美a在线看 | 色网站视频 | 欧美成人精品在线 | 成人精品国产免费网站 | 日韩精品中文字幕在线 | 免费天天干 | 精品亚洲一区二区 | 国产精品美女 | 欧美日韩在线观看一区二区三区 | 二区三区视频 | 日日骚网| 中文字幕一区二区三区四区 | 91免费电影| 一级片视频免费 | 成人在线观看免费 | 成人精品视频99在线观看免费 | 日韩在线视频免费观看 | 久久免费视频2 | 久久久青草婷婷精品综合日韩 |