娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年08月31日(星期六)

2018年08月31日 | 單片機軟件定時器的使用方法

發布者:JoyousJourney 來源: eefocus關鍵字:單片機  軟件定時器  使用方法 手機看文章 掃描二維碼
隨時隨地手機看文章

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


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


//蜂鳴器發出“嗶-嗶-嗶”聲音時間約1s

void BeepFuction(void)

{

  unsigned char i;

  for(i=0;i<3;i=++)

  {

    BeepEn(); //開啟蜂鳴器

    Delayms(220);//延時220ms

    BeepDis();//關閉蜂鳴器  

    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為系統定時器計數時鐘為1ms

        BeepEn(); //開啟蜂鳴器

        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();//蜂鳴流程

     ....

  }


}


16

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


if(!BeepFlag)//檢查是否忙

 BeepCtrl = 1;//啟動蜂鳴器


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


第一,主循環while(1)的循環周期最好小于定時器計數時鐘周期 

第二,主循環中盡量不要使用硬延時Delayms 

第三,代碼中如果存在多個地方需要控制一個流程時一定要先讀取標志位再控制


關鍵字:單片機  軟件定時器  使用方法 引用地址:單片機軟件定時器的使用方法

上一篇:51單片機自定義多個軟件定時器
下一篇:基于C8051F040單片機的CAN總線通信

推薦閱讀

半導體元器件缺貨漲價潮正持續蔓延。繼MLCC、MOSFET等元器件缺貨漲價之后,手機攝像頭的關鍵器件--CMOS圖像傳感器(CIS)也頻傳供貨緊缺,開始漲價。業內人士透露,今年下半年以來,三星、OminiVison的CMOS芯片供貨緊張,部分型號的產品產能緊缺,供不應求。供應鏈廠商透露,目前三星已經正式向其代理商發布漲價通知,從8月份開始,三星CMOS芯片價格漲幅5%-2...
如今,“收快遞”已經成為人們日常生活不可或缺的一部分,根據中國智慧物流研究院報告顯示,自2017年5月以來,全國快遞服務企業日均快遞業務量超過1億件,標志著我國已經常態化進入單日快遞“億件時代”。在快遞業務配送單量、外賣頻次與日俱增的情況下,消費者對于配送速度、服務質量等個性化的需求越來越高。尤其在快遞業務旺季,劇增的訂單業務往往導致...
由物聯網智庫和云和資本聯合主辦的“2020 摯物·AIoT 產業領袖峰會”于上海圓滿落幕。在下午的“工業邊緣智能”分論壇上,物聯網智庫主編王蘇靜發表了題為《工業未來趨勢展望》的精彩演講。 以下為演講全文:大家好!今天我分享的演講主題為《工業未來趨勢展望》,既然我的主題是工業領域的未來趨勢,那就必須先來看看工業領域的現狀是怎樣的。 當下,...
臺積電漲價傳聞持續引發業內關注,供應鏈稱,漲價將給智能手機和服務器買家帶來最大壓力,但對想要買車的人影響不大。據中國臺灣《經濟日報》報道,通過供應鏈可知,臺積電此番漲價,智能手機、汽車、數據中心的成本都會上升,但程度將取決于每種設備的半導體含量。對于汽車來說,芯片成本占總制造成本比例相對較小,2020年新車使用的半導體價值大約在550...

史海拾趣

問答坊 | AI 解惑

如此電路接法,是何用途?

場效應管如圖接法,作用是否等效與一個二極管, 如果是,它與二極管的主要區別是什么呢?…

查看全部問答∨

msp430串口收發程序

現在想用msp430的串口進行收發程序開發,但不知道對方一次發送過來多少數據?如何才能完整接收呢?我感覺使用中斷的方式一次只能接收一個字節的數據,不能把對方發送的完整數據全部接收!請問有什么解決辦法?謝謝! 另外,使用串口通信,一方是ms ...…

查看全部問答∨

wince下讀寫IC卡速度問題

在pc下測試,串口讀寫只要3s 在wince下測試,居然10s啊,怎么解決?? 怎么辦 ?? 救命 …

查看全部問答∨

為什么RTC計數器有時會清零?

                                 請教:用STM32F101的RTC作時歷時鐘時,在有后備電池的情況下,發現偶爾時鐘會清零,好像發生在斷電或加電后,有辦法 ...…

查看全部問答∨

【原創】:關于42x0TA問題

我用ta做pwm輸出,設置如下: void init_timer_a(void) { TACTL = TASSEL1 +TACLR + MC_1; //選擇SMCLK為時鐘,定時器清空,選擇up模式,中斷允許 TACCTL0 = CCIE; //將CCR0設為比較模式,中斷允許+ TAIE TACCR0 = 1 ...…

查看全部問答∨

stm32F101死機,手動復位無效,只能上電復位

stm32F101死機,手動復位無效,只能上電復位,我應該檢查什么地方?…

查看全部問答∨

新手求解答 AD軟件中 DB9的原理圖后面怎么會有兩條線

AD軟件中 DB9的原理圖后面怎么會有兩條線 如圖所示正常DB9不是沒有嗎 怎么去掉??新手求解答…

查看全部問答∨

穩壓電源中的芯片可以選擇LM2576嗎?

剛開始接觸電源模塊,想要自己做一個輸出12V/25W的電源,給功放供電,初步方案是220V交流經過24V/30W變壓器,然后通過橋堆和一大一小2個濾波電容,再經過LM2576-ADJ開關穩壓芯片,最終輸出12V,25w的電源,可我看到上大部分線性穩壓電源的穩壓芯片 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 江津市| 西畴县| 平利县| 休宁县| 金沙县| 江阴市| 海兴县| 琼海市| 莲花县| 泽库县| 长垣县| 交口县| 河南省| 双江| 衡阳市| 出国| 吕梁市| 衡东县| 阳春市| 海原县| 灯塔市| 邹城市| 澜沧| 邳州市| 大安市| 罗田县| 资中县| 牟定县| 和静县| 金平| 台湾省| 左云县| 沈阳市| 乾安县| 花莲市| 达尔| 察雅县| 黄大仙区| 景泰县| 曲麻莱县| 巧家县|