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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4840|回復: 28
收起左側

STC單片機喚醒定時器時間如何調整?

[復制鏈接]
ID:450037 發表于 2021-11-9 15:59 | 顯示全部樓層 |閱讀模式
捕獲.PNG
捕獲.PNG
捕獲.PNG

如圖:給PCON|0x02時,單片機進入掉電模式,當WKTCH和WKTCL賦值過后,單片機喚醒啟動.

WKTCH最大賦值為0X7F,WKTCL最大賦值為0XFF;
最大賦值運行時為15s,斷電15s后單片機又啟動,請問假如我想斷電一個星期怎么設置,比如山區有一個檢測儀器檢測空氣質量,一個星期只需要檢測一次,那么檢測完的其他時間給單片機斷電,以延長單片機電池的運行時間。

回復

使用道具 舉報

ID:277550 發表于 2021-11-9 17:10 | 顯示全部樓層
a=7*24*60*60= 604800  (秒)
a/15=40320(個周期),一個無符號整數變量,夠用


void main(){
    unsigned int a=0;
    WKTCH=0xff; //包含使能位在內了。
    WKTCL=0xff;
    while(1){
         PCON|=2;
         _nop_(); _nop_(); _nop_(); _nop_();
         if(++a<40320){
             continue;
         }
        //這1個星期了,該干嘛
    }
}
回復

使用道具 舉報

ID:624769 發表于 2021-11-9 17:38 | 顯示全部樓層
你這是STC的手冊,

首先,掉電換醒定時器,非常的不準, 說是32.768K的晶振頻率,實際上,很多在36K左右,我見過最離譜的有38K,都能做紅外載波發生器了。所以,如果你要用這個做長眠的話……,最好做個采樣測試(比如for循環40次,就是理論上的 10分鐘,看看相差多少,再調整一下,妥了之后,乘以1008,就是1個星期了),不然你定1個星期,最后極有可能5天就醒了。
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 08:33 | 顯示全部樓層
devcang 發表于 2021-11-9 17:10
a=7*24*60*60= 604800  (秒)
a/15=40320(個周期),一個無符號整數變量,夠用

我不太懂啊,程序是這樣的,PCON|=2,打開CPU掉電模式,系統喚醒定時器在運行,此時已經運行了無數次WHILE(1)函數,當15S過后,不是立即開啟CPU嗎?為什么會與IF語句做比較呢?
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 10:05 | 顯示全部樓層
188610329 發表于 2021-11-9 17:38
你這是STC的手冊,

首先,掉電換醒定時器,非常的不準, 說是32.768K的晶振頻率,實際上,很多在36K左右 ...

是的,這是STC手冊。那個C8051F020是另外一個項目的。這個STC是我自學的一個開發板上的。我學了看門狗與自啟動這一塊,但是時間上我想能控制多久就多久。按上面一樓寫的程序,沒有運行成功。
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 10:12 來自觸屏版 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-10 10:05
是的,這是STC手冊。那個C8051F020是另外一個項目的。這個STC是我自學的一個開發板上的。我學了看門狗與 ...

你除了定時器喚醒,還打算被其他,比如外部中斷之類的隨時喚醒么?
即,睡了之后,不到一周不起,
還是,如果沒有突發事件,就睡一周,有突發事件就處理,完了之后接著睡,或完了之后重新開始睡一周,這三種情況的哪種?
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 10:53 | 顯示全部樓層
188610329 發表于 2021-11-10 10:12
你除了定時器喚醒,還打算被其他,比如外部中斷之類的隨時喚醒么?
即,睡了之后,不到一周不起,
還是 ...

只被定時器喚醒,定時醒,定時睡,外面打雷下雨不管。按時休息工作。且只被定時器控制
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 11:27 | 顯示全部樓層
188610329 發表于 2021-11-10 10:12
你除了定時器喚醒,還打算被其他,比如外部中斷之類的隨時喚醒么?
即,睡了之后,不到一周不起,
還是 ...

