日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机软件定时器的使用方法

發布時間:2024/1/1 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机软件定时器的使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單片機軟件定時器的使用方法

特別聲明:文章是原創但是本文講述的思想是在國外的開源代碼中借鑒的

初學者在編寫單片機程序時經常會用到延時函數,但是當系統逐步復雜以后(沒有復雜到使用操作系統)延時會因為延時降低MCU的利用率,更嚴重的會影響系統中的“并行”操作例如一個既有按鍵又有蜂鳴器的系統中,如果要求按下按鍵發出不同的聲音,每次發聲時間在1秒-2秒之間, 如果用延時來做代碼很簡單:

//蜂鳴器發出“嗶-嗶-嗶”聲音時間約1s void BeepFuction(void) {unsigned char i;for(i=0;i<3;i=++){BeepEn(); //開啟蜂鳴器Delayms(220);//延時220msBeepDis();//關閉蜂鳴器 Delayms(110);//延時110ms } }

當這段代碼執行時MCU不可能同時處理按鍵檢查程序因為它大部分時間在執行Delayms()函數中的nop指令,這樣就不可能去執行檢查按鍵了(不使用中斷時),如果把程序改成流程形式的寫法則結果會大為不同,下面先介紹一下基本原理。

我們都知道一般的定時器為16位或8位循環計數,例如對于16位的計數器當計數器數值從0增加到65535時再加一就會回到0那么我們來比較下面兩種情況(不考慮計數器在記錄當前時刻T后再次回到或超過T這種情況我暫且稱它為“壓圈”):
情況1:
T1時刻計數器數值為300
T2時刻計數器數值為400
則T1時刻到T2為100個計數單位。
這段時間差也為100個計數單位。
情況2:
T1時刻計數器數值為65535
T2時刻計數器數值為99
則T1到T2 可以算出為65535到0的1個計數單位再加上 0到99的99個計數單位總共為100個計數單位。
所以時間差還是100個計數單位。
在C語言中如果使用兩個無符號數作減法會得到如下結果:99-65535=100,這個很好理解就和10進制的借位一樣只不過借位后不用管高位了也就相當于99+65536-65535結果是100了,當然這些前提條件都是計數器不會出現“壓圈”。
有了上面對定時器的了解就可以從新寫這個Beep函數了

//蜂鳴器發出“嗶-嗶-嗶”聲音時間約1s bit BeepFlag = 0;//蜂鳴流程忙標志位 bit BeepCtrl = 0;//蜂鳴器流程控制標志位 void BeepProc(void) {static unsigned int BeepTimer;static unsigned char BeepStatus = 0;static unsigned char i;switch(BeepStatus){case 0://if(BeepCtrl){i = 3;//蜂鳴次數BeepFlag = 1;//置位忙標志位BeepCtrl = 0;//清除控制標志位BeepTimer = TIMER;//這里TIMER為系統定時器計數時鐘為1msBeepEn(); //開啟蜂鳴器BeepStatus = 1;//進入下一個狀態}break;case 1://蜂鳴狀態if(TIMER-BeepTimer>220)//220ms{BeepDis(); //關閉蜂鳴器BeepTimer = TIMER;//記錄時刻BeepStatus = 2;//進入下一個狀態}break;case 2://停止蜂鳴狀態if(TIMER-BeepTimer>110)//110ms{if(i!=0){i--;BeepTimer = TIMER;//記錄時刻BeepEn(); //開啟蜂鳴器BeepStatus = 2;//回到蜂鳴狀態}else{BeepStatus = 0;//回到初始狀態BeepFlag = 0;//清除忙標志位}} break;default:BeepFlag = 0;//清除忙標志位BeepStatus = 0;//回到初始狀態break;} }

用這樣的方法實現的蜂鳴程序在使用時也有不同的地方,因為使用的switch狀態所有在主循環中要一直調用:

void main() {SystemInitial();//系統初始化...............//主循環while(1){Fun1Proc();//功能1流程Fun2Proc();//功能2流程.... BeepProc();//蜂鳴流程....}}

在別的函數中需要使蜂鳴器工作時只需要下面代碼即可:

if(!BeepFlag)//檢查是否忙BeepCtrl = 1;//啟動蜂鳴器

用這種方法能充分利用MCU,在蜂鳴器發聲或發聲間隔的等待時間MCU可以處理別的函數,但是還要有幾點需要注意

第一,主循環while(1)的循環周期最好小于定時器計數時鐘周期
第二,主循環中盡量不要使用硬延時Delayms
第三,代碼中如果存在多個地方需要控制一個流程時一定要先讀取標志位再控制

總結

以上是生活随笔為你收集整理的单片机软件定时器的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 五月天开心激情 | 黄色日本网站 | 91黄色小视频 | 99在线视频播放 | 午夜一级视频 | 欧美精品videosex极品 | 中文自拍 | 日韩精品欧美精品 | 国产一级二级在线观看 | 免费av网站在线播放 | 日韩精品一区二区在线播放 | 天天免费视频 | 国产精品久久久久久亚洲调教 | 国产欧美激情 | av官网| 美女无遮挡网站 | 99精品视频在线看 | 黄页网站在线 | 一级二级三级视频 | 日日骚影院 | 欧美tv | 永久视频在线 | 黄色性视频网站 | 久久欧美视频 | 国产区高清 | 成人午夜影视在线观看 | 国产视频久久 | 日韩欧美中文在线 | 国产3区| 欧美大片一区二区三区 | 国产人成一区二区三区影院 | 欧美另类色图 | 午夜偷拍视频 | 男插女视频免费 | 尤物视频网站在线观看 | 日韩免费看 | 视色视频在线观看 | 亚洲字幕成人中文在线观看 | 操欧洲美女 | 久久久久香蕉视频 | 日本猛少妇色xxxxx | 不卡视频一区二区三区 | 成人在线观看视频网站 | 国产免费av一区二区 | 香蕉视频在线视频 | 人人爽人人射 | 日本三级一区二区三区 | 91免费在线视频观看 | 人妻少妇精品一区二区三区 | 亚洲成人二区 | 911色 | 久久精品视 | 森泽佳奈中文字幕 | 先锋影音资源av | 国产精品福利片 | 亚洲一区你懂的 | 天天操天天摸天天干 | 成人1区| 不卡一区二区在线 | 日本特黄一级大片 | 一区二区三区黄 | 国产精品hd | 四级毛片| 日韩免费观看一区二区 | 国产又爽又色 | 国产精品精品久久久久久 | 俺也来俺也去俺也射 | 偷拍视频久久 | 疯狂做爰高潮videossex | av影视网| 天天爽一爽| 欧美整片sss | 国产精品久久久久久久久免费软件 | 午夜三级影院 | 日韩第一页在线观看 | 91精品视频在线免费观看 | 欧美日韩一区二区三区不卡 | 亚洲天堂小视频 | 韩国色网| 亚洲男女视频 | 日本三级小视频 | 久久无码精品丰满人妻 | 国产午夜在线播放 | 视频一区在线免费观看 | 亚洲高清久久久 | 久久久视频在线观看 | 天天综合网久久综合网 | 国产精品福利在线观看 | 免费91视频| 91免费在线 | 网站一区二区 | 91视频看 | 国产精品视频一区二区三区在3 | 色婷婷a | www.亚洲色图.com | 亚洲色欲色欲www在线观看 | 美女被c出水 | 日韩素人 | 一区二区三区精品视频在线观看 |