1. 請問單片機中的delay()的單位時間是什麼
單片機中的delay()的單位時間不是系統提供的,而是用戶自己編制的。
如果用循環語句實現的循環,沒法計算,但是可以通過軟體模擬看到具體時間,但是一般精精確延時是沒法用循環語句實現的。
如果想精確延時,一般需要用到定時器,延時時間與晶振有關系,單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振。第一種更容易產生各種標準的波特率,後兩種的一個機器周期分別為1 μs和2 μs,便於精確延時。本程序中假設使用頻率為12 MHz的晶振。
最長的延時時間可達216=65 536 μs。若定時器工作在方式2,則可實現極短時間的精確延時;如使用其他定時方式,則要考慮重裝定時初值的時間(重裝定時器初值佔用2個機器周期)。
(1)單片機時間函數擴展閱讀
單片機C語言程序中延時函數delay的原理是:僅僅執行一些,沒有實質性影響的所謂「無意義指令」,比如做比大小啊,做某個int的自加運算啊之類的。
單片機的有些程序需要調用延時程序,合理的安排循環次數以及空操作的個數方法:用匯編的話就根據你的當前晶振頻率去推算你的指令周期,然後結合需要延遲的時間。
編寫延遲程序,用C的話還是要看最後生成的匯編碼是什麼樣的了。最簡單的方法就是寫好程序以後再編譯器里軟模擬看時間。
單片機C語言延時需注意的問題:
標準的C語言中沒有空語句。但在單片機的C語言編程中,經常需要用幾個空指令產生短延時的效果。這在匯編語言中很容易實現,寫幾個nop就行了。
在keil C51中,直接調用庫函數:
#include // 聲明了void _nop_(void);
_nop_(); // 產生一條NOP指令
作用:對於延時很短的,要求在us級的,採用「_nop_」函數,這個函數相當匯編NOP指令,延時幾微秒。NOP指令為單周期指令,可由晶振頻率算出延時時間,對於12M晶振,延時1uS。對於延時比較長的,要求在大於10us,採用C51中的循環語句來實現。
2. 單片機中時間問題
C語言的執行時間,從來就沒有計算公式。
C程序的執行時間,和操作系統有很大的關系,和編譯軟體也有關,在單片機中,更和變數的存儲類型有關(如單位元組變數、兩位元組變數)。
因為有如此多的不確定因素,所以,從來就沒有辦法計算C的執行時間。
只是可以在模擬調試的時候,進行實際測量,得到一些(難以通用的)經驗數據。
樓主要想准確的控制時間,應該研究使用匯編語言,或者使用硬體定時器。
C語言,只能幹些粗活。
3. 單片機延時函數
一個時鍾周期=晶振的倒數
51單片機的一個機器周期=6個狀態周期=12個時鍾周期
一個單周期指令包括一個機器周期,即12個時鍾周期,所以12M晶振的話一條單周期指令執行的時間為12*(1除12M)=1Us
延時更多的話往上乘就是了
4. 求單片機計時器函數代碼
#include#include#define u16 unsigned int#define u8 unsigned char/*********************************************************/u8 ds[2]; //數碼管顯示緩存//共陰code u8 w[]={~0x01,~0x02,~0x04,~0x08};//位碼code u8 d[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,};//斷碼void dispaly(){//顯示函數static u8 a;if(++a>2)a=0;P0=~0xff;P2=w[a];P0=d[ds[a]];}/****************************************/void init()//初始化函數{ TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1; ET0=1;}/***********************************/u16 js_ms=0;u8 count=0;//計數void main()//主函數{init();//系統初始化TR0=1; //定時器開始計時while(1){ ds[0]=count/10%10;ds[1]=count%10;}}/****************************/void timer0() interrupt 1//1ms定時器{ TH0=(65536-1000)/256;//重載初值TL0=(65536-1000)%256;dispaly();//顯示if(++js_ms>=1000){js_ms=0;if(++count>59)count=0;}}
5. 這是PIC單片機中時間顯示函數,我表示不懂,求大神指教
先把時分秒的數字轉成十位和個位,然後將數字轉成ASCII顯示
例如小時的,假如hour=11,sw=hour/10=1,1在這里只是數字,顯示的話要轉換成對應的ASCII碼,所以在顯示的時候加了0x30,即0x31對應字元'1',其餘的代碼同理
6. 怎麼寫段單片機延時函數要用定時器!
1、首先分析您的程序,
void delay()
{
int i;
if(1 == TF0)//if(TF0==1),查詢定時器溢出標志位
{
TF0=0;
i=10000;//定時溢出時給i賦值1000
TH0=0xDC;TL0=0x00;
i--;//i=999,如果還沒有減到0時定時器又溢出,則i永遠不會減到0!!!!所以您的這段程序不應該行不通!!
}
while(1)
{
if(i==0)
break ;
}
}
2、建議做法
(1)定義一個全局變數用於作定時計數如unsigned char n;
(2)定時器採用以某一時間基準(10ms)中斷方式,每中斷一次中斷處理程序里n++;
(3)在延時函數中對n進行操作,如延時1s即1000ms則:
void delay_1s()
{
while(n<100);//如果n<100,即還沒有到1s就等待
n=0;如果1s時間到則清零n,退出子程序
}
當然這樣定時精度可能需要調整,但思路可以試試。
7. 怎麼寫段單片機延時函數要用定時器!
1、首先分析您的程序,
void
delay()
{
int
i;
if(1
==
TF0)//if(TF0==1),查詢定時器溢出標志位
{
TF0=0;
i=10000;//定時溢出時給i賦值1000
TH0=0xDC;TL0=0x00;
i--;//i=999,如果還沒有減到0時定時器又溢出,則i永遠不會減到0!!!!所以您的這段程序不應該行不通!!
}
while(1)
{
if(i==0)
break
;
}
}
2、建議做法
(1)定義一個全局變數用於作定時計數如unsigned
char
n;
(2)定時器採用以某一時間基準(10ms)中斷方式,每中斷一次中斷處理程序里n++;
(3)在延時函數中對n進行操作,如延時1s即1000ms則:
void
delay_1s()
{
while(n<100);//如果n<100,即還沒有到1s就等待
n=0;如果1s時間到則清零n,退出子程序
}
當然這樣定時精度可能需要調整,但思路可以試試。