是的,只被定時器喚醒,掉電一個星期后再喚醒,不受其他影響。
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 13:52 | 顯示全部樓層
本帖最后由 188610329 于 2021-11-10 15:36 編輯

先說明一下, 定時喚醒,只能最多睡15秒左右,就會醒,這是硬件限制,沒有辦法,我們能做的,就像逼不愛午睡的小孩午睡,你醒了,我安撫一下,接著再把被子一蒙頭,你給我繼續睡,直到睡夠午睡時間。所以要睡一周,就是反復醒了睡的過程,程序大致如下,你可以參考。實驗時可以改小 i 和 j 的數字。更快的觀察到效果。

void    main()
{
          uchar i,j;
          while(1)
          {
                  LED0 = !LED0; //此處 你需要定期執行的程序, 這里用 翻轉LED0 代替
                  i = 168;   // 一周168小時
                  while(--i)
                  {
                         j = 240;  //每小時有 60分鐘,即 240 個 15秒
                         while(--j)
                         {
                               WKTCH =0xff;       //WKTCL 不需要管,不需要那些雞毛蒜皮的時間
                               PCON  |= 0x02;
                                _nop_();
                               LED2   = !LED2;     //次處用來確定每15秒醒來,正式使用時去掉
                         }
                         LED1  =  !LED1;       //次處用來確定每小時醒來,正式使用時去掉
                  }
          }
}
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 14:33 | 顯示全部樓層
188610329 發表于 2021-11-10 13:52
先說明一下, 定時喚醒,只能最多睡15秒左右,就會醒,這是硬件限制,沒有辦法,我們能做的,就像逼不愛午 ...

捕獲.PNG
不行啊,我先用J=5測試了一下,意思是一分鐘之后就讓他重啟,但是它根本啟動不了,我的理解是當斷電后,喚醒定時器到時間重啟單片機,單片機又重新開始運行,所以J始終是從5開始減到4,連3都沒有減到,一直循環著。所以我在想有沒有什么斷電寄存器能把值保存一下,比如EEPRAM等,就是這個程序不會寫。
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 15:00 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-10 14:33
不行啊,我先用J=5測試了一下,意思是一分鐘之后就讓他重啟,但是它根本啟動不了,我的理解是當斷電后 ...

首先,掉電,不是斷電,掉電是指,單片機進入不怎么用電的狀態,單片機本身還是通著電的,所以不需要Eeprom之類的保存任何東西,內存里的東西不會丟失,其次,都說了,先加個LED觀察狀態,你這代碼唯獨沒有觀察狀態,你怎么知道掉電成功沒成功?
到時間,是從 PCON = 0x02 下一句開始執行,不存在重新開始執行。

最后,你說讓 j= 5; 那么 j=5 在哪里? 你看看我給你的代碼 j = 240; 在什么地方? 改動代碼前,你是不是應該先對代碼進行理解?
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 15:37 | 顯示全部樓層
188610329 發表于 2021-11-10 15:00
首先,掉電,不是斷電,掉電是指,單片機進入不怎么用電的狀態,單片機本身還是通著電的,所以不需要Eepr ...

捕獲.PNG
我剛剛把j=5放在mian函數最上面的,現在把它放到while函數里面,加了個LED翻轉顯示燈,還是不行,j=5運行時實際一直在翻轉著。根本沒有走出while函數
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 15:43 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-10 15:37
我剛剛把j=5放在mian函數最上面的,現在把它放到while函數里面,加了個LED翻轉顯示燈,還是不行,j=5運 ...

對的,永遠不會走出 while(1)的,所以,我是讓你把定期運行的代碼放在 while(1) 里面的最上方的,代替LED0的位置的。
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 15:45 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-10 15:37
我剛剛把j=5放在mian函數最上面的,現在把它放到while函數里面,加了個LED翻轉顯示燈,還是不行,j=5運 ...

換句說,加了一個星期 掉電喚醒的 while(1)  一個星期只會循環一次。這么說,理解了沒?
回復

使用道具 舉報

ID:450037 發表于 2021-11-10 15:53 | 顯示全部樓層
188610329 發表于 2021-11-10 15:45
換句說,加了一個星期 掉電喚醒的 while(1)  一個星期只會循環一次。這么說,理解了沒?

