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

QQ登錄

只需一步,快速開始

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

六位數(shù)碼管單片機(jī)時(shí)鐘用一次不關(guān)機(jī)就有記憶 掉電就沒有記憶,現(xiàn)在想增加1302時(shí)鐘

[復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 10 黑幣 回復(fù)本帖可獲得 10 黑幣獎(jiǎng)勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
ID:17109 發(fā)表于 2021-12-19 11:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
六位數(shù)碼管單片機(jī)時(shí)鐘用一次不關(guān)機(jī)就有記憶   掉電就沒有記憶,現(xiàn)在想增加1302時(shí)鐘芯片保存記憶,提供源程序給有這方面的師博看看什樣增加1302的程序,修改上傳看看謝謝
/*====================================================================
  調(diào)試要求:
  1.MCU:AT89S52芯片或AT89C52
  2.晶振:12MHz
  功能:?jiǎn)?dòng)芯片內(nèi)部計(jì)時(shí)
====================================================================*/
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit    dis_bit1=P3^2;//定義數(shù)碼管控制口
sbit    dis_bit2=P3^3;//定義數(shù)碼管控制口
sbit    dis_bit3=P3^4;//定義數(shù)碼管控制口
sbit    dis_bit4=P3^5;//定義數(shù)碼管控制口
sbit    dis_bit5=P3^6;//定義數(shù)碼管控制口
sbit    dis_bit6=P3^7;//定義數(shù)碼管控制口
sbit    led1_bit=P2^5;//定時(shí)LED的控制口
sbit    led2_bit=P2^6;//定時(shí)LED的控制口
sbit    s1_bit=P2^0;  //定義S1控制口
sbit    s2_bit=P2^1;  //定義S2控制口
sbit    s3_bit=P2^2;  //定義S3控制口
sbit    speak=P2^7;   //定義蜂鳴器控制口
#define smg_data    P1//定義數(shù)碼管數(shù)據(jù)口


void  delay_50us(uint t);//延時(shí)50*T微妙函數(shù)的聲明
void  display1(uchar dis_data);//數(shù)碼管1顯示子程序
void  display2(uchar dis_data);//數(shù)碼管2顯示子程序
void  display3(uchar dis_data);//數(shù)碼管3顯示子程序
void  display4(uchar dis_data);//數(shù)碼管4顯示子程序
void  display5(uchar dis_data);//數(shù)碼管5顯示子程序
void  display6(uchar dis_data);//數(shù)碼管6顯示子程序
void  init_t0();//定時(shí)器0初始化函數(shù)
void  dis_led();//LED處理函數(shù)
void  judge_s1();//S1按鍵處理函數(shù)
void  judge_s2();//S2按鍵處理函數(shù)
void  judge_s3();//S3按鍵處理函數(shù)
void  dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1);//顯示子程序
void  dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san);//閃爍顯示子程序
void  judge_dis();//顯示處理函數(shù)
void  judge_clock();//顯示處理函數(shù)
//共陽數(shù)碼管斷碼表
const unsigned char tabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
                               // 0  1    2    3    4    5
                               0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
                              //6   7     8    9     E    T   B
                                    0xc6,0xa1,0x8e,0xb6};
                              //    C     D    F    三

