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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7190|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)電子時鐘如何設(shè)置按鍵來控制時間的加減呢?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)的電子時鐘,如何設(shè)置按鍵來控制時間的加減呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:320306 發(fā)表于 2018-7-4 11:26 | 只看該作者
設(shè)置變量,加就變量加一,減就變量減一!!!!!!!!!!!
回復(fù)

使用道具 舉報(bào)

板凳
ID:364700 發(fā)表于 2018-7-4 11:44 | 只看該作者
要設(shè)置開關(guān)來控制
回復(fù)

使用道具 舉報(bào)

地板
ID:164602 發(fā)表于 2018-7-4 12:20 | 只看該作者
給你一個例子吧,雖然程序有很多BUG,但自己搞懂了,就可以變成自己的程序了。
main.c:——————————————————————
/*******************************************************************************
* 實(shí)驗(yàn)名                           : 萬年歷實(shí)驗(yàn)
* 使用的IO             :
* 實(shí)驗(yàn)效果       :1602顯示時鐘,按K3進(jìn)入時鐘設(shè)置,按K1選擇設(shè)置的時分秒日月,按K2選擇
*選擇設(shè)置加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
/*******************************************************************************
* 函數(shù)名         : main
* 函數(shù)功能                   : 主函數(shù)
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

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();       
        }
       
}
/*******************************************************************************
* 函數(shù)名         : LcdDisplay()
* 函數(shù)功能                   : 顯示函數(shù)
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

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));        //星期                         
}
/*******************************************************************************
* 函數(shù)名         : Int0Configuration()
* 函數(shù)功能                   : 配置外部中斷0
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/

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

void Int0() interrupt 0                 
{
        Delay10ms();
        if(K3==0)
        {
                SetState=~SetState;
                SetPlace=0;
                Ds1302Init();       
        }
}
/*******************************************************************************
* 函數(shù)名         : Delay10ms
* 函數(shù)功能                   : 延時函數(shù),延時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點(diǎn)00分00秒。---//
//---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
uchar TIME[7] = {0x00, 0x00, 0x12, 0x01, 0x01, 0x02, 0x13};

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Write
* 函數(shù)功能                   : 向DS1302命令(地址+數(shù)據(jù))
* 輸    入         : 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;//數(shù)據(jù)從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;//傳送數(shù)據(jù)結(jié)束
        _nop_();
}

/*******************************************************************************
* 函 數(shù) 名         : Ds1302Read
* 函數(shù)功能                   : 讀取一個地址的數(shù)據(jù)
* 輸    入         : 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;//數(shù)據(jù)從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數(shù)據(jù)在上升沿時,DS1302讀取數(shù)據(jù)
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數(shù)據(jù)
                _nop_();
        }

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

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

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

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

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

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

//---重定義關(guān)鍵詞---//
#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;

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

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

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

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

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--);
                 }      
        }
           
}

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

        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; //發(fā)送低四位
        Lcd1602_Delay1ms(1);

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

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

        LCD1602_E = 1;   //寫入時序
        Lcd1602_Delay1ms(5);   //保持時間
        LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)                        //寫入數(shù)據(jù)
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //選擇寫入數(shù)據(jù)
        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
/*******************************************************************************
* 函 數(shù) 名       : LcdInit()
* 函數(shù)功能                 : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/                  
#ifndef                LCD1602_4PINS
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#else
void LcdInit()                                                  //LCD初始化子程序
{
        LcdWriteCom(0x32);         //將8位總線轉(zhuǎn)為4位總線
        LcdWriteCom(0x28);         //在四位線下的初始化
        LcdWriteCom(0x0c);  //開顯示不顯示光標(biāo)
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設(shè)置數(shù)據(jù)指針起點(diǎn)
}
#endif
LCD.h_________________________________
#ifndef __LCD_H_
#define __LCD_H_
/**********************************
當(dāng)使用的是4位數(shù)據(jù)傳輸?shù)臅r候定義,
使用8位取消這個定義
**********************************/
#define LCD1602_4PINS

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

//---重定義關(guān)鍵詞---//
#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;

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

#endif

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

5#
ID:364770 發(fā)表于 2018-7-4 13:38 | 只看該作者
電子時鐘用單片機(jī)控制
回復(fù)

使用道具 舉報(bào)

6#
ID:280206 發(fā)表于 2018-7-4 14:15 | 只看該作者
我是這樣做的

1893878478.jpg (689.05 KB, 下載次數(shù): 40)

1893878478.jpg

1894796573.jpg (454.72 KB, 下載次數(shù): 56)

