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

標題: 怎樣可以利用DS1302的時鐘進行開機時間累計 [打印本頁]

作者: 君工創    時間: 2023-11-18 14:18
標題: 怎樣可以利用DS1302的時鐘進行開機時間累計
怎樣可以利用DS1302的時鐘進行開機時間累計,開機時間累計,關機時間不累計。
作者: jlslwh    時間: 2023-11-18 15:39
不一定非得用DS1302,累計開機時間關鍵是得有低電壓中斷在關機前記錄累計的時間,在開機時繼續累計時間,要是用DS1302可以利用掉電不易失的RAM儲存累計時間。低電壓中斷是必須得用的。
作者: XLinliY.Zhang    時間: 2023-11-18 16:21
簡單的方法:開機后給1302輸出32.768KHz的時鐘信號
復雜的方法:開啟后開啟1302振蕩器,當主控電壓小于某個值或者檢測到關機信號,關閉1302振蕩器
作者: 君工創    時間: 2023-11-18 17:01
時鐘是一直運行的。
作者: wulin    時間: 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. }
復制代碼

作者: 君工創    時間: 2023-11-18 22:07
wulin 發表于 2023-11-18 17:06
這是一款掉電中斷保存數據到EEPROM的測試程序,最長時間99小時59分59秒,修改后時間記錄可以無限長。時鐘源 ...

謝謝你的回復,我就是想利用一直運行的DS1302的秒信號進行計時,DS1302時鐘不變。只是不知道怎樣寫可以利用到鈔信號或者分信號。
作者: qsssuv    時間: 2023-11-18 23:00
可以利用MCU的低壓中斷,存儲運行時間。下次上電讀取運行時間,繼續走時。
作者: wulin    時間: 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++;
        }
作者: 1534545848    時間: 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
作者: 君工創    時間: 2023-11-19 11:27
wulin 發表于 2023-11-19 07:18
一般讀DS1302的周期小于1秒,當前讀到DS1302的秒數與上一次讀到DS1302的秒數比較,如相同則表示沒有變化 ...

非常感謝你的指導,按照你的方法,成功了。之前不成功是因為在if(.......)前面保存sign=sec.照你的方法,只在if(){sign=sec;}的大括號內保存秒(sign=sec;).
作者: Hephaestus    時間: 2023-11-19 16:53
wulin 發表于 2023-11-18 17:06
這是一款掉電中斷保存數據到EEPROM的測試程序,最長時間99小時59分59秒,修改后時間記錄可以無限長。時鐘源 ...

1302自帶NVRAM,根本就不需要EEPROM。
作者: hi等你    時間: 2023-11-20 09:36
Hephaestus 發表于 2023-11-19 16:53
1302自帶NVRAM,根本就不需要EEPROM。

說的對,1302自帶電存儲單元,可以像寫入時鐘數據一樣存儲字節,樓上顯然沒用過1302,不了解
作者: coody_sz    時間: 2023-11-20 17:13
DS1302有SRAM,將開機時間存儲在里面即可。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产成人+综合亚洲+天堂 | 中国黄色一级片 | 中文字幕一区二区三区乱码 | 精品一区二区三区视频 | 91午夜理伦私人影院 | 国产午夜三级一区二区三 | 亚洲福利在线观看 | 激情五月综合色婷婷一区二区 | 成人午夜视频在线观看 | 五月婷婷综合激情 | 91精品91久久久中77777 | 精品视频免费在线观看 | 日韩精品久久久久久 | 国产资源视频 | 亚洲三级视频在线观看 | 国产精品免费一区 | 亚洲一区二区三区在线 | 日韩中文字幕精品 | 成人黄性视频 | 婷婷在线视频 | 国产人成一区二区三区影院 | 久久99精品久久久久久琪琪 | 国产做受视频 | 亚洲欧美成人 | 亚洲最大黄色 | 在线天堂av | 亚洲天堂久久久 | 理论片中文字幕 | 蜜桃在线观看视频 | 国产高清免费 | 国产中文| 亚洲精品播放 | 性色av浪潮av | 亚洲黄色在线 | 中文日韩欧美 | 日韩欧美国产精品 | 丁香午夜 | 国产成年人视频 | 在线观看不卡av | 欧美91 | 一区二区三区在线看 |