uchar t0_crycle;
uchar hour_count,minute_count,second_count,msecond_count;
uchar clock_hour,clock_minute;
uchar clock_en;//鬧鐘關(guān)閉和開啟的標(biāo)志,1開啟,0關(guān)閉
uchar flag1,zancun1,zancun2,zancun3;//,flag2;
uchar clock_flag;
uint  speak_count;
//主程序
void main()
{
    P3=0x00;
    flag1=0;   
    zancun3=0;
    speak=1;//關(guān)閉蜂鳴器
    speak_count=0;
    clock_hour=0;
    clock_minute=0;
    clock_flag=0;

    clock_en=0;//開機(jī)時(shí)默認(rèn)關(guān)閉鬧鐘
    init_t0();
    TR0=1;//
   //接下來開始編寫讓數(shù)碼管顯示的程序
    while(1)
    {
      judge_dis();//顯示處理
      judge_s1();
      judge_s2();
      judge_s3();
      judge_clock();//鬧鐘處理程序
    }
}
void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0_crycle++;
        if(t0_crycle==2)// 0.1秒
        {
          t0_crycle=0;
          msecond_count++;
      if(msecond_count==10)//1秒
      {
        msecond_count=0;
        second_count++;
        if(second_count==60)
        {
          second_count=0;
          minute_count++;
          if(minute_count==60)
          {
            minute_count=0;
            hour_count++;
            if(hour_count==24)
            {
              hour_count=0;
            }
          }
        }
      }   
        }
}
//**************************************************
//顯示處理函數(shù)
void  judge_dis()
{     
    if(flag1==0)
    {
      dis(hour_count/10,hour_count%10,minute_count/10,minute_count%10,second_count/10,second_count%10);
      dis_led();
    }
    if(flag1!=0)
    {
       switch(flag1)
       {
           case 1:
                dis(5,10,11,1,12,12);//顯示SET1
                led1_bit=1;
                led2_bit=1;
                break;
           case 2:
                dis(5,10,11,2,12,12);//顯示SET2
                break;
           case 3:
                dis(5,10,11,3,12,12);//顯示SET3
                break;
           case 4:
                dis(5,10,11,4,12,12);//顯示SET4
                break;
           case 5:
                dis(5,10,11,5,12,12);//顯示SET5
                break;
           case 6:
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,1);
                break;
           case 7:
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,2);
                break;
           case 8:
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,3);
                break;
           case 9://進(jìn)入修改時(shí)間,時(shí)間分位個(gè)位閃爍
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,12,4);
                break;
           case 10://進(jìn)入修改鬧鐘,鬧鐘小時(shí)十位閃爍
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,1);
                break;
           case 11://進(jìn)入修改鬧鐘,鬧鐘小時(shí)個(gè)位閃爍
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,2);
                break;
           case 12://進(jìn)入修改鬧鐘,鬧鐘小時(shí)十位閃爍
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,3);
                break;
           case 13://進(jìn)入修改鬧鐘,鬧鐘小時(shí)個(gè)位閃爍
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,4);
                break;
           case 14://進(jìn)入修改鬧鐘的開關(guān)
                dis_san(zancun1/10,zancun1%10,zancun2/10,zancun2%10,12,zancun3,6);
                break;
           default:
                break;
        }
    }
}
//**************************************************
//S1按鍵處理函數(shù)
void  judge_s1()
{
    s1_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
    if(s1_bit==0)//判斷是否有按鍵按下
    {
        delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
        if(s1_bit==0)
        {
           switch(flag1)
           {
               case 0:
                    flag1=1;
                    break;
               case 1:
                    flag1=2;
                    break;
               case 2:
                    flag1=3;
                    break;
               case 3:
                    flag1=4;
                    break;
               case 4:
                    flag1=5;
                    break;
               case 5:
                    flag1=0;
                    break;
               case 6://在修改時(shí)間小時(shí)十位下按S1鍵
                    flag1=7;
                    break;
               case 7:
                    flag1=8;
                    break;
               case 8:
                    flag1=9;
                    break;
               case 9:
                    flag1=6;
                    break;
               case 10:
                    flag1=11;
                    break;
               case 11:
                    flag1=12;
                    break;
               case 12:
                    flag1=13;
                    break;
               case 13:
                    flag1=14;
                    break;
               case 14:
                    flag1=10;
                    break;
               default:
                    break;
           }           
           while(s1_bit==0)
           {
              judge_dis();
           }//等待按鍵釋放
        }
    }
}
//**************************************************
//S2按鍵處理函數(shù)
void  judge_s2()
{
    s2_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
    if(s2_bit==0)//判斷是否有按鍵按下
    {
        delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
        if(s2_bit==0)
        {
           switch (flag1)
           {
              case 1: //在顯示SET1狀態(tài)下按S2件,進(jìn)入修改時(shí)間
                 flag1=6;
                 zancun1=hour_count;
                 zancun2=minute_count;
                 break;
              case 2://在顯示SET2狀態(tài)下按S2,進(jìn)入設(shè)置鬧鐘
                 zancun1=clock_hour;
                 zancun2=clock_minute;
                 flag1=10;
                 break;
              case 6://修改時(shí)鐘小時(shí)十位狀態(tài)下按S2件
                 hour_count=zancun1;
                 minute_count=zancun2;
                 second_count=0;
                 flag1=0;
                 break;
              case 7://修改時(shí)鐘小時(shí)個(gè)位狀態(tài)下按S2件
                 hour_count=zancun1;
                 minute_count=zancun2;
                 second_count=0;
                 flag1=0;
                 break;
              case 8://修改時(shí)鐘分鐘十位狀態(tài)下按S2件
                 hour_count=zancun1;
                 minute_count=zancun2;
                 second_count=0;
                 flag1=0;
                 break;
              case 9://修改時(shí)鐘分鐘個(gè)位狀態(tài)下按S2件
                 hour_count=zancun1;
                 minute_count=zancun2;
                 second_count=0;
                 flag1=0;
                 break;
              case 10:
                 clock_hour=zancun1;
                 clock_minute=zancun2;
                 clock_en=zancun3;
                 flag1=0;
                 break;
              case 11:
                 clock_hour=zancun1;
                 clock_minute=zancun2;
                 clock_en=zancun3;
                 flag1=0;
                 break;
              case 12:
                 clock_hour=zancun1;
                 clock_minute=zancun2;
                 clock_en=zancun3;
                 flag1=0;
                 break;
              case 13:
                 clock_hour=zancun1;
                 clock_minute=zancun2;
                 clock_en=zancun3;
                 flag1=0;
                 break;
              case 14:
                 clock_hour=zancun1;
                 clock_minute=zancun2;
                 clock_en=zancun3;
                 flag1=0;
                 break;
              default:
                 break;

           }   
           while(s2_bit==0)
           {
              judge_dis();
           }//等待按鍵釋放
        }
    }
}
//**************************************************
//S3按鍵處理函數(shù)
void  judge_s3()
{
    s3_bit=1;//置IO為1,準(zhǔn)備讀入收據(jù)
    if(s3_bit==0)//判斷是否有按鍵按下
    {
        delay_50us(1);// 延時(shí),去除機(jī)械抖動(dòng)
        if(s3_bit==0)
        {
           switch (flag1)
           {

              case 6://修改時(shí)間小時(shí)的十位數(shù)
                 zancun1+=10;
                 if(zancun1>=24)zancun1=zancun1%10;
                 break;
              case 7://修改時(shí)間小時(shí)的個(gè)位數(shù)
                 zancun1=zancun1/10*10+(zancun1%10+1)%10;
                 if(zancun1>=24)zancun1=20;
                 break;
              case 8://修改時(shí)間分鐘的十位數(shù)
                 zancun2+=10;
                 if(zancun2>=60)zancun2-=60;
                 break;
              case 9://修改時(shí)間分鐘的個(gè)位數(shù)
                 zancun2=zancun2/10*10+(zancun2%10+1)%10;
                 break;
              case 10://修改鬧鐘小時(shí)的十位數(shù)
                 zancun1+=10;
                 if(zancun1>=24)zancun1=zancun1%10;
                 break;
              case 11://修改鬧鐘小時(shí)的個(gè)位數(shù)
                 zancun1=zancun1/10*10+(zancun1%10+1)%10;
                 if(zancun1>=24)zancun1=20;
                 break;
              case 12://修改鬧鐘分鐘的十位數(shù)
                 zancun2+=10;
                 if(zancun2>=60)zancun2-=60;
                 break;
              case 13://修改鬧鐘分鐘的個(gè)位數(shù)
                 zancun2=zancun2/10*10+(zancun2%10+1)%10;
                 break;
              case 14:
                 zancun3^=1;
                 break;
              default:
                 break;

           }   
           while(s3_bit==0)
           {
              judge_dis();
           }//等待按鍵釋放
        }
    }
}
//****************************************
//顯示處理函數(shù)
void  judge_clock()
{
    if(clock_hour==hour_count && clock_minute==minute_count)
    {
         if(clock_en==1 && clock_flag==0)
         {         
              speak_count=0;//開啟蜂鳴器
              clock_flag=1;
              speak_count=0;
         }
    }
    else
    {
     clock_flag=0;
    }
    if(clock_flag==1 && speak_count<400)
    {

        if(msecond_count<=5)
        {
           speak=0;
           speak_count++;
        }
        else
        {
          speak=1;

        }
    }
    else
    {
        speak=1;
    }
}
//****************************************
////閃爍顯示子程序
void  dis_san(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1,uchar san)
{   
     if(san==1)
     {
        if(msecond_count<5)
        {
           display1(s6);
        }
     }
     else
     {
         display1(s6);
     }
     if(san==2)
     {
        if(msecond_count<5)
        {
           display2(s5);
        }
     }
     else
     {
         display2(s5);
     }
     if(san==3)
     {
        if(msecond_count<5)
        {
           display3(s4);
        }
     }
     else
     {
         display3(s4);
     }
     if(san==4)
     {
        if(msecond_count<5)
        {
           display4(s3);
        }
     }
     else
     {
         display4(s3);
     }
     if(san==6)
     {
        if(msecond_count<5)
        {
           display6(s1);
        }
     }
     else
     {
         display6(s1);
     }
     display5(s2);
    // display6(s1);
}
//****************************************
//時(shí)鐘顯示程序
void  dis(uchar s6,uchar s5,uchar s4,uchar s3,uchar s2,uchar s1)
{
     display1(s6);
     display2(s5);
     display3(s4);
     display4(s3);
     display5(s2);
     display6(s1);
}
//********************************************************************************************
void init_t0()
{
           TMOD=0x01;//設(shè)定定時(shí)器工作方式1,定時(shí)器定時(shí)50毫秒
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;//開總中斷
        ET0=1;//允許定時(shí)器0中斷
        t0_crycle=0;//定時(shí)器中斷次數(shù)計(jì)數(shù)單元
}
//**************************************************
//LED處理函數(shù)
void  dis_led()
{
     if(msecond_count<5)
     {
         led1_bit=1;
         led2_bit=1;
     }
     else
     {
         led1_bit=0;
         led2_bit=0;
     }
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display6(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit6=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit6=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display5(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit5=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit5=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display4(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit4=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit4=1;
}//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display3(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit3=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit3=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display1(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit1=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit1=1;
}
//***************************************************************
//功能:把數(shù)據(jù)1顯示在數(shù)碼管1上
void display2(uchar dis_data)
{  
   smg_data=tabl1[dis_data];//送顯示斷碼
   dis_bit2=0;//鎖存數(shù)據(jù)
   delay_50us(40);
   dis_bit2=1;
}
//**************************************************************************************************
//函數(shù)名稱:void delay_50US(unsigned int t)
//功能: 延時(shí)50*t(us)
void delay_50us(uint t)
{
  unsigned char j;
  for(;t>0;t--)
  {
    for(j=19;j>0;j--);
  }
}

單片機(jī)校時(shí)和鬧鐘.rar

33.29 KB, 下載次數(shù): 9

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:96682 發(fā)表于 2021-12-19 12:36 來自手機(jī) | 只看該作者
1302 是靠鈕扣電池維持時(shí)間,樓主的代碼是用單片機(jī)定時(shí)器和 1302 沒半點(diǎn)關(guān)系
回復(fù)

使用道具 舉報(bào)

板凳
ID:908826 發(fā)表于 2021-12-19 15:53 | 只看該作者
1302某一個(gè)寶買一個(gè),店家提供程序,要是要求精度最好還是3231.
回復(fù)

使用道具 舉報(bào)

地板
ID:17109 發(fā)表于 2021-12-19 15:55 來自手機(jī) | 只看該作者
wc86110 發(fā)表于 2021-12-19 12:36
1302 是靠鈕扣電池維持時(shí)間,樓主的代碼是用單片機(jī)定時(shí)器和 1302 沒半點(diǎn)關(guān)系

就是定時(shí)器沒有記憶,就是想換成1302可以修改一下嗎謝謝
回復(fù)

使用道具 舉報(bào)

5#
ID:883242 發(fā)表于 2021-12-19 15:55 | 只看該作者
1302假貨太多了,因?yàn)檫@個(gè)耽誤時(shí)間毫無意義,建議買DS3231。
回復(fù)

使用道具 舉報(bào)

6#
ID:17109 發(fā)表于 2021-12-19 15:57 來自手機(jī) | 只看該作者
13205495918 發(fā)表于 2021-12-19 15:53
1302某一個(gè)寶買一個(gè),店家提供程序,要是要求精度最好還是3231.

這個(gè)程序可以改成1302嗎?謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:17109 發(fā)表于 2021-12-19 16:21 | 只看該作者
13205495918 發(fā)表于 2021-12-19 15:53
1302某一個(gè)寶買一個(gè),店家提供程序,要是要求精度最好還是3231.

可以改成3231可以嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:211814 發(fā)表于 2021-12-19 17:41 | 只看該作者
你現(xiàn)在的時(shí)間是有定時(shí)器中斷產(chǎn)生的,  用什么時(shí)鐘芯片,就去找相關(guān)的程序把時(shí)間讀出來給顯示就可以了
回復(fù)

使用道具 舉報(bào)

9#
ID:993066 發(fā)表于 2021-12-19 19:32 | 只看該作者
個(gè)人建議3231,或者直接加個(gè)紐扣電池供電基本把不用考慮掉電丟失問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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