1894796573.jpg

1891574732.jpg (132.13 KB, 下載次數(shù): 36)

1891574732.jpg

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

7#
ID:280206 發(fā)表于 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          ;禁止中斷優(yōu)先控制
MOV SCON,A        ;關(guān)閉串行控制
MOV TMOD,A        ;計(jì)數(shù)器控制
MOV TCON,A        ;計(jì)數(shù)器控制
MOV SP,#080H      ;設(shè)置棧底
                   ;
MOV P0,#0FFH      ;顯示劃驅(qū)動低有效
        MOV P2,#0FFH      ;顯示位驅(qū)動,低有效
        MOV P3,#0FFH      ;按鍵,低電平有效
   MOV 21H,#0        ;62.5mS計(jì)數(shù)器
        MOV 22H,#0        ;
MOV 23H,#0        ;秒計(jì)數(shù)暫存位
MOV 24H,#10        ;分計(jì)數(shù)暫存位
MOV 25H,#9        ;時計(jì)數(shù)暫存位
MOV 26H,#2       ;日計(jì)數(shù)暫存位,上電為16
        MOV 27H,#7       ;月計(jì)數(shù)暫存位,上電為7
        MOV 28H,#1        ;星期計(jì)數(shù)器
   CLR 0H            ;時間/日期標(biāo)志,0=時間,1=日期
        MOV 30H,#0        ;
        MOV 31H,#0        ;
        MOV 32H,#0        ;
        MOV 33H,#0H       ;
                          ;設(shè)置定時器0為16位計(jì)數(shù)器方式(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     ;定時/計(jì)數(shù)       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        ;中斷優(yōu)先控制  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里有秒計(jì)數(shù)器
        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      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第一位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ1        ;BIT0為1顯示日期
        MOV B,#10         ;小時計(jì)數(shù)器0-23
        MOV A,25H         ;小時計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        CJNE A,#0,SWW0    ;十位為0不顯示
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D2
XSRQ1:  MOV B,#10         ;月份計(jì)數(shù)器1-12
        MOV A,27H          ;月份計(jì)數(shù)器計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        CJNE A,#0,SWW0    ;十位為0不顯示
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D2
SWW0:   LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.0          ;顯示第一位   
        LCALL YSQ1        ;調(diào)用延時器1
        NOP   
        NOP
        NOP
D2:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第二位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ2        ;BIT0為1顯示日期
        MOV B,#10         ;小時計(jì)數(shù)器0-23
        MOV A,25H          ;小時計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        MOV A,B           ;個位數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.1          ;顯示第二位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D3
XSRQ2:  MOV B,#10         ;月份計(jì)數(shù)器1-12
        MOV A,27H          ;月份計(jì)數(shù)器計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        MOV A,B           ;個位數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.1          ;顯示第二位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP
        NOP
        NOP
D3:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第三位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ3        ;BIT0為1顯示日期
        MOV A,#0BFH        ;中間劃
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.2          ;顯示第三位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D4
XSRQ3:  MOV A,#0F7H       ;下邊劃
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.2          ;顯示第三位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP   
        NOP
        NOP
D4:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第四位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ4        ;BIT0為1顯示日期
        MOV B,#10         ;分位計(jì)數(shù)器0-59
        MOV A,24H          ;分計(jì)數(shù)器
        DIV AB            ;分計(jì)數(shù)器除10,商在A,余數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.3          ;顯示第四位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D5
XSRQ4:  MOV B,#10         ;日期計(jì)數(shù)器1-31
        MOV A,26H          ;日期計(jì)數(shù)器計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        CJNE A,#0,SWW4    ;十位為0不顯示
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.3          ;顯示第四位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D5
SWW4:   LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.3          ;顯示第位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP   
        NOP
        NOP
D5:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第五位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ5         ;BIT0為1顯示日期
        MOV B,#10         ;小時計(jì)數(shù)器0-23
        MOV A,24H          ;小時計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        MOV A,B           ;個位數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.4          ;顯示第五位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D6
XSRQ5:  MOV B,#10         ;月份計(jì)數(shù)器1-12
        MOV A,26H          ;月份計(jì)數(shù)器計(jì)數(shù)器
        DIV AB            ;小時計(jì)數(shù)器除10,商在A,余數(shù)在B
        MOV A,B           ;個位數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.4          ;顯示第五位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP
        NOP
        NOP
D6:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第六位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ6        ;BIT0為1顯示日期
        MOV A,#0BFH        ;中間劃
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.5          ;顯示第六位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D7
XSRQ6:  MOV A,#0F7H       ;下邊劃
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.5          ;顯示第六位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP   
        NOP
        NOP
D7:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第七位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ7        ;BIT0為1顯示日期
        MOV B,#10         ;秒計(jì)數(shù)器0-59
        MOV A,23H          ;秒計(jì)數(shù)器
        DIV AB            ;秒計(jì)數(shù)器除10,商在A,余數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.6          ;顯示第七位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP D8
XSRQ7:  MOV A,#0F7H       ;星期計(jì)數(shù)器
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.6          ;顯示第七位
        LCALL YSQ1        ;調(diào)用延時器1
        NOP
        NOP
D8:     MOV P0,#0FFH      ;關(guān)閉顯示劃驅(qū)動,準(zhǔn)備顯示第八位
        MOV P2,#0FFH      ;關(guān)閉顯示位驅(qū)動
        JB 0,XSRQ8        ;BIT0為1顯示日期
        MOV B,#10         ;秒計(jì)數(shù)器0-59
        MOV A,23H         ;秒計(jì)數(shù)器
        DIV AB            ;秒計(jì)數(shù)器除10,商在A,余數(shù)在B
        MOV A,B           ;個位數(shù)在B
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.7          ;顯示第八位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP XIANSHI
XSRQ8:  MOV A,28H         ;星期計(jì)數(shù)器計(jì)數(shù)器
        LCALL YMQ         ;調(diào)用譯碼器      
        MOV P0,A          ;顯示劃驅(qū)動
        CLR P2.7          ;顯示第八位
        LCALL YSQ1        ;調(diào)用延時器1
        LJMP XIANSHI
        NOP
        NOP
        NOP
        LJMP XIANSHI
        LJMP XIANSHI      
DSQ0:   PUSH PSW          ;程序狀態(tài)字入棧
        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高位重裝入寄存器(每調(diào)整一個數(shù)日誤差1.3824秒)
        SETB TR0          ;啟動定時器0
        INC 21H           ;定時器0的第1計(jì)數(shù)器(62.5mS)
        LCALL S30         ;查詢調(diào)秒按鍵
        MOV A,21H         ;62.5毫秒+1
        CJNE A,#8,P16     ;不到8 半秒則返回
        LCALL AJ          ;到半秒查詢調(diào)時分鍵
        LJMP DSQ0W
P16:    CJNE A,#16,DSQ0W  ;不到整秒時間則返回
        MOV 21H,#0        ;62.5毫秒重新計(jì)數(shù)
        INC 23H           ;分計(jì)數(shù)+1
        LCALL AJ          ;調(diào)用按鍵
        MOV A,23H         ;比較
        CJNE A,#60,DSQ0W ;60秒嗎
        MOV 23H,#0       ;秒重新計(jì)數(shù)
        INC 24H          ;分計(jì)數(shù)
        MOV A,24H         ;
        CJNE A,#60,DSQ0W ;不到時間則返回
        MOV 24H,#0       ;分重新計(jì)數(shù)
        INC 25H          ;小時計(jì)數(shù)
        MOV A,25H         ;
        CJNE A,#24,DSQ0W  ;24嗎
        MOV 25H,#0       ;重新計(jì)數(shù)
        INC 28H          ;星期加1
        MOV A,28H
        CJNE A,#7,RQJS   ;每星期7天 顯示 0 1 2 3 4 5 6
        MOV 28H,#0
RQJS:   INC 26H          ;日期計(jì)數(shù)
   MOV DPTR,#TSZS   ;設(shè)置每月天數(shù)指示
        MOV A,27H        ;把當(dāng)前月數(shù)送A
MOVC A,@A+DPTR   ;讀取該月應(yīng)有天數(shù)
        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           ;程序狀態(tài)字出棧
  POP PSW           ;累加器出棧
       RETI              ;從定時器0中斷返回
        NOP
        NOP   
        NOP
YMQ:    MOV DPTR,#YMSJ    ;設(shè)置譯碼數(shù)據(jù)地址指針
       MOVC A,@A+DPTR    ;讀取譯碼數(shù)據(jù)
        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 ;月中天數(shù)數(shù)據(jù)(+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       ;檢查日期顯示鍵 如有效調(diào)月份
        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       ;檢查日期顯示鍵 如有效調(diào)月份
        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   ;設(shè)置每月天數(shù)指示
        MOV A,27H        ;把當(dāng)前月數(shù)送A
MOVC A,@A+DPTR   ;讀取該月應(yīng)有天數(shù)
        DEC A
        CJNE A,26H,XYDQY ;比較,如相等,滿月了,
        MOV 26H,#1        ;12+1=1
        RET
XYDQY:  INC 26H            ;
        RET
        RET
        RET                ;
S3:     JNB P3.2,S34       ;檢查日期顯示鍵 如有效調(diào)月份
        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      ;檢查日期顯示鍵 如有效調(diào)月份
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          ;分計(jì)數(shù)
        MOV A,24H         ;
        CJNE A,#60,AJFH  ;不到時間則返回
        MOV 24H,#0       ;分重新計(jì)數(shù)
        INC 25H          ;小時計(jì)數(shù)                    ;
AJFH:   RET
        NOP
        RET
        RET
        RET                ;
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        NOP
        END

回復(fù)

使用道具 舉報(bào)

8#
ID:364810 發(fā)表于 2018-7-4 14:45 | 只看該作者
先通過按鍵加減來設(shè)置好變量參數(shù),然后將數(shù)值通過寫入函數(shù)寫入時鐘芯片
回復(fù)

使用道具 舉報(bào)

9#
ID:358998 發(fā)表于 2018-7-4 14:49 | 只看該作者
按鍵 長按 觸發(fā) 功能 是怎么完成的
回復(fù)

使用道具 舉報(bào)

10#
ID:16255 發(fā)表于 2018-7-4 14:55 | 只看該作者

評分

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

查看全部評分

回復(fù)

使用道具 舉報(bào)

11#
ID:365230 發(fā)表于 2018-7-4 22:46 | 只看該作者
同求個電子鐘程序
回復(fù)

使用道具 舉報(bào)

12#
ID:280206 發(fā)表于 2018-7-5 14:12 | 只看該作者
回復(fù)11樓 求知心  ,7樓是完整的51系列單片機(jī)作時鐘的程序,用兩組端口掃描方式驅(qū)動8只數(shù)碼管,用四個端口作校時控制,利用內(nèi)部定時器0,分頻定時,中斷計(jì)數(shù),程序支持8051系列40腳的系列,我用的是STC12C560S2,試驗(yàn)通過,日誤差能控制到0.125秒
回復(fù)

使用道具 舉報(bào)

13#
ID:363756 發(fā)表于 2018-7-5 14:33 | 只看該作者
寫一個延時函數(shù)通過按鍵改變延時函數(shù)參數(shù)就行
回復(fù)

使用道具 舉報(bào)

14#
ID:111634 發(fā)表于 2018-7-7 16:14 | 只看該作者
實(shí)例94  模擬電子鐘(由80C51定時器產(chǎn)生秒時基)
Proteus仿真一下,確認(rèn)有效。
實(shí)例94 模擬電子鐘(由80C51定時器產(chǎn)生秒時基).rar (43.05 KB, 下載次數(shù): 5)

以上摘自張志良編著《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ì)說明,程序語句條條有注解
回復(fù)

使用道具 舉報(bào)

15#
ID:111634 發(fā)表于 2018-7-7 16:16 | 只看該作者
本帖最后由 zl2168 于 2018-7-7 16:21 編輯

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

以上摘自張志良編著《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ù) 1黑幣 +5 收起 理由
樂呵呵的小鵬 + 5

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲手机在线 | 久久99精品久久久 | 91亚洲精品在线观看 | 精品综合 | 欧美一卡二卡在线观看 | 日本久久一区二区三区 | 精品久久久久久久久久久久 | 精品无码久久久久久久动漫 | 日韩在线免费播放 | 亚洲婷婷一区 | 激情欧美日韩一区二区 | 亚洲欧美日韩精品久久亚洲区 | 国产成人一区二区 | 久久久xx| 中国黄色毛片视频 | 欧美区在线| 国产福利网站 | 国产乱码精品一区二区三区中文 | 国产一区二区三区久久久久久久久 | 国产精品福利在线 | 亚洲伊人久久综合 | 久久亚洲精品国产精品紫薇 | 国产美女视频黄a视频免费 国产精品福利视频 | 国产在线观看一区二区 | 国产伦精品一区二区三区四区视频 | 国产日韩欧美精品一区二区三区 | 国产激情91久久精品导航 | 亚洲一区播放 | 国产情侣久久 | 欧美激情视频网站 | 天天插天天射天天干 | 在线免费观看日本视频 | 一级黄色片一级黄色片 | 亚洲一页 | 91在线精品一区二区 | 欧美色综合 | 狠狠久久综合 | 精品久久电影 | 中日韩毛片 | 91亚洲国产精品 | 亚洲精品九九 |