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

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

QQ登錄

只需一步,快速開始

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

怎樣可以利用DS1302的時(shí)鐘進(jìn)行開機(jī)時(shí)間累計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:965189 發(fā)表于 2023-11-18 14:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
怎樣可以利用DS1302的時(shí)鐘進(jìn)行開機(jī)時(shí)間累計(jì),開機(jī)時(shí)間累計(jì),關(guān)機(jī)時(shí)間不累計(jì)。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1089601 發(fā)表于 2023-11-18 15:39 | 只看該作者
不一定非得用DS1302,累計(jì)開機(jī)時(shí)間關(guān)鍵是得有低電壓中斷在關(guān)機(jī)前記錄累計(jì)的時(shí)間,在開機(jī)時(shí)繼續(xù)累計(jì)時(shí)間,要是用DS1302可以利用掉電不易失的RAM儲(chǔ)存累計(jì)時(shí)間。低電壓中斷是必須得用的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:771630 發(fā)表于 2023-11-18 16:21 | 只看該作者
簡單的方法:開機(jī)后給1302輸出32.768KHz的時(shí)鐘信號(hào)
復(fù)雜的方法:開啟后開啟1302振蕩器,當(dāng)主控電壓小于某個(gè)值或者檢測到關(guān)機(jī)信號(hào),關(guān)閉1302振蕩器
回復(fù)

使用道具 舉報(bào)

地板
ID:965189 發(fā)表于 2023-11-18 17:01 | 只看該作者
時(shí)鐘是一直運(yùn)行的。
回復(fù)

使用道具 舉報(bào)

