欧美午夜欧美,台湾成人av,久久av一区,最近看过的日韩成人

電子開發(fā)網(wǎng)

電子開發(fā)網(wǎng)電子設(shè)計(jì) | 電子開發(fā)網(wǎng)Rss 2.0 會(huì)員中心 會(huì)員注冊(cè)
搜索: 您現(xiàn)在的位置: 電子開發(fā)網(wǎng) >> 電子開發(fā) >> 單片機(jī) >> 正文

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

作者:佚名    文章來(lái)源:本站原創(chuàng)    點(diǎn)擊數(shù):    更新時(shí)間:2017/5/20

  最近在忙著單片機(jī)的項(xiàng)目,偶爾停下來(lái)小結(jié)了一下最近的收獲,還是有不少可貴的收益的。

  本人在閑暇的時(shí)候?qū)纹瑱C(jī)C語(yǔ)言下的各類延時(shí)程序做了下總結(jié)。由于單片機(jī)C語(yǔ)言下利用軟件延時(shí)不容易做到精確的定時(shí),所以很多人在編寫延時(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ī)器周期(可查此表得知:http://www.51hei.com/mcuteach/1312.html),而在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=2+(i%256)*7+(i/256)*256*7+i/256+255*7

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

如果你懶得計(jì)算我還給大家推薦一個(gè)簡(jiǎn)單的方法:就是用keil的軟件仿真功能來(lái)仿真出C語(yǔ)句執(zhí)行的時(shí)間,具體方法可以看這里:/Article/danpianji/1956.html

昨天熬夜整理的,從這個(gè)程序中可以看出單片機(jī)C語(yǔ)言和匯編語(yǔ)言的一些區(qū)別,希望對(duì)大家有幫助!

Tags:單片機(jī)C語(yǔ)言精確延時(shí),單片機(jī),延時(shí)  
責(zé)任編輯:admin
相關(guān)文章列表
NE555電磁鐵延時(shí)釋放電路
基于AT89C52單片機(jī)控制的雙軸太陽(yáng)自動(dòng)跟蹤系統(tǒng)設(shè)計(jì)
ESP32單片機(jī)入門篇
超聲波測(cè)距+溫度+報(bào)警的單片機(jī)代碼_51單片機(jī)超聲波測(cè)距C語(yǔ)言程序
七段數(shù)碼管顯示原理研究_數(shù)碼管顯示0~9對(duì)應(yīng)的段碼
單片機(jī)C語(yǔ)言編程入門教程  流水燈程序示例
基于51單片機(jī)—多功能秒表,多功能計(jì)時(shí)器C語(yǔ)言程序
STC89C52單片機(jī)數(shù)字電流表電壓表源碼與電路圖  51單片機(jī)電流電壓
自學(xué)stm32單片機(jī)四個(gè)步驟,實(shí)用又高效!
先學(xué)51還是先學(xué)STM32?STM32和51單片機(jī)的區(qū)別
單片機(jī)最小系統(tǒng)介紹及電路設(shè)計(jì) STM32單片機(jī)最小系統(tǒng)
三菱plc FX-PLC設(shè)計(jì)通電和斷電均延時(shí)的梯形圖實(shí)例
什么是PIC單片機(jī)
為什么51單片機(jī)的晶振一般使用11.0592? 51單片機(jī)常用波特率初值表
51單片機(jī)寄存器功能一覽表
單片機(jī)寫延時(shí)程序的幾種方法
自學(xué)單片機(jī)編程之中斷與時(shí)鐘程序
哈佛結(jié)構(gòu)與馮·諾伊曼結(jié)構(gòu)區(qū)別以及X86體系
單片機(jī)萬(wàn)年歷:公歷日期與農(nóng)歷日期的相互轉(zhuǎn)換程序
AVR定時(shí)器1的CTC模式設(shè)置
請(qǐng)文明參與討論,禁止漫罵攻擊,不要惡意評(píng)論、違禁詞語(yǔ)。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個(gè)字
[ 查看全部 ] 網(wǎng)友評(píng)論
最新推薦
關(guān)于我們 - 聯(lián)系我們 - 廣告服務(wù) - 友情鏈接 - 網(wǎng)站地圖 - 版權(quán)聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁(yè)面
下到頁(yè)底
晶體管查詢
主站蜘蛛池模板: 宁陕县| 新龙县| 漳平市| 岚皋县| 寻甸| 大洼县| 新源县| 东丽区| 夏邑县| 吴忠市| 新晃| 永安市| 乌拉特中旗| 阜城县| 肃宁县| 安国市| 富民县| 章丘市| 海原县| 随州市| 永吉县| 胶州市| 修水县| 三门县| 防城港市| 县级市| 宕昌县| 绿春县| 长子县| 巴林右旗| 漳平市| 安溪县| 台山市| 武陟县| 迭部县| 永吉县| 明星| 叙永县| 屏东市| 吉首市| 黑河市|