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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1949|回復: 12
收起左側

怎樣可以利用DS1302的時鐘進行開機時間累計

[復制鏈接]
ID:965189 發表于 2023-11-18 14:18 | 顯示全部樓層 |閱讀模式
怎樣可以利用DS1302的時鐘進行開機時間累計,開機時間累計,關機時間不累計。
回復

使用道具 舉報

ID:1089601 發表于 2023-11-18 15:39 | 顯示全部樓層
不一定非得用DS1302,累計開機時間關鍵是得有低電壓中斷在關機前記錄累計的時間,在開機時繼續累計時間,要是用DS1302可以利用掉電不易失的RAM儲存累計時間。低電壓中斷是必須得用的。
回復

使用道具 舉報

ID:771630 發表于 2023-11-18 16:21 | 顯示全部樓層
簡單的方法:開機后給1302輸出32.768KHz的時鐘信號
復雜的方法:開啟后開啟1302振蕩器,當主控電壓小于某個值或者檢測到關機信號,關閉1302振蕩器
回復

使用道具 舉報

ID:965189 發表于 2023-11-18 17:01 | 顯示全部樓層
時鐘是一直運行的。
回復

使用道具 舉報

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

  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)//如果首次上電沒有保存過數據
  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);//擦除上次保存的數據為本次掉電做準備
  69.         PCON &= 0xDF;//清0掉電標志
  70.         ELVD = 1;//開低壓中斷
  71.         EA   = 1;//開總中斷

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

  73.         while(1)
  74.         {
  75.                 if(TF0)//查詢T0中斷請求標志
  76.                 {               
  77.                         TF0=0;//T0中斷請求標志清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;//加點
  96.                         dis_buf[2]=table[min/10];
  97.                         dis_buf[3]=table[min%10]|0x80;//加點
  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.                 }//耗時569us
  105.         }
  106. }

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

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

  175.         EA = 0;                                                //關閉總中斷
  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);//寫數據到EEPROM
  185.         IapProgramByte(IAP_ADDRESS+1,min);
  186.         IapProgramByte(IAP_ADDRESS+2,sec);
  187.         while((PCON & 0x20) != 0)         //復查低壓標志
  188.         {
  189.                 PCON &= 0xDF;                  //清除低壓標志
  190.                 _nop_();               
  191.                 _nop_();                            //坐等掉電
  192.         }
  193.         IAP_CONTR = 0x20;                 //發現是誤報,重啟單片機,恢復正常工作
  194. }
復制代碼

評分

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

查看全部評分

回復

使用道具 舉報

ID:965189 發表于 2023-11-18 22:07 | 顯示全部樓層
wulin 發表于 2023-11-18 17:06
這是一款掉電中斷保存數據到EEPROM的測試程序,最長時間99小時59分59秒,修改后時間記錄可以無限長。時鐘源 ...

謝謝你的回復,我就是想利用一直運行的DS1302的秒信號進行計時,DS1302時鐘不變。只是不知道怎樣寫可以利用到鈔信號或者分信號。
回復

使用道具 舉報

ID:353115 發表于 2023-11-18 23:00 | 顯示全部樓層
可以利用MCU的低壓中斷,存儲運行時間。下次上電讀取運行時間,繼續走時。
回復

使用道具 舉報

ID:213173 發表于 2023-11-19 07:18 | 顯示全部樓層
君工創 發表于 2023-11-18 22:07
謝謝你的回復,我就是想利用一直運行的DS1302的秒信號進行計時,DS1302時鐘不變。只是不知道怎樣寫可以利 ...

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

使用道具 舉報

ID:140275 發表于 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
回復

使用道具 舉報

ID:965189 發表于 2023-11-19 11:27 | 顯示全部樓層
wulin 發表于 2023-11-19 07:18
一般讀DS1302的周期小于1秒,當前讀到DS1302的秒數與上一次讀到DS1302的秒數比較,如相同則表示沒有變化 ...

非常感謝你的指導,按照你的方法,成功了。之前不成功是因為在if(.......)前面保存sign=sec.照你的方法,只在if(){sign=sec;}的大括號內保存秒(sign=sec;).
回復

使用道具 舉報

ID:883242 發表于 2023-11-19 16:53 | 顯示全部樓層
wulin 發表于 2023-11-18 17:06
這是一款掉電中斷保存數據到EEPROM的測試程序,最長時間99小時59分59秒,修改后時間記錄可以無限長。時鐘源 ...

1302自帶NVRAM,根本就不需要EEPROM。
回復

使用道具 舉報

ID:996773 發表于 2023-11-20 09:36 | 顯示全部樓層
Hephaestus 發表于 2023-11-19 16:53
1302自帶NVRAM,根本就不需要EEPROM。

說的對,1302自帶電存儲單元,可以像寫入時鐘數據一樣存儲字節,樓上顯然沒用過1302,不了解
回復

使用道具 舉報

ID:1034262 發表于 2023-11-20 17:13 | 顯示全部樓層
DS1302有SRAM,將開機時間存儲在里面即可。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一二三区视频 | 亚洲视频网| 天堂中文在线观看 | 精品国产乱码久久久久久蜜臀 | 日韩视频在线播放 | 欧美精品综合在线 | 伊人久久综合 | 欧美一级片久久 | 久久久国产一区二区三区 | a级毛片毛片免费观看久潮喷 | 91久久| 91亚洲国产精品 | 国产精品视频入口 | 久在线视频 | 亚洲v日韩v综合v精品v | 欧美成人aaa级毛片在线视频 | 成人免费淫片aa视频免费 | 亚洲欧洲综合av | 91精品国产高清久久久久久久久 | 日本 欧美 国产 | 亚洲 中文 欧美 | 日日综合 | 久久国产香蕉 | 一级免费毛片 | 酒色成人网 | 久久精品视频9 | 久久久精品亚洲 | 欧美xxxx在线| 精品国产一区二区三区性色av | 亚洲成人999 | 亚洲精品v日韩精品 | 狠狠躁躁夜夜躁波多野结依 | 国产网站在线播放 | 国产精品成人一区二区三区 | 精品无码久久久久久国产 | 91九色在线观看 | 欧美在线一区二区视频 | 国产精品美女久久久久aⅴ国产馆 | 国产精品视屏 | 99精品观看 | 日韩视频一区在线观看 |