日韩性视频-久久久蜜桃-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
第三,代碼中如果存在多個地方需要控制一個流程時一定要先讀取標志位再控制

總結

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

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

主站蜘蛛池模板: 中文字幕在线天堂 | 久久久久久久久久一区 | 国产免费黄色片 | 在线观看免费高清在线观看 | 日韩在线影院 | 黑人巨大精品一区二区在线 | 亚洲精品电影在线观看 | 精品国产乱码一区二 | 成人黄色小说视频 | 日本特黄一级片 | 国产欧美一区二区精品性色99 | 亚洲中文字幕无码爆乳av | 黄色大片网站在线观看 | 99热免费在线 | 国产美女在线播放 | 中文字幕五码 | 欧美高清性xxxxhd | 日本不卡一区在线 | 国产三级观看 | 欧美少妇xxxxx | 爱的色放韩国电影 | 久久精品综合网 | 国精产品一区一区三区免费视频 | 日韩伦人妻无码 | av网址免费观看 | www.avcao| av在线网址大全 | 久久久久久99精品久久久 | 国产福利资源 | 欧美 日韩 国产 在线观看 | 在线看黄色网址 | 四虎影视www在线播放 | 国产美女无遮挡永久免费观看 | 免费av在线网站 | 国产激情片 | 最好看的2018中文2019 | 在线日韩av | av资源在线看 | 中文字幕在线视频第一页 | av操操| 精品国产三级a∨在线 | 国产欧美日韩精品一区 | 黄色网址www | 精品国产欧美一区二区三区成人 | 亚洲av成人一区二区国产精品 | 四十路av | 韩国伦理片免费看 | 这里只有精品在线播放 | 欧美性受xxxx黑人 | 少妇野外性xx老女人野外性xx | 91精品国产乱码久久久久久久久 | 欧美三级 欧美一级 | 欧美一区二区三区免费看 | 午夜污| 中文一区二区在线播放 | 一区欧美 | 天天综合网久久综合网 | 亚洲av无码一区二区乱子仑 | 综合国产一区 | 深夜视频在线观看免费 | 九九九热精品 | 影音先锋久久久 | 欧美一区二区三区免 | 龚玥菲三级露全乳视频 | 日本激情影院 | 亚洲性av| 欧美国产一区二区在线观看 | 无码人妻精品一区二区50 | 成人久久免费 | 秋霞影院午夜丰满少妇在线视频 | 91精品免费 | 日本美女一级视频 | h视频在线免费看 | 中国精品毛片 | 超碰av在线播放 | 新国产视频 | aaa级片| 大桥未久视频在线观看 | 亚洲成人免费在线观看 | 亚洲天堂一 | 色婷婷国产精品综合在线观看 | 韩国主播青草200vip视频 | 69午夜| av成人免费观看 | av手机在线观看 | 国产黄色大全 | 东北熟女一区二区三区 | 涩涩天堂 | 67194在线免费观看 | 国产精品一区不卡 | 日本特黄色片 | 亚洲视屏一区 | 日日摸夜夜添夜夜添高潮喷水 | 国产午夜福利一区 | 肉肉h| 在线se | 国产又爽又黄又嫩又猛又粗 | 亚洲专区欧美专区 | ,午夜性刺激免费看视频 |