程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 1s延時程序

1s延時程序

編輯:關於C語言

#include <reg52.h>
sbit P1_0 = P1^0;
void Delay(); // 下面引用時一定要和這裡的大小寫一致否則會有警告或錯誤

void Main()
{
while (1) // 開始一直循環
{
P1_0 = 0;
Delay(); // 沒有參數也要加 () 否則會有Warning
P1_0 = 1;
Delay();
}
}

void Delay() // 12M晶振1s延時
{
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--); // 最後個要有 ; 號

}

//=======以下非代碼==========//

原理,利用h,i,j,k循環指令消耗掉一定時間來達到延時,為什麼利用循環延時的做法,在12M晶振延時1秒中需要h,i,j,k四個變量,且各變量的值是上面代碼中那樣呢?這要從單片機的周期說起,單片機有指令周期,機器周期,狀態周期,時鐘周期;

時鐘周期:也就晶振的振蕩周期,以12MHz為例,時鐘周期為 1/ 12000000 = 1/12us;

機器周期:1個機器周期=6個狀態周期=12個時鐘周期=1us;

指令周期:單片機執行一條指令所需要的時間稱為指令周期,指令周期是以機器周期為單位的,不同的指令所需要的機器周期不一定相同(1-4個),單片機執行一條單周期指令需要1us,執行一條雙周期指令需要2us,for循環需要8個指令周期;

具體執行for循環消耗的時間,可以在Keil裡通過代碼測量:

#include <reg52.h>
sbit P1_0 = P1^0;
void Delay(); 

void Main()
{
while (1) // 開始一直循環
{
P1_0 = 0;
Delay(); 
P1_0 = 1;
Delay();
}
}

void Delay() 
{
unsigned char h;

for (h = 1000; h > 0; h--);  // 此處下斷點

}

循環1000次執行完後的時間點

1000次循環耗時 0.00042850s - 0.00019600s = 0.00023250s = 232.5us;1次循環耗時約 0.2us,

1s = 1000000us,1000000us / 0.2us = 500000次,而 5 * 4 * 116 * 214 = 496480;因為無符號字符型unsigned char 大小為1 byte,范圍為0~255,所以只能通過循環嵌套,近似的得到一個1s延時。 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved