久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3121|回復: 1
收起左側

單片機C語言精確延時

[復制鏈接]
ID:65439 發表于 2016-1-8 10:25 | 顯示全部樓層 |閱讀模式

51單片機 Keil C 延時程序的簡單研究

(晶振12MHz,一個機器周期1us.)

一. 500ms延時子程序

程序:

void delay500ms(void)

{

unsigned char i,j,k;

for(i=15;i>0;i--)

for(j=202;j>0;j--)

for(k=81;k>0;k--);

}

產生的匯編:

C:0x0800 7F0F MOV R7,#0x0F

C:0x0802 7ECA MOV R6,#0xCA

C:0x0804 7D51 MOV R5,#0x51

C:0x0806 DDFE DJNZ R5,C:0806

C:0x0808 DEFA DJNZ R6,C:0804

C:0x080A DFF6 DJNZ R7,C:0802

C:0x080C 22 RET

計算分析:

程序共有三層循環

一層循環n:R5*2 = 81*2 =162us DJNZ 2us

二層循環m:R6*(n+3) = 202*165 =33330us DJNZ 2us + R5賦值 1us = 3us

三層循環: R7*(m+3) = 15*33333 =499995us DJNZ 2us + R6賦值 1us = 3us

循環外: 5us 子程序調用 2us + 子程序返回 2us + R7賦值 1us = 5us

延時總時間 = 三層循環 + 循環外 = 499995+5 = 500000us =500ms

計算公式:延時時間=[(2*R5+3)*R6+3]*R7+5

二. 200ms延時子程序

程序:

void delay200ms(void)

{

unsigned char i,j,k;

for(i=5;i>0;i--)

for(j=132;j>0;j--)

for(k=150;k>0;k--);

}

產生的匯編

C:0x0800 7F05 MOV R7,#0x05

C:0x0802 7E84 MOV R6,#0x84

C:0x0804 7D96 MOV R5,#0x96

C:0x0806 DDFE DJNZ R5,C:0806

C:0x0808 DEFA DJNZ R6,C:0804

C:0x080A DFF6 DJNZ R7,C:0802

C:0x080C 22 RET

三. 10ms延時子程序

程序:

voiddelay10ms(void)

{

unsigned char i,j,k;

for(i=5;i>0;i--)

for(j=4;j>0;j--)

for(k=248;k>0;k--);

}

產生的匯編

C:0x0800 7F05 MOV R7,#0x05

C:0x0802 7E04 MOV R6,#0x04

C:0x0804 7DF8 MOV R5,#0xF8

C:0x0806 DDFE DJNZ R5,C:0806

C:0x0808 DEFA DJNZ R6,C:0804

C:0x080A DFF6 DJNZ R7,C:0802

C:0x080C 22 RET

四. 1s延時子程序

程序:

voiddelay1s(void)

{

unsigned char h,i,j,k;

for(h=5;h>0;h--)

for(i=4;i>0;i--)

for(j=116;j>0;j--)

for(k=214;k>0;k--);

}

對1s延時的驗證:

1. 設置仿真的晶振為12MHz

2.

2. 在延時函數設置斷點

3. 單步運行程序,到達延時函數的入口

4. 先記下進入延時函數的時間


5. step out 跳出函數,記下此時時間,兩個時間相減即為延時函數運行時間


函數運行時間=1.00041400-0.00041600≈1s

產生的匯編

C:0x0800 7F05 MOV R7,#0x05

C:0x0802 7E04 MOV R6,#0x04

C:0x0804 7D74 MOV R5,#0x74

C:0x0806 7CD6 MOV R4,#0xD6

C:0x0808 DCFE DJNZ R4,C:0808

C:0x080A DDFA DJNZ R5,C:0806

C:0x080C DEF6 DJNZ R6,C:0804

C:0x080E DFF2 DJNZ R7,C:0802

C:0x0810 22 RET

在精確延時的計算當中,最容易讓人忽略的是計算循環外的那部分延時,在對時間要求不高的場合,這部分對程序不會造成影響.

void mDelay(unsigned int Delay) //Delay = 1000 時間為1S
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i )
{;}

}
}

void waitms(int i)
{
char m;

for( ; i ;i--)
{
for(m = 203; m ; m--)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

延時1ms的函數
時鐘頻率12MHz

unsigned int sleepTime;
unsinged char inSleep = 0;

void sleepService(void)
{
if (inSleep) sleepTime--;
if (sleepTime == 0) inSleep = 0;
}

void isr_timer(void) //假定定時器中斷1ms 中斷一次。
{
...
sleepService();
...
}

void sleep(unsigned int ms) //延時子程序
{
sleepTime = ms;
inSleep = 1;
while(inSleep);
}

void main(void)
{
....
sleep(1000); //延時 1秒
...
}


評分

參與人數 2黑幣 +60 收起 理由
admin + 50 共享資料的黑幣獎勵!
紅塵有你 + 10 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:102073 發表于 2016-1-8 10:55 | 顯示全部樓層
代碼延時還要考慮代碼執行的時間開銷,需要精確的延時我還是喜歡用定時器
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: julia中文字幕久久一区二区 | 久久久久久久久久久久91 | 91高清视频 | 国产精品久久久乱弄 | 日本三级日产三级国产三级 | 欧美日韩综合精品 | 天天干天天爱天天操 | 欧美精品中文字幕久久二区 | 岛国av免费在线观看 | 欧美日韩视频在线 | 二区av | 成人欧美一区二区三区黑人孕妇 | 亚洲狠狠| 日韩精品一区二区三区中文在线 | 久久久久久久久淑女av国产精品 | 亚洲成人一区 | 国产一区二区三区四区hd | 午夜国产| 欧美一a一片一级一片 | 国产精品日韩欧美一区二区三区 | 三级高清 | 国产亚洲一区二区三区在线观看 | 中文字幕精品一区 | 欧美日韩国产一区 | aaa综合国产 | 中文字幕中文字幕 | 国产精品久久二区 | 国产69精品久久久久777 | 亚洲精品一区二区在线 | 免费一区二区三区在线视频 | 亚洲精品久久久久久首妖 | 91视频大全 | 精品中文视频 | 国产一区二区电影网 | 一级日韩 | 国产欧美一区二区三区久久人妖 | 伊人狼人影院 | 99成人精品| 久久大陆| 午夜av一区二区 | 日韩一区二区黄色片 |