捕獲.PNG
已經成功了,把它放到while函數外面就可以了。謝謝
回復

使用道具 舉報

ID:624769 發表于 2021-11-10 16:10 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-10 15:53
已經成功了,把它放到while函數外面就可以了。謝謝

………………

那你想過沒有,一周之后,怎么讓他再睡下?
回復

使用道具 舉報

ID:450037 發表于 2021-11-11 09:00 | 顯示全部樓層
188610329 發表于 2021-11-10 16:10
………………

那你想過沒有,一周之后,怎么讓他再睡下?

其實我覺得最主要的就是醒了,處理好數據后繼續睡,然后隔一個星期再醒,這樣周而復始。我今天就是處理這個問題。
回復

使用道具 舉報

ID:624769 發表于 2021-11-11 11:01 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-11 09:00
其實我覺得最主要的就是醒了,處理好數據后繼續睡,然后隔一個星期再醒,這樣周而復始。我今天就是處理這 ...

我想,你應該知道,主程序一旦運行進入了 while(1) 就永遠不會出來,所以,如果,你把睡眠這部分,和你要執行的這部分,分別放在 while(1) 的內外…… , 那么,除了重新啟動,你是無法讓單片機周而復始的執行的。
回復

使用道具 舉報

ID:450037 發表于 2021-11-11 11:28 | 顯示全部樓層
188610329 發表于 2021-11-11 11:01
我想,你應該知道,主程序一旦運行進入了 while(1) 就永遠不會出來,所以,如果,你把睡眠這部分,和你要 ...

我知道,我想用定時器0來控制,我正在寫這個程序,等會兒試運行看看。
回復

使用道具 舉報

ID:450037 發表于 2021-11-11 12:25 | 顯示全部樓層
188610329 發表于 2021-11-11 11:01
我想,你應該知道,主程序一旦運行進入了 while(1) 就永遠不會出來,所以,如果,你把睡眠這部分,和你要 ...

捕獲.PNG
利用時間定時器給htime賦值,然后while語句執行,已經驗證過了。,可以隔一段時間開,隔一段時間關
回復

使用道具 舉報

ID:624769 發表于 2021-11-11 12:43 | 顯示全部樓層
行, 你睡覺和干活都在 while(1) 里就沒問題了, 剩下的就是 htime 和 j 的調整, 以及htime 的計數邏輯了,if判斷來講,最好用 htime >= 240 代替  htime == 240
回復

使用道具 舉報

ID:450037 發表于 2021-11-11 13:26 | 顯示全部樓層
188610329 發表于 2021-11-11 12:43
行, 你睡覺和干活都在 while(1) 里就沒問題了, 剩下的就是 htime 和 j 的調整, 以及htime 的計數邏輯了, ...

嗯嗯,是的。我把它成大于等于
回復

使用道具 舉報

ID:450037 發表于 2021-11-11 15:46 | 顯示全部樓層
188610329 發表于 2021-11-11 12:43
行, 你睡覺和干活都在 while(1) 里就沒問題了, 剩下的就是 htime 和 j 的調整, 以及htime 的計數邏輯了, ...

運行下來有飄移,時間不準。我程序是關一個小時,開五分鐘。動作是有,但是開啟單片機的時間每次都向后延遲,誤差累計的越來越大。
回復

使用道具 舉報

ID:624769 發表于 2021-11-11 16:12 來自觸屏版 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-11 15:46
運行下來有飄移,時間不準。我程序是關一個小時,開五分鐘。動作是有,但是開啟單片機的時間每次都向后延 ...

你htime是哪里累加的?
pcon的循環,那個j確定是 u8定義么?
回復

使用道具 舉報

ID:450037 發表于 2021-11-12 10:07 | 顯示全部樓層
188610329 發表于 2021-11-11 16:12
你htime是哪里累加的?
pcon的循環,那個j確定是 u8定義么?

