久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网

你好!歡迎來到深圳市穎特新科技有限公司!
語言
當前位置:首頁 >> 技術中心 >> 單片機入門 >> 有關單片機延時程序

有關單片機延時程序

關鍵字:單片機 延時程序 作者:admin 來源:不詳 發布時間:2018-05-18  瀏覽:37

應用單片機的時候,經常會遇到需要短時間延時的情況。需要的延時時間很短,一般都是幾十到幾百微妙(us)。有時候還需要很高的精度,比如用單片機驅動 DS18B20的時候,誤差容許的范圍在十幾us以內,不然很容易出錯。這種情況下,用計時器往往有點小題大做。而在極端的情況下,計時器甚至已經全部派上了別的用途。這時就需要我們另想別的辦法了。

以前用匯編語言寫單片機程序的時候,這個問題還是相對容易解決的。比如用的是12MHz晶振的51,打算延時20us,只要用下面的代碼,就可以滿足一般的需要:

mov r0, #09h

loop: djnz r0, loop

51 單片機的指令周期是晶振頻率的1/12,也就是1us一個周期。mov r0, #09h需要2個極其周期,djnz也需要2個極其周期。那么存在r0里的數就是(20-2)/2。用這種方法,可以非常方便的實現256us以下時間的延時。如果需要更長時間,可以使用兩層嵌套。而且精度可以達到2us,一般來說,這已經足夠了。

現在,應用更廣泛的毫無疑問是Keil的 C編譯器。相對匯編來說,C固然有很多優點,比如程序易維護,便于理解,適合大的項目。但缺點(我覺得這是C的唯一一個缺點了)就是實時性沒有保證,無法預測代碼執行的指令周期。因而在實時性要求高的場合,還需要匯編和C的聯合應用。但是是不是這樣一個延時程序,也需要用匯編來實現呢?為了找到這個答案,我做了一個實驗。

用C語言實現延時程序,首先想到的就是C常用的循環語句。下面這段代碼是我經常在網上看到的:

void delay2(unsigned char i)

{

for(; i != 0; i--);

}

到底這段代碼能達到多高的精度呢?為了直接衡量這段代碼的效果,我把 Keil C 根據這段代碼產生的匯編代碼找了出來:

; FUNCTION _delay2 (BEGIN)

; SOURCE LINE # 18

;---- Variable i assigned to Register R7 ----

; SOURCE LINE # 19

; SOURCE LINE # 20

0000 ?C0007:

0000 EF MOV A,R7

0001 6003 JZ ?C0010

0003 1F DEC R7

0004 80FA SJMP ?C0007

; SOURCE LINE # 21

0006 ?C0010:

0006 22 RET

; FUNCTION _delay2 (END)

真是不看不知道~~~一看才知道這個延時程序是多么的不準點~~~光看主要的那四條語句,就需要6個機器周期。也就是說,它的精度頂多也就是6us而已,這還沒算上一條 lcall 和一條 ret。如果我們把調用函數時賦的i值根延時長度列一個表的話,就是:

i delay time/us

0 6

1 12

2 18

...

因為函數的調用需要2個時鐘周期的lcall,所以delay time比從函數代碼的執行時間多2。順便提一下,有的朋友寫的是這樣的代碼:

void delay2(unsigned char i)

{

unsigned char a;

for(a = i; a != 0; a--);

}

可能有人認為這會生成更長的匯編代碼來,但是事實證明:

; FUNCTION _delay2 (BEGIN)

; SOURCE LINE # 18

;---- Variable i assigned to Register R7 ----

; SOURCE LINE # 19

; SOURCE LINE # 21

;---- Variable a assigned to Register R7 ----

0000 ?C0007:

0000 EF MOV A,R7

0001 6003 JZ ?C0010

0003 1F DEC R7

0004 80FA SJMP ?C0007

; SOURCE LINE # 22

0006 ?C0010:

0006 22 RET

; FUNCTION _delay2 (END)

其生成的代碼是一樣的。不過這的確不是什么好的習慣。因為這里實在沒有必要再引入多余的變量。我們繼續討論正題。有的朋友為了得當更長的延時,甚至用了這樣的代碼:

void delay2(unsigned long i)

{

for(; i != 0; i--);

}

這段代碼產生的匯編代碼是什么樣子的?其實不用想也知道它是如何恐怖的$#^%&%$......讓我們看一看:

; FUNCTION _delay2 (BEGIN)

; SOURCE LINE # 18

0000 8F00 R MOV i+03H,R7

0002 8E00 R MOV i+02H,R6

0004 8D00 R MOV i+01H,R5

0006 8C00 R MOV i,R4

; SOURCE LINE # 19

; SOURCE LINE # 20

0008 ?C0007:

0008 E4 CLR A

0009 FF MOV R7,A

000A FE MOV R6,A

000B FD MOV R5,A

000C FC MOV R4,A

000D AB00 R MOV R3,i+03H

000F AA00 R MOV R2,i+02H

