㈠ 單片機延時程序
你調用此程序的時候會給他傳遞X的值,就是while(x--)裡面的X,當while檢測到x--不等於0的時候,就執行for(j=0;j<125;j++);也就是在for(j=0;j<125;j++);這執行125次判斷不做別的,就是耗時間而已,當執行完for(j=0;j<125;j++);以後又回到while(x--)上檢測,當while檢測到x--不等於0的時候,又一次執行,知道檢測到x--等於0。函數就返回到你調用他的地方。
㈡ 單片機延時時間程序怎麼編程
舉一個例子來說明吧.比如你要編一個延時50毫秒的子程序,那麼步驟如下:
1、查看一下你的硬體環境,比如晶振大小,CPU型號,不用CPU指令的機器周期是不一樣的。
2、計算延時需要的機器周期。比如採用12M晶振,CPU採用通用8051,那麼一個機器周期為1US,50毫秒為50*1000=50000US,需要的機器周期=50000/1=50000。
3、試編程,如下:
程序代碼 指令時間 總共時間
DELAY50MS: ;2 2
MOV R7,#A ;1 1
DELAY1:
MOV R6,#B ;1 1*A
DJNZ R6,$ ;2 2*B*A
DJNZ R7,DELAY1 ;2 2*A
RET ;2 2
所以總時間=2+1+A+2*A*B+2*A+2=5+3A+2AB
4、湊數求A、B
根據2、3得到如下式子:
50000=5+3A+2AB
可以有很多種結果,不過最好是以A盡可能小,B盡可能大為原則,當然不能大於255.
我現在湊出A=110,B=225;那麼總延時時間=5+3*110+2*110*225=49835。還差165US
5、補齊不夠時間
再加一個小循環就OK了,呵呵如下:
MOV R6,#C
DJNZ R6,$
會算了吧,2*C+1=165;所以C=82。
現在完整的延時程序出來了,如下:
DELAY50MS: ;2 2
MOV R7,#110 ;1 1
DELAY1:
MOV R6,#225 ;1 1*110
DJNZ R6,$ ;2 2*225*110
DJNZ R7,DELAY1 ;2 2*110
MOV R6,#82 ;1 1
DJNZ R6,$ ;2 2*82
RET ;2 2
很圓滿:總的時間50000微妙,也就是50毫秒。這種方式編程,在該硬體環境下可以保證最大誤差為1微妙。
㈢ 單片機延遲500ms試寫出延遲程序
根據外部晶振的不同,延時1毫秒的循環次數也不一樣,一般12m晶振的話用
for(j=time;j>0;j--);延時時,1毫秒time大概為125左右,這里用110,大概晶振為11.0592m,所以這段程序,內部循環完成1毫秒延時,外部循環完成500毫秒延時。
㈣ C51單片機延時程序,需要不精確延時2小時,請問大神怎麼寫延時代碼,謝謝!
可以有很多辦法,一是調整參數,使其延時5分鍾或6分鍾,循環24次或20次。二是將延時函數的形參改為長整型(32位)延時時間擴大65536倍。三是使用定時器,每次定時50mS,累計144000次,便是2小時,使用定時器(中斷)的好處是在延時期間還可以干許多事情,例如顯示剩餘時間,檢測設備工作狀態或者調整延時時間等,而你的純軟體延時期間想干其它事情比較困難。
㈤ 單片機c語言延時程序
一般單片機在c語言中很難得到精確的延時,所以一般對時間要求高的都用計時器中斷來做了。如果時間要求不嚴格可以用for循環來做,你可以實際測試一下,把時間延時到大概一秒左右,然後燒進單片機里運行,比如一個燈亮燈滅的程序,看著燈計數,同時用秒錶計時,幾個幾十次後取平均值就能知道大概時間了。
㈥ 單片機延時程序怎麼寫是根據什麼原理寫的有什麼方法嗎
1、比較死板的方法是自己寫一個delay函數,裡面用for,while等做一些循環,下面是1ms的延時函數
void
delay1ms(void)
{
unsigned
char
i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
具體演算法是//(3j+2)*i=(3×33+2)×10=1010(us),但精確度不高,如果想准確點可以調節相應的參數用示波器來實
現,上面的函數適用於程序簡單,對時間性要求不高,如:點led燈,單個按鍵操作等等。
2,就是用定時器中斷裡面設定標志位來產生延時的方法,比如你可以把定時器設定為每1ms進一次中斷,在中斷裡面
把一個標志位(如flag)置一
當你需要1ms延時的時候你可以先初始化定時器,然後查詢標志位是否置一,置一則執行if後面的語句,即if(fla{};
當你需要10ms延時時,你可以把flag設置為uchar,中斷裡面flag++;外面查詢用if(10==flag){};
以此類推,上面的方法精確度高適用地方。
㈦ 51單片機中延時程序
1. sleep()是以毫秒計算的,延時5秒是sleep(5*1000);,延時5分是sleep(5*1000*60);
2.包含的頭文件看你用的什麼編輯軟體。
3.我用的VC++是用包含在#include<windows.h>頭文件中。
#include<stdio.h>#include<windows.h>//Sleep()的頭文件 main() { int i;
int n=10;for(i=1;i<=n;i++) {printf("%d",i);Sleep(5*1000*60);} //
這里修改延時時間,
有些人說是用#include<dos.h>做頭文件你自己試下吧。
還用Sleep的S是大寫的,不是小寫的。
㈧ 關於單片機延時程序
void timer0_zd() interrupt 1 //定時器0,定時中斷子程序
{
TL0 = 0x00; // 設置定時器初值
TH0 = 0x4C; // 設置定時器初值
a++; //開關按下延時,延時到之後,電磁閥開始動作。
if(a==20) //延時20*50毫秒 = 1秒
{
flag0=1;
}
}
很明顯進入中斷,a == 20的時候flag0標志置位,aut1 = 0;如果你a不清零的話,a++一直加加到溢出,所以出錯,如果你清零了,中斷進入一次a+1 到20請aut1就會一直輸出
㈨ 單片機延時程序是怎麼實現的
延時是靠CPU執行無關指令,把時間浪費掉。
具體來說,DJNZ指令需要2個周期,循環250次就是500個周期,兩層循環就是500*500個周期,你調用一次DELAY子程序,CPU就空轉250000個周期(注意這個計算不精確),如果晶振是12MHz,那就意味著時間過去了250ms,也就是延時250ms