亚欧洲精品在线观看,窝窝影院午夜看片,久久国产成人午夜av影院宅,午夜91,免费国产人成网站,ts在线视频,欧美激情在线一区

C語(yǔ)言

用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法

時(shí)間:2025-02-14 21:37:55 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法

  C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。那么用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法都是怎樣的呢?以下僅供參考!

  由于單片機(jī)C語(yǔ)言下利用軟件延時(shí)不容易做到精確的定時(shí),所以很多人在編寫(xiě)延時(shí)子程序的時(shí)候不能好好的把握延時(shí)的具體時(shí)間。C語(yǔ)言下,延時(shí)程序主要有以下幾種:

  一:

  void delay(unsigned char k)

  {

  unsigned char i,k; //定義變量

  for(i=0;i<k;i++); //for循環(huán)語(yǔ)句

  }

  該程序在Keil環(huán)境下,會(huì)先將C語(yǔ)言轉(zhuǎn)化成匯編語(yǔ)言,那么我們就可以根據(jù)匯編語(yǔ)言來(lái)計(jì)算出精確的時(shí)間,轉(zhuǎn)化具體步驟如下:

  CLR A ;指令1

  MOV R7,A ;指令2

  LOOP:

  INC R7 ;指令3

  CJNE R7,k,LOOP ;指令4

  這里,指令1,指令2和指令3各消耗1個(gè)機(jī)器周期,指令4消耗兩個(gè)機(jī)器周期(可查文末附錄表),而在12M的晶振下一個(gè)機(jī)器周期是1us,在這個(gè)過(guò)程中,指令1和指令2分別執(zhí)行1次,即消耗1+1us,而指令3和指令4分別執(zhí)行了k次,那么這樣加起來(lái),這個(gè)延時(shí)子程序所消耗的具體時(shí)間就是t=1+1+(1+2)*k=3k+2us。

  呵呵,這樣說(shuō)來(lái),如果我們定義的k為100的話,這個(gè)延時(shí)子程序的精確時(shí)間就是302us。

  二:

  void delay(unsigned char i)

  {

  while(--i)

  {;}

  }

  同樣的道理,將其反匯編,可以看到,只有一條語(yǔ)句:DJNZ i,$;

  該語(yǔ)句消耗2us,一共執(zhí)行i次,所以總共消耗時(shí)間t=i*2us。

  三:

  下面的將形參換為整形int,這樣的話,反匯編所執(zhí)行的語(yǔ)句完全不同,用個(gè)具體的數(shù)字做例子:

  void delay()

  {

  unsigned int i=10000;

  while(--i)

  ;

  }

  反匯編后:

  4: unsigned int i=10000;

  C:0x0003 7F10 MOV R7,#0x10

  C:0x0005 7E27 MOV R6,#0x27

  5: while(--i)

  6: ;

  C:0x0007 EF MOV A,R7

  C:0x0008 1F DEC R7

  C:0x0009 7001 JNZ C:000C

  C:0x000B 1E DEC R6

  C:0x000C 14 DEC A

  C:0x000D 4E ORL A,R6

  C:0x000E 70F7 JNZ C:0007

  具體計(jì)算如下

  1.R7經(jīng)過(guò)10H(16)次循環(huán)減為0:

  t1=10H*(1+1+2+1+1+2)

  2.R6經(jīng)過(guò)27H*256次循環(huán)減為0:

  t2=27H*256*(1+1+2+1+1+2)+27H*1

  3.最后R7的是變?yōu)?55,因此還要多出255次的循環(huán):

  t3=255*(1+1+2+1+1+2)

  4.加上之前消耗的2us,總消耗時(shí)間:

  T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)

  =2+16*7+39*256*7+39*1+255*7

  =71826us

  大約為72ms吧

  如果定義一個(gè)unsigned int i,那么延時(shí)計(jì)算公式為T(mén)=2+(i%256)*7+(i/256)*256*7+i/256+255*7

  關(guān)于其他類型的延時(shí)程序都可以按照這個(gè)方法對(duì)時(shí)間進(jìn)行較為精確的計(jì)算。

【用單片機(jī)C語(yǔ)言精確延時(shí)(定時(shí))的方法】相關(guān)文章:

單片機(jī)C語(yǔ)言的誤用04-27

單片機(jī)C語(yǔ)言的好處06-25

如何優(yōu)化C語(yǔ)言(單片機(jī))06-01

學(xué)習(xí)C語(yǔ)言的方法05-23

C語(yǔ)言在單片機(jī)開(kāi)發(fā)中的問(wèn)題12-31

單片機(jī)C語(yǔ)言的內(nèi)存泄露總結(jié)05-24

單片機(jī)C語(yǔ)言入門(mén)教程03-13

C語(yǔ)言的冒泡排序方法04-06

C語(yǔ)言的reduce方法應(yīng)用05-29