捕獲.PNG
不好意思,現在才回復。電腦崩了,才把它修復好,大白菜修復電腦是個好東西。
htime是這里給的。用的時間定時器。每1毫秒中斷一次,單片機啟動5分鐘后休眠,這個沒問題。
捕獲.PNG

關鍵在于進入這里時,休眠時間一次比一次長。會不會是_nop_();和P33=~P33浪費了時間累積產生了誤差啊


回復

使用道具 舉報

ID:624769 發表于 2021-11-12 12:06 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-12 10:07
不好意思,現在才回復。電腦崩了,才把它修復好,大白菜修復電腦是個好東西。
htime是這里給的。用的 ...

2個方案:

1) 寧可 count 變成 >=2000 的判斷,  也要把 htime  用u8 來定義 變成150,

2)while(--j) 之前 TR0 =0;    htime = 0; 之后 TR0 = 1;
回復

使用道具 舉報

ID:450037 發表于 2021-11-12 13:50 | 顯示全部樓層
188610329 發表于 2021-11-12 12:06
2個方案:

1) 寧可 count 變成 >=2000 的判斷,  也要把 htime  用u8 來定義 變成150,

你意思說進入中斷一次,htime的值累計也有誤差,因為有count=0這個指令也耗時間是吧。
第二個方案感覺減少了定時誤差。
回復

使用道具 舉報

ID:624769 發表于 2021-11-12 14:09 | 顯示全部樓層
zhangzhao2423 發表于 2021-11-12 13:50
你意思說進入中斷一次,htime的值累計也有誤差,因為有count=0這個指令也耗時間是吧。
第二個方案感覺減 ...

我在另一個 關于中斷的帖子里 提到過。
51系的單片機,屬于8位機,一次只能處理8位數據,因此,如果有變量需要在 中斷與主程序之間傳遞參數的話,這個變量,應當避免使用16位變量,(尤其是C編程的情況下)會出現你無法控制的錯誤。
而你htime 恰恰就是在中斷和主程序之間傳遞參數的變量,那么他應該是 u8 而不應該是 u16。而count 僅僅只是在中斷中使用,所以雖然16位耽誤時間,但是不會產生你不可控的錯誤。

最后,htime 即便改成了u8 if判斷中也要用 >=  而不能用==,這是原則問題(因為htime++ 不是在while(1)里面實施的)。而反過來,count >=   即便改成 == 也沒有關系,因為 count++ 是在T0中斷中實施的。
回復

使用道具 舉報

ID:450037 發表于 2021-11-12 14:18 | 顯示全部樓層
188610329 發表于 2021-11-12 14:09
我在另一個 關于中斷的帖子里 提到過。
51系的單片機,屬于8位機,一次只能處理8位數據,因此,如果有變 ...

不管它了,我相信如果真的有一天需要用到這個功能的話,我會解決時間延遲的問題的。知道能實現這個定時啟動停止就行了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产99视频精品免费播放照片 | 亚洲精品美女视频 | 成人精品毛片 | 香蕉一区| 91.com在线观看 | 精彩视频一区二区三区 | 韩日三级| 天天干狠狠 | 国产免费一区二区三区免费视频 | 国产精品区二区三区日本 | 久久一区二区三区四区五区 | 免费观看av | 亚洲一区视频在线播放 | aaaaa毛片 | 国产一级电影在线 | 麻豆一区二区三区 | 久久精品99久久 | 亚洲二区视频 | 久久国产欧美日韩精品 | 色视频www在线播放国产人成 | 国产精品久久久久国产a级 欧美日韩国产免费 | 国产91精品在线 | av午夜电影 | 亚洲三级国产 | 久久夜视频 | 男女搞网站 | 一级毛毛片 | 91久久精品一区二区三区 | 精品综合视频 | 找个黄色片| 亚洲精选久久 | 国产精品视频久久 | 91精品国产综合久久久久久首页 | 日韩一区精品 | 亚洲成人免费 | 国产精品视频网址 | 亚洲成人中文字幕 | 中文字幕一区二区不卡 | 成人av电影网| 国产高清无av久久 | 一区二区三区欧美在线观看 |