0011 A900 R MOV R1,i+01H

0013 A800 R MOV R0,i

0015 C3 CLR C

0016 120000 E LCALL ?C?ULCMP

0019 601A JZ ?C0010

001B E500 R MOV A,i+03H

001D 24FF ADD A,#0FFH

001F F500 R MOV i+03H,A

0021 E500 R MOV A,i+02H

0023 34FF ADDC A,#0FFH

0025 F500 R MOV i+02H,A

0027 E500 R MOV A,i+01H

0029 34FF ADDC A,#0FFH

002B F500 R MOV i+01H,A

002D E500 R MOV A,i

002F 34FF ADDC A,#0FFH

0031 F500 R MOV i,A

0033 80D3 SJMP ?C0007

; SOURCE LINE # 21

0035 ?C0010:

0035 22 RET

; FUNCTION _delay2 (END)

呵呵,這倒是的確可以延遲很長時間~~~但是毫無精度可言了。

那么,用C到底能不能實現精確的延時呢?我把代碼稍微改了一下:

void delay1(unsigned char i)

{

while(i--);

}

因為根據經驗,越簡潔的C代碼往往也能得出越簡潔的機器代碼。那這樣結果如何呢?把它生成的匯編代碼拿出來看一看就知道了。滿懷希望的我按下了“Build target”鍵,結果打擊是巨大的:

; FUNCTION _delay1 (BEGIN)

; SOURCE LINE # 13

;---- Variable i assigned to Register R7 ----

; SOURCE LINE # 14

0000 ?C0004:

; SOURCE LINE # 15

0000 AE07 MOV R6,AR7

0002 1F DEC R7

0003 EE MOV A,R6

0004 70FA JNZ ?C0004

; SOURCE LINE # 16

0006 ?C0006:

0006 22 RET

; FUNCTION _delay1 (END)

雖說生成的代碼跟用for語句是不大一樣,不過我可以毫無疑問的說,這兩種方法的效率是一樣的。似乎到此為止了,因為我實在想不出來源程序還有什么簡化的余地。看來我就要得出來這個結論了:“如果需要us級的延時精度,需要時用匯編語言。”但是真的是這樣嗎?我還是不甘心。因為我不相信大名鼎鼎的 Keil C 編譯器居然連 djnz 都不會用???因為實際上程序體里只需要一句 loop: djnz r7, loop。近乎絕望之際(往往人在這種情況下確可以爆發出來,哦呵呵呵~~~),我隨手改了一下:

void delay1(unsigned char i)

{

while(--i);

}

心不在焉的編譯,看源碼:

; FUNCTION _delay1 (BEGIN)

; SOURCE LINE # 13

;---- Variable i assigned to Register R7 ----

; SOURCE LINE # 14

0000 ?C0004:

; SOURCE LINE # 15

0000 DFFE DJNZ R7,?C0004

; SOURCE LINE # 16

0002 ?C0006:

0002 22 RET

; FUNCTION _delay1 (END)

天~~~奇跡出現了......我想這個程序應該已經可以滿足一般情況下的需要了。如果列個表格的話:

i delay time/us

1 5

2 7

3 9

...

計算延時時間時,已經算上了調用函數的lcall語句所花的2個時鐘周期的時間。

擴展閱讀:單片機延時問題20問

編輯:admin  最后修改時間:2018-05-18

聯系方式

0755-82591179

郵箱:ivy@yingtexin.net

地址:深圳市南山區桃源街道平山社區平山一路2號南山云谷創業園二期11棟410-411

Copyright © 2014-2026 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號-4

