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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6937|回復: 12
打印 上一主題 下一主題
收起左側

51單片機程序設計-時基 通過定時器中斷計數的方式定時的實現

  [復制鏈接]
跳轉到指定樓層
樓主
在一個程序中的很多地方都需要定時,如LED閃爍、按鍵消抖和通訊等待等。通過阻塞CPU的方式定時,程序性能極差;通過硬件定時器定時,性能好,定時非常準確,但定時器資源有限;通過定時器中斷計數的方式定時,性能好,定時較準確,使用非常靈活。本文主要描述通過定時器中斷計數的方式定時的實現。


2.定時器中斷計數
初始化?個定時器,1ms中斷?次。定義?個uint32_t變量,每中斷?次,變量加1,變量溢出后
變為0。
定時器初始化和中斷服務程序
  1. uint32_t volatile time_base_ms;  //volatile關鍵字防?編譯器優化
  2. void timer_init(void)
  3. {
  4.   //初始化定時器
  5.   time_base_ms = 0;
  6. }
  7. // 定時器中斷服務程序
  8. void Timer_hander(void) interrupt 19
  9. {
  10.   ++time_base_ms;
  11. }
復制代碼



3.獲取當前時刻
定時器開啟之后,變量time_base_ms開始計數,每加1表示時間過去1ms。在訪問變量
time_base_ms的 過程中有可能發?了中斷,必須特殊處理。?法是,先讀?次,再讀?次并?較?
次,如果相等說明兩次讀的過程都沒有發?中斷,數據可靠;如果不相等,說明兩次讀有?次發?了
中斷,下?次中斷沒有那么快到來,再讀?次數據?定不會發?中斷(系統時鐘不太慢的情況下)。
  1. uint32_t time_current(void)
  2. {
  3.   uint32_t ret;

  4.   ret = time_base_ms;     // 讀取計數,該過程可能中斷

  5.   if(ret != time_base_ms){  // 讀取計數,該過程可能中斷;如果不相等,說明兩
  6. 個過程有?個發?過中斷
  7.     ret = time_base_ms;   // 讀取計數,該過程沒有中斷
  8.   }

  9.   return ret;
  10. }
復制代碼

4.定時的計算
計算過去某個時刻據當前時刻的時間,或者說過去的某個時刻據現在有多久。需要考慮過去某個
時刻到當前時刻變量time_base_ms有沒有溢出。
  1. uint32_t time_timing_ms(uint32_t moment)
  2. {
  3.   uint32_t current_moment;
  4.   uint32_t ret;

  5.   current_moment = time_current();

  6.   if(current_moment >= moment){
  7.     ret = current_moment - moment;
  8.   }else{
  9.     ret = (0xffffffff - moment) + current_moment + 1;
  10.   }

  11.   return ret;
  12. }
復制代碼

應用
led1每秒閃爍1次,led2每秒閃爍5次。

  1. void main()
  2. {
  3.   uint32_t led1_moment;
  4.   uint32_t led2_moment;
  5.   //初始化定時器
  6.   timer_init();
  7.   //記錄當前時刻
  8.   led1_moment = time_current();
  9.   led2_moment = time_current();
  10.   while(1){
  11.     //檢查時間是否過去500ms
  12.     if(time_timing_ms(led1_moment) > 500){
  13.       led1 = ~led1;
  14.       led1_moment = time_current();  //記錄當前時刻
  15.     }
  16.     //檢查時間是否過去100ms
  17.     if(time_timing_ms(led2_moment) > 100){
  18.       led2 = ~led2;
  19.       led2_moment = time_current();  //記錄當前時刻
  20.     }
  21.    
  22.   }
  23. }
復制代碼

示例:



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發
ID:798322 發表于 2023-6-26 21:25 | 只看該作者
void Timer_hander(void) interrupt 19
這個中斷號是不是有問題,然后時間應該是時間差比較100 500ms,單片機的定時和晶振有關。
回復

使用道具 舉報

板凳
ID:479880 發表于 2023-6-29 11:03 來自手機 | 只看該作者
玲瓏紅豆 發表于 2023-6-26 21:25
void Timer_hander(void) interrupt 19
這個中斷號是不是有問題,然后時間應該是時間差比較100 500ms,單 ...

代碼不完全可用,只是用來說明思路
回復

使用道具 舉報

地板
ID:475306 發表于 2023-7-28 10:02 | 只看該作者
小白沒看懂啊,點亮那個IO口了啊?
回復

使用道具 舉報

5#
ID:1090778 發表于 2023-8-5 14:35 | 只看該作者
小白沒看懂啊,繼續學習
回復

使用道具 舉報

6#
ID:479880 發表于 2023-8-9 18:32 來自手機 | 只看該作者
KTTCO 發表于 2023-7-28 10:02
小白沒看懂啊,點亮那個IO口了啊?

偽代碼
回復

使用道具 舉報

7#
ID:303735 發表于 2023-10-3 14:54 | 只看該作者
KTTCO 發表于 2023-7-28 10:02
小白沒看懂啊,點亮那個IO口了啊?

初始化把LED1定義到想要輸出的口就行了,
回復

使用道具 舉報

8#
ID:1109233 發表于 2024-2-4 18:53 | 只看該作者
不完全可用,只是用來說明思路
回復

使用道具 舉報

9#
ID:627251 發表于 2024-2-17 22:02 | 只看該作者
這代碼... AI生成的吧
回復

使用道具 舉報

10#
ID:1126189 發表于 2024-6-20 12:57 | 只看該作者
講的非常容易理解
回復

使用道具 舉報

11#
ID:1126656 發表于 2024-9-22 18:01 | 只看該作者
新同學們慢慢來,逐步成長!多向大師學習
回復

使用道具 舉報

12#
ID:1112748 發表于 2025-1-12 18:15 | 只看該作者
新同學們慢慢來,逐步成長!多向大師學習
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 干干干操操操 | 91精品国产乱码久久久久久久久 | 色五月激情五月 | 国产欧美精品一区二区色综合朱莉 | 日韩精品视频在线 | 男人av在线播放 | 国产精品中文 | 精品视频在线观看 | 欧美一区二区三区免费在线观看 | 9999视频 | 国产精品永久 | 中文字幕欧美在线观看 | 国产精品一区二区三区久久久 | 欧美一级免费观看 | 精品视频999| 日日干夜夜操天天操 | 欧美中文字幕一区二区三区亚洲 | 91久久国产综合久久 | 91网站在线看 | 国产精品一区二区在线免费观看 | 午夜影院操 | 不卡的av在线 | 91精品国产色综合久久不卡蜜臀 | 日韩一区二区免费视频 | 精品国产乱码久久久久久蜜臀 | 久久色视频 | 久久国产区 | 日韩精品免费 | 欧美精品在线观看 | 99视频在线看| 在线国产一区二区 | www.国产精 | av网站在线免费观看 | 久久久久国产精品人 | 天天干亚洲 | 久久精品国产久精国产 | 欧美精品一二区 | 一级黄色片美国 | www.日日夜夜 | 有码一区| 国内精品久久久久 |