5#
ID:213173 發(fā)表于 2023-11-18 17:06 | 只看該作者
這是一款掉電中斷保存數(shù)據(jù)到EEPROM的測試程序,最長時(shí)間99小時(shí)59分59秒,修改后時(shí)間記錄可以無限長。時(shí)鐘源用的定時(shí)器,樓主改用1302秒信號(hào)即可。特別注意事項(xiàng):測試本示例時(shí),需在ISP下載時(shí)將低壓復(fù)位功能和低壓時(shí)禁止EEPROM操作關(guān)閉。
  1. //測試條件:TX-1C實(shí)驗(yàn)板,MCU型號(hào)IAP15W4K58S4
  2. //注意:測試本示例時(shí),需在ISP下載時(shí)將低壓復(fù)位功能和低壓時(shí)禁止EEPROM操作關(guān)閉
  3. #include <STC15F2K60S2.H>
  4. #include <intrins.h>                                //庫頭文件
  5. #define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
  6. #define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar
  7. //宏定義ISP的操作命令
  8. #define CMD_IDLE    0               //空閑模式
  9. #define CMD_READ    1               //IAP字節(jié)讀命令
  10. #define CMD_PROGRAM 2               //IAP字節(jié)編程命令
  11. #define CMD_ERASE   3               //IAP扇區(qū)擦除命令
  12. #define ENABLE_IAP  0x82            //CPU的等待時(shí)間
  13. #define IAP_ADDRESS 0x0800                        //測試地址
  14. sbit duan=P2^6;
  15. sbit wein=P2^7;
  16. sbit buzzer=P2^3;
  17. //順序共陰極數(shù)碼管段碼表,段碼a-h順序接PX0-PX7
  18. uchar code table[]={//共陰數(shù)碼管段碼"0~f-."
  19.                 0x3f,0x06,0x5b,0x4f,
  20.                 0x66,0x6d,0x7d,0x07,
  21.                 0x7f,0x6f,0x77,0x7c,
  22.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  23. uchar data dis_buf[8];                //緩存數(shù)組
  24. uchar hour,min,sec;
  25. uint num;
  26. uchar i;
  27. uint sign;
  28. void Timer0Init();                                        //定時(shí)器初始化聲明
  29. void IapIdle();                                                //關(guān)閉IAP/EEPROM
  30. uchar IapReadByte(uint addr);                //讀取EEPROM數(shù)據(jù)
  31. void IapProgramByte(uint addr, uchar dat);//寫入EEPROM數(shù)據(jù)
  32. void IapEraseSector(uint addr);                //擦除EEPROM數(shù)據(jù)

  33. void main()                                                        
  34. {
  35.         P0M0 = 0x00;
  36.         P0M1 = 0x00;
  37.         P1M0 = 0x00;
  38.         P1M1 = 0x00;
  39.         P2M0 = 0x00;
  40.         P2M1 = 0x00;
  41.         P3M0 = 0x00;
  42.         P3M1 = 0x00;
  43.         P4M0 = 0x00;
  44.         P4M1 = 0x00;
  45.         P5M0 = 0x00;
  46.         P5M1 = 0x00;
  47.         P6M0 = 0x00;
  48.         P6M1 = 0x00;
  49.         P7M0 = 0x00;
  50.         P7M1 = 0x00;
  51.         if(IapReadByte(IAP_ADDRESS)==0xff)//如果首次上電沒有保存過數(shù)據(jù)
  52.         {
  53.                 for(i=0;i<3;i++)
  54.                 {
  55.                         IapProgramByte(IAP_ADDRESS+i,0x00);//寫0
  56.                 }
  57.                 hour=0;
  58.                 min=0;
  59.                 sec=0;
  60.                 sign=1;
  61.         }
  62.         else
  63.         {
  64.                 hour=IapReadByte(IAP_ADDRESS);
  65.                 min=IapReadByte(IAP_ADDRESS+1);
  66.                 sec=IapReadByte(IAP_ADDRESS+2);
  67.         }
  68.         IapEraseSector(IAP_ADDRESS);//擦除上次保存的數(shù)據(jù)為本次掉電做準(zhǔn)備
  69.         PCON &= 0xDF;//清0掉電標(biāo)志
  70.         ELVD = 1;//開低壓中斷
  71.         EA   = 1;//開總中斷

  72.         Timer0Init();//初始化定時(shí)器

  73.         while(1)
  74.         {
  75.                 if(TF0)//查詢T0中斷請(qǐng)求標(biāo)志
  76.                 {               
  77.                         TF0=0;//T0中斷請(qǐng)求標(biāo)志清0
  78.                         if(++num>=1000)//1秒
  79.                         {
  80.                                 num=0;                                
  81.                                 sec++;
  82.                                 if(++sec>=60)
  83.                                 {
  84.                                         sec=0;
  85.                                         min++;
  86.                                         if(min>=60)
  87.                                         {
  88.                                                 min=0;
  89.                                                 hour++;
  90.                                                 if(hour>99)hour=0;
  91.                                         }
  92.                                 }
  93.                         }
  94.                         dis_buf[0]=table[hour/10];
  95.                         dis_buf[1]=table[hour%10]|0x80;//加點(diǎn)
  96.                         dis_buf[2]=table[min/10];
  97.                         dis_buf[3]=table[min%10]|0x80;//加點(diǎn)
  98.                         dis_buf[4]=table[sec/10];
  99.                         dis_buf[5]=table[sec%10];
  100.                         P0=0x00;duan=1;duan=0;
  101.                         P0=~(0x01<<i);wein=1;wein=0;
  102.                         P0=dis_buf[i];duan=1;duan=0;
  103.                         i=++i%6;
  104.                 }//耗時(shí)569us
  105.         }
  106. }

  107. void Timer0Init(void)        //1毫秒@11.0592MHz
  108. {
  109.         AUXR |= 0x80;                //定時(shí)器時(shí)鐘1T模式
  110.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  111.         TL0 = 0xCD;                        //設(shè)置定時(shí)初始值
  112.         TH0 = 0xD4;                        //設(shè)置定時(shí)初始值
  113.         TF0 = 0;                        //清除TF0標(biāo)志
  114.         TR0 = 1;                        //定時(shí)器0開始計(jì)時(shí)
  115. }
  116. /*----------------------------
  117.         關(guān)閉IAP功能
  118. ----------------------------*/
  119. void IapIdle()
  120. {
  121.     IAP_CONTR = 0;                  //關(guān)閉IAP功能
  122.     IAP_CMD = 0;                    //清除命令寄存器
  123.     IAP_TRIG = 0;                   //清除觸發(fā)寄存器
  124.     IAP_ADDRH = 0x80;               //將地址設(shè)置到非IAP區(qū)域
  125.     IAP_ADDRL = 0;
  126. }
  127. /*----------------------------
  128. 從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
  129. ----------------------------*/
  130. uchar IapReadByte(uint addr)
  131. {
  132.     uchar dat;                       //數(shù)據(jù)緩沖區(qū)

  133.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  134.     IAP_CMD = CMD_READ;             //設(shè)置IAP命令
  135.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  136.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  137.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  138.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  139.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  140.     dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
  141.     IapIdle();                      //關(guān)閉IAP功能
  142.     return dat;                     //返回
  143. }
  144. /*-------------------------------
  145. 寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  146. --------------------------------*/
  147. void IapProgramByte(uint addr, uchar dat)
  148. {
  149.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  150.     IAP_CMD = CMD_PROGRAM;          //設(shè)置IAP命令
  151.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  152.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  153.     IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
  154.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  155.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  156.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  157.     IapIdle();                      //關(guān)閉IAP功能
  158. }
  159. /*----------------------------
  160. ISP/IAP/EEPROM扇區(qū)擦除
  161. ----------------------------*/
  162. void IapEraseSector(uint addr)
  163. {
  164.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  165.     IAP_CMD = CMD_ERASE;            //設(shè)置IAP命令
  166.     IAP_ADDRL = addr;               //設(shè)置IAP低地址
  167.     IAP_ADDRH = addr >> 8;          //設(shè)置IAP高地址
  168.     IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
  169.     IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
  170.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  171.     IapIdle();                      //關(guān)閉IAP功能
  172. }
  173. void PowerLost() interrupt 6
  174. {

  175.         EA = 0;                                                //關(guān)閉總中斷
  176.         P0M1 = 0xff;                                //所有端口高阻
  177.         P1M1 = 0xff;
  178.         P2M1 = 0xff;
  179.         P3M1 = 0xff;
  180.         P4M1 = 0xff;
  181.         P5M1 = 0xff;
  182.         P6M1 = 0xff;
  183.         P7M1 = 0xff;
  184.         IapProgramByte(IAP_ADDRESS,hour);//寫數(shù)據(jù)到EEPROM
  185.         IapProgramByte(IAP_ADDRESS+1,min);
  186.         IapProgramByte(IAP_ADDRESS+2,sec);
  187.         while((PCON & 0x20) != 0)         //復(fù)查低壓標(biāo)志
  188.         {
  189.                 PCON &= 0xDF;                  //清除低壓標(biāo)志
  190.                 _nop_();               
  191.                 _nop_();                            //坐等掉電
  192.         }
  193.         IAP_CONTR = 0x20;                 //發(fā)現(xiàn)是誤報(bào),重啟單片機(jī),恢復(fù)正常工作
  194. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
tianqi911 + 5 絕世好帖!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:965189 發(fā)表于 2023-11-18 22:07 | 只看該作者
wulin 發(fā)表于 2023-11-18 17:06
這是一款掉電中斷保存數(shù)據(jù)到EEPROM的測試程序,最長時(shí)間99小時(shí)59分59秒,修改后時(shí)間記錄可以無限長。時(shí)鐘源 ...

謝謝你的回復(fù),我就是想利用一直運(yùn)行的DS1302的秒信號(hào)進(jìn)行計(jì)時(shí),DS1302時(shí)鐘不變。只是不知道怎樣寫可以利用到鈔信號(hào)或者分信號(hào)。
回復(fù)

使用道具 舉報(bào)

7#
ID:353115 發(fā)表于 2023-11-18 23:00 | 只看該作者
可以利用MCU的低壓中斷,存儲(chǔ)運(yùn)行時(shí)間。下次上電讀取運(yùn)行時(shí)間,繼續(xù)走時(shí)。
回復(fù)

使用道具 舉報(bào)

8#
ID:213173 發(fā)表于 2023-11-19 07:18 | 只看該作者
君工創(chuàng) 發(fā)表于 2023-11-18 22:07
謝謝你的回復(fù),我就是想利用一直運(yùn)行的DS1302的秒信號(hào)進(jìn)行計(jì)時(shí),DS1302時(shí)鐘不變。只是不知道怎樣寫可以利 ...

一般讀DS1302的周期小于1秒,當(dāng)前讀到DS1302的秒數(shù)與上一次讀到DS1302的秒數(shù)比較,如相同則表示沒有變化。不同則表示已走過1秒,保存當(dāng)前秒數(shù),為下一次比較判斷做準(zhǔn)備,累計(jì)數(shù)+1。采用分累計(jì)也是同理。
        if(sign!=sec)
        {
                sign=sec;
                s_count++;
        }
回復(fù)

使用道具 舉報(bào)

9#
ID:140275 發(fā)表于 2023-11-19 10:24 | 只看該作者
本帖最后由 1534545848 于 2023-11-23 07:28 編輯

;****************************************20150523--OK
JISHU0:        INC        48H                ;+1支

        MOV        A,48H
        ANL        A,#0FH
        CJNE        A,#10,RTN0        ;0--9支;;
        ANL        48H,#0F0H
        MOV        A,48H
        ADD        A,#10H
        MOV        48H,A
        ANL        A,#0F0H
        CJNE        A,#0A0H,RTN0        ;0--90支;;
        ANL        48H,#0FH
        INC        49H
        MOV        A,49H
        ANL        A,#0FH
        CJNE        A,#10,RTN0        ;0--900支;;
        ANL        49H,#0F0H
        MOV        A,49H
        ADD        A,#10H
        MOV        49H,A
        ANL        A,#0F0H
        CJNE        A,#0A0H,RTN0        ;0--9000支;;
        ANL        49H,#0FH
        INC        4AH
        MOV        A,4AH
        ANL        A,#0FH
        CJNE        A,#10,RTN0        ;0--90000支;;
        ANL        4AH,#0F0H
        MOV        A,4AH
        ADD        A,#10H
        MOV        4AH,A
        ANL        A,#0F0H
        CJNE        A,#0A0H,RTN0        ;0--900000支;;
        ANL        4AH,#0FH
        INC        4BH
        MOV        A,4BH
        ANL        A,#0FH
        CJNE        A,#10,RTN0        ;0--9000000支;;
        ANL        4BH,#0F0H
        MOV        A,4BH
        ADD        A,#10H
        MOV        4BH,A
        ANL        A,#0F0H
        CJNE        A,#0A0H,RTN0        ;0--90000000支;;
        ANL        4BH,#0FH
        INC        4CH
        MOV        A,4CH
        ANL        A,#0FH
        CJNE        A,#10,RTN0        ;0--900000000支;;
        ANL        4CH,#0F0H
        MOV        A,4CH
        ADD        A,#10H
        MOV        4CH,A
        ANL        A,#0F0H
        CJNE        A,#0A0H,RTN0        ;0--9000000000支;;
        ANL        4CH,#0FH

        RET
回復(fù)

使用道具 舉報(bào)

10#
ID:965189 發(fā)表于 2023-11-19 11:27 | 只看該作者
wulin 發(fā)表于 2023-11-19 07:18
一般讀DS1302的周期小于1秒,當(dāng)前讀到DS1302的秒數(shù)與上一次讀到DS1302的秒數(shù)比較,如相同則表示沒有變化 ...

非常感謝你的指導(dǎo),按照你的方法,成功了。之前不成功是因?yàn)樵趇f(.......)前面保存sign=sec.照你的方法,只在if(){sign=sec;}的大括號(hào)內(nèi)保存秒(sign=sec;).
回復(fù)

使用道具 舉報(bào)

11#
ID:883242 發(fā)表于 2023-11-19 16:53 | 只看該作者
wulin 發(fā)表于 2023-11-18 17:06
這是一款掉電中斷保存數(shù)據(jù)到EEPROM的測試程序,最長時(shí)間99小時(shí)59分59秒,修改后時(shí)間記錄可以無限長。時(shí)鐘源 ...

1302自帶NVRAM,根本就不需要EEPROM。
回復(fù)

使用道具 舉報(bào)

12#
ID:996773 發(fā)表于 2023-11-20 09:36 | 只看該作者
Hephaestus 發(fā)表于 2023-11-19 16:53
1302自帶NVRAM,根本就不需要EEPROM。

說的對(duì),1302自帶電存儲(chǔ)單元,可以像寫入時(shí)鐘數(shù)據(jù)一樣存儲(chǔ)字節(jié),樓上顯然沒用過1302,不了解
回復(fù)

使用道具 舉報(bào)

13#
ID:1034262 發(fā)表于 2023-11-20 17:13 | 只看該作者
DS1302有SRAM,將開機(jī)時(shí)間存儲(chǔ)在里面即可。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久伊人操 | 中文字幕一区二区三区四区五区 | 国产精品一区久久久 | 久久精品欧美一区二区三区麻豆 | 国产伦精品一区二区三区视频金莲 | 欧美影院| 欧美高清免费 | 久久99久久99精品免视看婷婷 | 婷婷久久五月天 | 99精品国产一区二区三区 | 日韩av在线一区 | 日韩国产精品一区二区三区 | 香蕉二区| 天天综合天天 | 97人人澡人人爽91综合色 | 五月天国产视频 | 精品综合久久久 | 久久久精品国产 | 亚洲精品国产电影 | 久久人人爽人人爽 | 久久久久免费 | 国产精品一区三区 | 成人精品国产一区二区4080 | 日韩欧美在线视频播放 | 国产精品日产欧美久久久久 | 国产欧美精品 | 美女日批免费视频 | 欧美一区二区三区在线 | 日韩精品成人一区二区三区视频 | 一区二区三区亚洲精品国 | 久视频在线观看 | 久久一日本道色综合久久 | 亚洲一区二区免费 | 久久精品国产99国产精品 | 欧美日韩在线综合 | 久久精品91| 国产精品毛片av一区 | 国产精品日日夜夜 | 日一区二区 | 成人午夜视频在线观看 | 一级片在线免费播放 |