久久精品99久久_亚洲一区二区综合_狠狠色伊人亚洲综合成人_亚洲综合爱爱久久网
youjizzxxxx18| 亚洲啊啊啊啊啊| 国产精品99久久久久久大便| 东京热加勒比无码少妇| 国产黑丝在线视频| 自拍偷拍视频在线| 一区二区在线免费看| 91插插插插插插插插| 999在线观看| 免费看黄色一级大片| 天堂网成人在线| 97超碰人人看| 青青草免费在线视频观看| www.黄色网址.com| 国内外成人激情视频| 国产成人a亚洲精v品无码| 无遮挡又爽又刺激的视频| www激情五月| 日韩精品视频在线观看视频| 亚洲国产日韩欧美在线观看| 人人爽人人av| 日本黄色播放器| 麻豆中文字幕在线观看| 成人手机在线播放| 老太脱裤子让老头玩xxxxx| 免费日韩视频在线观看| 色一情一乱一伦一区二区三区日本| 一区二区三区 欧美| 波多野结衣网页| 成熟丰满熟妇高潮xxxxx视频| 激情在线观看视频| 黄色一级片黄色| 日韩最新中文字幕| h无码动漫在线观看| 亚洲精品无码久久久久久| 国产美女18xxxx免费视频| 男人c女人视频| 日本女优爱爱视频| 青娱乐自拍偷拍| 国产原创精品在线| 91精品国产毛片武则天| 免费在线观看亚洲视频| 中文字幕66页| 成人免费毛片网| 国产91对白刺激露脸在线观看| 一级片视频免费观看| av高清在线免费观看| 国产传媒免费观看| 国产精品wwwww| 日本成人在线不卡| 亚洲第一天堂久久| 亚洲自拍第三页| 国产精品人人妻人人爽人人牛| 一级全黄肉体裸体全过程| 热久久精品免费视频| 一卡二卡三卡视频| 狠狠精品干练久久久无码中文字幕| 欧美日韩第二页| 免费不卡av在线| 三年中文高清在线观看第6集| 北条麻妃av高潮尖叫在线观看| 国产主播自拍av| 天天想你在线观看完整版电影免费| 杨幂毛片午夜性生毛片 | 日本美女高潮视频| 国产精品亚洲二区在线观看| 夫妻免费无码v看片| 精品少妇在线视频| 韩日视频在线观看| 成人网站免费观看入口| youjizz.com在线观看| 国产奶头好大揉着好爽视频| 免费网站在线观看黄| 五月激情五月婷婷| 亚洲欧美日本一区二区| 九九九久久久久久久| eeuss中文| 800av在线免费观看| 国产肉体ⅹxxx137大胆| 99视频在线免费播放| 日本网站免费在线观看| 欧洲av无码放荡人妇网站| 免费av网址在线| www.精品在线| 日韩不卡视频一区二区| www.日本三级| 已婚少妇美妙人妻系列| www.com污| 嫩草影院中文字幕| 国产欧美在线一区| 午夜大片在线观看| 人妻av无码专区| 99re在线视频免费观看| 欧美日韩精品区别| 91免费黄视频| xxx国产在线观看| 人妻互换免费中文字幕| 久久精品香蕉视频| 7777在线视频| 国产免费999| 国产精品igao激情视频| 国产免费成人在线| 丰满女人性猛交| 久久久久国产一区| 欧美乱做爰xxxⅹ久久久| 可以在线看的黄色网址| 日韩中文在线字幕| 男人女人黄一级| 无码 制服 丝袜 国产 另类| 欧美三级午夜理伦三级富婆| 男人天堂av片| 午夜视频在线观| 91av在线免费播放| 日韩黄色片在线| 国产资源中文字幕| 第四色婷婷基地| 欧美国产激情视频| 成人国产在线看| 日本女人高潮视频| 一级黄色高清视频| 亚洲综合色在线观看| 人人妻人人添人人爽欧美一区| 黄色手机在线视频| 亚洲国产精品久久久久爰色欲| 九一免费在线观看| 91嫩草国产丨精品入口麻豆| 污视频网站观看| 日日摸天天爽天天爽视频| 日韩免费视频播放| aa在线免费观看| 国产一区二区三区精彩视频| 日本丰满少妇xxxx| 真人抽搐一进一出视频| www.av毛片| 99热亚洲精品| 日韩精品xxxx| 国产精品沙发午睡系列| 国产免费成人在线| 黄色av免费在线播放| 中文久久久久久| 亚洲欧美日韩一级| 亚洲制服中文字幕| 伊人五月天婷婷| 成人国产在线看| 少妇高潮毛片色欲ava片| 欧美a在线视频| 亚洲色图久久久| 天堂v在线视频| 成人免费a级片| 亚洲熟妇无码另类久久久| 国产精品-区区久久久狼| 日韩毛片在线免费看| 中文字幕色网站| 国产一区二区片| 久久综合久久色| 视频区 图片区 小说区| 欧美日韩福利在线| 国产成人a亚洲精v品无码| www.超碰97.com| 中国丰满熟妇xxxx性| 欧美 国产 小说 另类| 国产精品自拍视频在线| 300部国产真实乱| 黄色a级片免费| 国产免费一区二区三区四在线播放| 日本福利视频一区| 日本美女高潮视频| 国产片侵犯亲女视频播放| 国产成人a亚洲精v品无码| 亚洲视频在线不卡| 日韩精品―中文字幕| 久久成年人网站| 日韩黄色片视频| 毛片av在线播放| 亚洲视频在线不卡| 91日韩视频在线观看| 国产成年人在线观看| 久久综合久久色| 青草视频在线观看视频| 色呦色呦色精品| 国产精品97在线| 香港三级日本三级a视频| 国产精品拍拍拍| 黄色影院一级片| 免费视频爱爱太爽了| 三级黄色片免费看| 超碰在线人人爱| 日日碰狠狠丁香久燥| 国产男女无遮挡| 亚洲精品久久久久久久蜜桃臀| 中文字幕 日韩 欧美| 国产裸体免费无遮挡| 日韩中文字幕三区| 久久久亚洲国产精品| 欧美成人精品免费| 日韩国产成人无码av毛片| 人人妻人人澡人人爽精品欧美一区| 手机在线免费观看毛片| 久久久精品麻豆| 天天色天天综合网|