delay 100

單片機c語言中的delay_ms(250) 是什么意思

delay 100

文章插圖

意思就是延遲250ms , 250就是100ms延時子函數寫成1ms的 。voiddelay(chari){charj=0;for(i=0;i<255;i++)for(;i<255;j++)}voidmain(){delay(100);}擴展資料單片機C語言變量作用域#include//包含頭文件sbitled=P0^0;unsignedcharcount=0;//定時累計變量 , 我們需要1000ms定時 , 50*20=1000//count是全局變量 , 通俗地說就是程序每次重新執行時值保持住最近一次的值voidmain(){TMOD=0x01;//設置定時器0工作方式1 , 16位計數TH0=(65536-45872)/256;//晶振11.0592MHz , 定時50ms時TH0初值TL0=(65536-45872)%256;//晶振11.0592MHz , 定時50ms時TL0初值EA=1;//開啟總中斷ET0=1;//開啟定時器0中斷TR0=1;//啟動定時器0while(1){if(20==count)//1000ms定時時間到{count=0;//清零 , 使得可以再次定時1000msled=~led;//P0.0電平取反 , 也就實現LED燈的熄滅或者點亮}//這部分代碼放到主函數里 , 中斷服務程序中只有定時器初值的重新賦值和count變量的累加}}voidT0_INT()interrupt1//大家對照著上述格式看看{TH0=(65536-45872)/256;//晶振11.0592MHz , 定時50ms時TH0初值TL0=(65536-45872)%256;//晶振11.0592MHz , 定時50ms時TL0初值//重裝初值 , 這個很好理解 , 我們需要每次定時的時間相同count++;//每進入一次中斷 , 也就是說50ms時間到了 , count變量進行累計//中斷服務程序簡潔 , 高效}
請問單片機中的delay()的單位時間是什么?
delay 100

文章插圖

單片機中的delay()的單位時間不是系統提供的 , 而是用戶自己編制的 。如果用循環語句實現的循環 , 沒法計算 , 但是可以通過軟件仿真看到具體時間 , 但是一般精精確延時是沒法用循環語句實現的 。如果想精確延時 , 一般需要用到定時器 , 延時時間與晶振有關系 , 單片機系統一般常選用11.059 2 MHz、12 MHz或6 MHz晶振 。第一種更容易產生各種標準的波特率 , 后兩種的一個機器周期分別為1 μs和2 μs , 便于精確延時 。本程序中假設使用頻率為12 MHz的晶振 。最長的延時時間可達216=65 536 μs 。若定時器工作在方式2 , 則可實現極短時間的精確延時;如使用其他定時方式 , 則要考慮重裝定時初值的時間(重裝定時器初值占用2個機器周期) 。擴展資料單片機C語言程序中延時函數delay的原理是:僅僅執行一些 , 沒有實質性影響的所謂“無意義指令” , 比如做比大小啊 , 做某個int的自加運算啊之類的 。單片機的有些程序需要調用延時程序 , 合理的安排循環次數以及空操作的個數方法:用匯編的話就根據你的當前晶振頻率去推算你的指令周期 , 然后結合需要延遲的時間 。編寫延遲程序 , 用C的話還是要看最后生成的匯編碼是什么樣的了 。最簡單的方法就是寫好程序以后再編譯器里軟仿真看時間 。單片機C語言延時需注意的問題:標準的C語言中沒有空語句 。但在單片機的C語言編程中 , 經常需要用幾個空指令產生短延時的效果 。這在匯編語言中很容易實現 , 寫幾個nop就行了 。在keil C51中 , 直接調用庫函數:#include // 聲明了void _nop_(void);_nop_(); // 產生一條NOP指令作用:對于延時很短的 , 要求在us級的 , 采用“_nop_”函數 , 這個函數相當匯編NOP指令 , 延時幾微秒 。NOP指令為單周期指令 , 可由晶振頻率算出延時時間 , 對于12M晶振 , 延時1uS 。對于延時比較長的 , 要求在大于10us , 采用C51中的循環語句來實現 。
52單片機C語言中Delay是什么意思?怎么用?一般延時1ms的程序是:
void Delay(uint x)
{
uchar i;
while(x--)
{
for(i=120;i>0;i--);
}
}

那么當你在別的函數中用到Delay(10000);就是延時10000ms , 也就是10S

單片機 delay() 延時問題就是簡單的LED燈亮滅 。void delay(uint l)//延時 lmS
{
uchar k,j;
for (k=0;k<l;k++)
for (j=0;j<110;j++);

}

你這個函數定義的不對 , 死了 , 你的 I是uint 類型的 , 可以到1000 , 你的K,J是uchar型的 , 最大到255 , 所以直接死在這里了 , 永遠不可能大于 K 大于1000
你把K和J的類型與 I統一了

51單片機匯編的延時DELAY怎么算的;以下按12M晶振計算,#后面的數最大可以是255
DELAY:MOV R7,#10;1
MOV R6,#100;10*1
MOV R5,#200;10*100*1
DJNZ R5, $; 10*100*200*2
DJNZ R6, $ - 4;10*100*2
DJNZ R7, $ - 8;10*2
RET;2
Total=1+10*1+10*100*1+10*100*200*2+10*100*2+10*2+2=403033微秒

delay-100ms延時函數是如何延時的?煩請逐行注釋一下 , 特別是return 1和return 0的作用 , 看不明白return 1是當前的延時還沒有結束 ,  return 0 是延時完成
延時的最小間隔是TIME1_UP_IRQHandler的間隔時間  , 如果是100ms, 每調用一次就會將Delaycount減去1 , 就是1個Delaycount就會產生一個100ms的延時 , 所以
uint8_t Delay_100ms( uint32_t interval )
{
if( Delaycount != 0 )

return 1 ; // 當前的延時沒有結束 ,  這個判斷可能是使用的硬件中斷

Delaycount = interval ; // 間隔就是100ms , interval的值就是多少個100ms, 賦初值
while(Delaycount > 0 ) ;// 等待延時結束

return 0 ; // 延時結束

}

這個1秒延時程序怎么理解你好 , 很高興為你解答
2秒一般不會用延時函數做 , 應該用定時器實現
delay延時函數一般定時幾毫秒~100毫秒
當然 , 可以調用delay100ms函數20次
希望我的回答對你有所幫助
如有其他問題 , 可以繼續追問 , 
您的采納是我前進的動力!

51單片機 , 定時器每20ms進中斷 , 中斷里執行100ms軟件延時函數 , 當100ms延時函數執行20【delay 100】首先 , 你這么做不科學 。
不應在中斷里進行延時 。
回答你的問題 , 
“定時中斷中執行20ms后應該再次進定時中斷” , 在51中 , 不是這樣的 。51內部有記錄中斷服務級別的標志 , 每個中斷優先級有一個標志 , 這個標志用戶程序是看不到的 。進行中斷后 , 對應優先級的中斷服務狀態標志自動被置位 , 同級別的中斷都不再響應 , 也就是說 , 定時中斷不會再次進定時中斷 , 執行reti指令后 , 這個標志自動被復位 , 同級別的中斷才會繼續響應 。
假設不是51系統 , 比如ARM , 進入中斷后 , 可以手動允許同級別的中斷繼續響應 , 這時再次中斷后是延時100ms還是80ms , 取決于你的延時程序 。如果延時程序的變量是建立在棧上的局部變量 , 每次調用delay , 都會一組新的變量 , 也就是說 , 延時每次都是100ms 。如果是用的靜態變量 , 或者全局變量 , 則有可能 , 只延時80ms 。

單片機程序LED流水燈中 ,  如圖程序 , 書上說延時60ms , 有沒有什么公式嗎?比如我要延時100ms不同的芯片的頻率不一樣 , 他這個函數也不能保證就是60ms 。
建議看看是否在庫中有delay函數

設單片機的晶振頻率為6MHZ編寫一段延時程序約延時100ms的子程序機器周期=12/6MHz=2μs
定時100ms的計數值 =100ms/2μs =50000
設T1工作于方式1(16位計數器)
計數初值 =2^16 -50000=65536=15536=3CB0H
MOV TMOD,#10H ;; T1工作方式1、定時模式
MOV TH1,#3CH;; 寫入計數初值高8位
MOV TL1,#B0H;; 寫入計數初值低8位
SETB TR1;; 啟動T1 , 開始計時
SETB ET1;; 允許T中斷
SETB EA;; CPU開中斷
SJMP $; ; 等待T1計時溢出中斷

delay延時函數 , 麻煩哪位給逐句注釋一下 while(Delaycount>0); return 0; }如果在程序中X=10(你寫程序時肯定會給他賦一個值 , 在這里假定是10) , 即在程序的某處會有delay(10)這樣的語句 。相當于循環了600*X=600*10=6000次 ??梢愿鶕约旱男枰獊矶?。你說得對 , 可以寫一個就行 。但是有些芯片 , 你在控制他時 , 時序要求非常嚴格 , 如果延時太長或延時太短 , 都不會運行出結果 。如果需要小延時的地方(只需幾個us) , 只寫一個就可以 。如果需要延時幾ms , 只寫一個 , 可能達不到延時要求 。總而言之 , 要根據你的程序需要 , 時間長了 , 學的多了 , 也就懂了 。希望我的回答 , 能給你提供點幫助

C語言 遞歸調用中是如何實現求最值的? 遞歸調用在return語句前 , 怎么返回? 幫忙解釋一下 , 謝這就是一個很正常的遞歸調用 。
要理解遞歸的執行過程 , 告訴你一個方法:
在函數f的第一個語句前加上printf("begin:%d\n",n);
在return之前加上printf("end return:%d\n",n); //(注意大括號)
這樣執行后你就知道實際的執行順序了 , 跟著打印出來的慢慢分析 , 就可以理解遞歸的實際過程 。

一個有關問題 , TCP是絕對100%可靠的嗎在多線程任務中 , TCP任務通過三次握手能建立可靠的連接 , 但是經常會發生在數據傳輸或通信時發生網絡突然斷開或者長時間連接空循環監聽而未進行操作 , 需要在軟件設計時考慮程序運行中檢測到服務器對客戶端的這一“虛連接”現象 。

如果主機崩潰 , write是否阻塞取決于內核的tcp緩沖區 , 但read將一直阻塞 , 直到超時ETIMEOUT , 或由于某些中間路由器的原因返回EHOSTUNREACH/ENETUNREACH 。select不能檢測到該情況 。
如果主機崩潰并重起 , 客戶的write到達主機時主機響應RST , 客戶的read將返ECONNRESET 。
此處的”非正常斷開”指TCP連接不是以優雅的方式斷開,如網線故障等物理鏈路的原因,還有突然主機斷電等原因
。

心跳機制

有兩種方法可以檢測:1.TCP連接雙方定時發握手消息
2.利用TCP協議棧中的KeepAlive探測
第二種方法簡單可靠,只需對TCP連接兩個Socket設定KeepAlive探測,所以本文只講第二種方法在Linux,Window2000下的實現(在其它的平臺上沒有作進一步的測試)

1)Windows平臺

C代碼

//定義結構及宏

struct TCP_KEEPALIVE {

u_longonoff;

u_longkeepalivetime;

u_longkeepaliveinterval;

} ;

#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)

//KeepAlive實現

TCP_KEEPALIVE inKeepAlive = {0}; //輸入參數

unsigned long ulInLen = sizeof(TCP_KEEPALIVE);

TCP_KEEPALIVE outKeepAlive = {0}; //輸出參數

unsigned long ulOutLen = sizeof(TCP_KEEPALIVE);

unsigned long ulBytesReturn = 0;

//設置socket的keep alive為5秒 , 并且發送次數為3次

inKeepAlive.onoff = 1;

inKeepAlive.keepaliveinterval = 5000; //兩次KeepAlive探測間的時間間隔

inKeepAlive.keepalivetime = 5000; //開始首次KeepAlive探測前的TCP空閉時間

if (WSAIoctl((unsigned int)s, SIO_KEEPALIVE_VALS,

(LPVOID)&inKeepAlive, ulInLen,

(LPVOID)&outKeepAlive, ulOutLen,

&ulBytesReturn, NULL, NULL) == SOCKET_ERROR)

{

ACE_DEBUG ((LM_INFO,

ACE_TEXT ("(%P|%t) \WSAIoctl failed. error code(%d)!\n"), WSAGetLastError()));

}
//定義結構及宏 struct TCP_KEEPALIVE { u_longonoff; u_longkeepalivetime; u_longkeepaliveinterval; } ; #define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4) //KeepAlive實現 TCP_KEEPALIVE inKeepAlive = {0}; //輸入參數 unsigned long ulInLen = sizeof(TCP_KEEPALIVE); TCP_KEEPALIVE outKeepAlive = {0}; //輸出參數 unsigned long ulOutLen = sizeof(TCP_KEEPALIVE); unsigned long ulBytesReturn = 0; //設置socket的keep alive為5秒 , 并且發送次數為3次 inKeepAlive.onoff = 1; inKeepAlive.keepaliveinterval = 5000; //兩次KeepAlive探測間的時間間隔 inKeepAlive.keepalivetime = 5000; //開始首次KeepAlive探測前的TCP空閉時間 if (WSAIoctl((unsigned int)s, SIO_KEEPALIVE_VALS, (LPVOID)&inKeepAlive, ulInLen, (LPVOID)&outKeepAlive, ulOutLen, &ulBytesReturn, NULL, NULL) == SOCKET_ERROR) { ACE_DEBUG ((LM_INFO, ACE_TEXT ("(%P|%t) \WSAIoctl failed. error code(%d)!\n"), WSAGetLastError())); }

2)Linux平臺

C代碼

#include

……

////KeepAlive實現

//下面代碼要求有ACE,如果沒有包含ACE,則請把用到的ACE函數改成linux相應的接口

int keepAlive = 1;//設定KeepAlive

int keepIdle = 5;//開始首次KeepAlive探測前的TCP空閉時間

int keepInterval = 5;//兩次KeepAlive探測間的時間間隔

int keepCount = 3;//判定斷開前的KeepAlive探測次數

if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)

{

ACE_DEBUG ((LM_INFO,

ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!\n")));

}

if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)

{

ACE_DEBUG ((LM_INFO,

ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!\n")));

}

if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)

{

ACE_DEBUG ((LM_INFO,

ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!\n")));

}

if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)

{

ACE_DEBUG ((LM_INFO,

ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!\n")));

}

心跳機制:定時發送一個自定義的結構體(心跳包) , 讓對方知道自己還活著 , 以確保連接的有效性 。

網絡中的接收和發送數據都是使用WINDOWS中的SOCKET進行實現 。但是如果此套接字已經斷開 , 那發送數據和接收數據的時候就一定會有問題 ??墒侨绾闻袛噙@個套接字是否還可以使用呢?這個就需要在系統中創建心跳機制 。其實TCP中已經為我們實現了一個叫做心跳的機制 。如果你設置了心跳 , 那TCP就會在一定的時間(比如你設置的是3秒鐘)內發送你設置的次數的心跳(比如說2次) , 并且此信息不會影響你自己定義的協議 。所謂“心跳”就是定時發送一個自定義的結構體(心跳包或心跳幀) , 讓對方知道自己“在線” 。以確保鏈接的有效性 。

所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已 。代碼就是每隔幾分鐘發送一個固定信息給服務端 , 服務端收到后回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開 。比如有些通信軟件長時間不使用 , 要想知道它的狀態是在線還是離線就需要心跳包 , 定時發包收包 。發包方:可以是客戶也可以是服務端 , 看哪邊實現方便合理 。一般是客戶端 。服務器也可以定時輪詢發心跳下去 。心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次 , 以此來告訴服務器 , 這個客戶端還活著 。事實上這是為了保持長連接 , 至于這個包的內容 , 是沒有什么特別規定的 , 不過一般都是很小的包 , 或者只包含包頭的一個空包 。在TCP的機制里面 , 本身是存在有心跳包的機制的 , 也就是TCP的選項 。系統默認是設置的是2小時的心跳頻率 。但是它檢查不到機器斷電、網線拔出、防火墻這些斷線 。而且邏輯層處理斷線可能也不是那么好處理 。一般 , 如果只是用于?;钸€是可以的 。心跳包一般來說都是在邏輯層發送空的包來實現的 。下一個定時器 , 在一定時間間隔下發送一個空包給客戶端 , 然后客戶端反饋一個同樣的空包回來 , 服務器如果在一定時間內收不到客戶端發送過來的反饋包 , 那就只有認定說掉線了 。只需要send或者recv一下 , 如果結果為零 , 則為掉線 。但是 , 在長連接下 , 有可能很長一段時間都沒有數據往來 。理論上說 , 這個連接是一直保持連接的 , 但是實際情況中 , 如果中間節點出現什么故障是難以知道的 。更要命的是 , 有的節點(防火墻)會自動把一定時間之內沒有數據交互的連接給斷掉 。在這個時候 , 就需要我們的心跳包了 , 用于維持長連接 , ?;?。在獲知了斷線之后 , 服務器邏輯可能需要做一些事情 , 比如斷線后的數據清理呀 , 重新連接呀當然 , 這個自然是要由邏輯層根據需求去做了 。總的來說 , 心跳包主要也就是用于長連接的?;詈蛿嗑€處理 。一般的應用下 , 判定時間在30-40秒比較不錯 。如果實在要求高 , 那就在6-9秒 。

TCP連接異常斷開后操作系統會告訴你 , 你查詢套接字的狀態會得到異常 , 或者當發現函數失敗WSAGetLastError的時候也會得到內核的通知 。

// 發送回應消息
int nSend = Send4IntMsg(sock, (char*)(LPCTSTR)strSendBuf,
strSendBuf.GetLength(), errMsg);
if (nSend < 0) //
發送消息失敗
closesocket(sock);//重新連接

在B/S編程和UDP編程時才用到心跳 。比如定期向web服務器發一個request證明自己在線 。http協議是請求一下就斷開了 , 每次都要重新連接 , 重新請求 , 這種情況下才有必要用心跳機制 。一般的TCP通信都是長連接 , 不可能頻繁連接和斷開 。對于長期保持連接的情況 , 一旦斷開 , 操作系統底層都會通知你 , 你需要解決的是如何獲取到系統的通知 。

f(n)=f(n-1)+n(n>1)的遞歸出口是? A.f(1)=0和B.f(1)=1有什么區別嗎?答案為什么選B呢?求高手解釋從題目來看 , 這道題是計算f(n)= 1+2+3+4+......+n的 , 對吧那么之類做最簡單的情況 , f(2)應該是多少呢?應該是1+2=3 , 對吧那么帶入這個函數中 , 假設n=2 , 展開就是f(2)=f(2-1)+2能理解嗎?f(2-1)是多少 , 是f(1)對吧 , 那么假設選A的話 , 結果就是0+2了 , 顯然不符合1+2的題意 , 故選B⋯⋯

“Delay”是什么意思?delay英音:[di'lei]美音:[dɪ'le]

詞典解釋

delay
及物動詞 vt.

1. 延緩;使延期

2. 耽擱;延誤

LeftClick 1 Delay 100 KeyPress "X", 1 Delay 100 RightClick 1 Delay 100 KeyPress "F", 1您好 , 由于不清楚您手機的詳細情況 , 請撥打4008123456向客服詳細說出具體問題 。我們客服MM會向您做出解答 。
請采納 , 謝謝!感謝您的提問 , 希望能夠幫助到您 。
TCL手機客服電話:4008123456
TCL手機百度知道提問平臺:http://zhidao.baidu.com/c/TCLmobile
TCL手機官方貼吧:http://tieba.baidu.com/f?kw=tcl%CA%D6%BB%FA&fr=index

單片機:delay(100)是什么意思???
delay 100

文章插圖

delay通常是延時程序 , 其參數為100 , 一般這個參數都是delay基本延時的倍數 , 也就是100倍 , 至于基本延時時長需要給出具體程序 , 例如:delay(int time){ int i;for (i=0;i<time;i++);}擴展資料:函數名: delay功 能: 將程序的執行暫停一段時間(毫秒)(該函數是TC下特有的函數 , VC下應使用Sleep()函數)用 法: void delay(unsigned milliseconds);單片機在電子技術中的開發 , 主要包括CPU開發、程序開發、 存儲器開發、計算機開發及C語言程序開發 , 同時得到開發能夠保證單片機在十分復雜的計算機與控制環境中可以正常有序的進行 。參考資料來源:百度百科-單片機參考資料來源:百度百科-delay()
LeftClick 1 Delay 6000 怎么改后臺的 具體使用呢?Dim HwndHwnd=Plugin.Window.MousePoint()Delay 100Call Plugin.Bkgnd.LeftClick(Hwnd, 0, 0)'后臺鼠標按鍵需要坐標 , 自己更改(0 , 0) , 就是你點鼠標的前臺坐標Delay 6000

按鍵精靈 循環按技能跟鼠標按鍵 怎么設置假如 KeyPress "E", 1 Delay 100000 LeftClick 1 MoveTo 774, 350你的需求是
按E鍵一次后 停100秒 左鍵單擊 1次 之后鼠標移到你指定的坐標
如果你想讓它開動后就這樣不停的運行下去的話 , 代碼如下:
Rem start
KeyPress "E", 1
Delay 100000
LeftClick 1
MoveTo 774, 350
Goto start

這個延時函數怎么看?為什么是延時100ms表面上看 , 好像i+10怎么會與timeval相等呢?是個死循環 。
其實 , 這里timeval是個外部變量 , 應該是在定時中斷中(滿足10mS)自加的一個變量 。定時的實現 , 沒有完全在這里體現 。定時中斷程序如果你找到 , 并看了 。就明白答案了 。

關于C語言的一些時間函數和延時函數都有哪些?標準庫的time.h里有幾個時間函數,先教你個實用的把

time_t time (time_t *timer)
計算從1970年1月1日到當前系統時間,并把結果返回給timer變量,函數本身返回的也是這個結果.time_t這個類型其實就是一個int.

doubledifftime ( time_t timer2, time_t timer1 )

把返回time2和time1所儲存的時間的差.

利用上面這兩個函數可以計算某階段程序運行用掉的時間.


例如:

#include
#include

int main ()
{
time_t start,end;
char szInput [256];
double dif;

time (&start);
printf ("Please, enter your name: ");
gets (szInput);
time (&end);
dif = difftime (end,start);
printf ("Hi %s.\n", szInput);
printf ("You have taken %.2lf seconds to type your name.\n", dif );

return 0;
}

輸出如下:
Please, enter your name: Juan Soulie
Hi Juan Soulie.
You have taken 3.00 seconds to type your name.

C語言延時函數學過匯編你就會知道 , 每條指令都占一定的時間(或者機器周期)的 , 如果你讓機器什么都不做 , 即空指令的話 , 機器就會延時 , 然后你在計算好每次延時到底有多長 , 外面套一個循環(或者多重循環) , 根據你想要的延時時間即可計算出來循環的次數  , 延時函數基本上都是這種原理 , 它的參數就是用來控制循環次數的 。

關于延時函數這就是用C編程的缺點 , 你可以到網上搜個延時轉化的小工具 , 單純這樣問 。。。很無奈 。。

單片機c語言中的delay_ms(250) 是什么意思你好!
是自己寫的一個函數 , 根據時鐘頻率計算下 , 意思應該就是延遲250ms
我的回答你還滿意嗎~~

單片機C語言中0L表示什么意思?1、C語言中0L表示這個數0為長整型 。
2、數據類型不一致時 , 經常會發生錯誤 , 或出現警告 , 默認使用0時 , 會開辟一個整型空間而不是長整型空間 , 而使用0L則會開辟長整型空間 。
3、初始化一個長整型變量時 , 我們也經常用long x=0L;來表示 。

stm32中Delay()函數延時的時間是怎么計算的?
delay 100

文章插圖

單片機編程過程中經常用到延時函數 , 最常用的莫過于微秒級延時delay_us()和毫秒級delay_ms() 。1.普通延時法這個比較簡單 , 讓單片機做一些無關緊要的工作來打發時間 , 經常用循環來實現 , 不過要做的比較精準還是要下一番功夫 。下面的代碼是在網上搜到的 , 經測試延時比較精準 。//粗延時函數 , 微秒void delay_us(u16 time){u16 i=0;while(time--){i=10; //自己定義while(i--) ;}}//毫秒級的延時void delay_ms(u16 time){u16 i=0;while(time--){i=12000; //自己定義while(i--) ;}}2.SysTick 定時器延時CM3 內核的處理器 , 內部包含了一個SysTick定時器 , SysTick 是一個24 位的倒計數定時器 , 當計到0 時 , 將從RELOAD寄存器中自動重裝載定時初值 。只要不把它在SysTick控制及狀態寄存器中的使能位清除 , 就永不停息 。SysTick 在STM32的參考手冊里面介紹的很簡單 , 其詳細介紹 , 請參閱《Cortex-M3 權威指南》 。這里面也有兩種方式實現:a.中斷方式如下 , 定義延時時間time_delay , SysTick_Config()定義中斷時間段 , 在中斷中遞減time_delay , 從而實現延時 。volatile unsigned long time_delay; //延時時間 , 注意定義為全局變量//延時n_msvoid delay_ms(volatile unsigned long nms){//SYSTICK分頻--1ms的系統時鐘中斷if (SysTick_Config(SystemFrequency/1000)){while (1);}time_delay=nms;//讀取定時時間while(time_delay);SysTick->CTRL=0x00; //關閉計數器SysTick->VAL =0X00; //清空計數器}//延時nusvoid delay_us(volatile unsigned long nus){//SYSTICK分頻--1us的系統時鐘中斷if (SysTick_Config(SystemFrequency/1000000)){while (1);}time_delay=nus;//讀取定時時間while(time_delay);SysTick->CTRL=0x00; //關閉計數器SysTick->VAL =0X00; //清空計數器} //在中斷中將time_delay遞減 。實現延時voidSysTick_Handler(void){if(time_delay)time_delay--;
單片機延時delay()函數為什么里面變量填5000卻是5000ms而不是500ms“一條語句是一條指令嗎”
不一定 , 取決于編譯后的結果 。
所以你需要了解一下這個110是怎么回事……了解一下編譯后的指令為什么是9個周期……

求教:舵機如何通過程序減速?舵機的轉速太快 , 如何通過程序給減速 。PWM就不用說了 。我給你一段PID的代碼:
#define AA_KPVALUE 150#define AA_KIVALUE 100#define AA_KDVALUE 30
typedef struct PID{ sint an_Ref;//角度PID , 角度設定值sint an_FeedBack;//角度PID , 角度反饋值 sint an_PreError;//角度PID , 前一次 , 角度誤差,,an_Ref - an_FeedBacksint an_PreDerror; //角度PID , 前一次 , 角度誤差之差 , d_error-PreDerror; sint an_Kp;//角度PID , Ka = Kp sint an_Ki;//角度PID , Kb = Kp * ( T / Ti ) sint an_Kd;//角度PID , sint an_PreU;//舵機控制輸出值}PID;

PID sPID;//申請一個PID類型的變量

void PIDInit(void)//PID初始化{sPID.an_Ref = 0 ;sPID.an_FeedBack = 0 ;sPID.an_PreError = 0 ;sPID.an_PreDerror = 0 ;sPID.an_Kp = AA_KPVALUE;sPID.an_Ki = AA_KIVALUE; sPID.an_Kd = AA_KDVALUE;sPID.an_PreU = 0 ;}
unsigned int PIDCalc( PID *pp )//返回值賦給舵機 {sint error,d_error,dd_error;error = pp->an_Ref - pp->an_FeedBack;d_error = error - pp->an_PreError;dd_error = d_error - pp->an_PreDerror;pp->an_PreError = error;pp->an_PreDerror = d_error; pp->an_PreU +=pp->an_Kp*error+pp->an_Ki*d_error+pp->an_Kd*dd_error ;return ( pp->an_PreU); }在主函數中初始化PID , 將設定值與返回值設置好后 , 調用unsigned int PIDCalc( PID *pp )把返回值給舵機 。
設定值就是你想要讓舵機轉的角度賦給sPID.an_Ref , 返回值就是舵機現在的角度 。因為是一個閉環控制系統 , 需要將角度量化以后的值返回 , 賦給sPID.an_FeedBack , 這個算法會根據設定值與現在所處的角度計算出下一次所偏轉的角度 , 這是一種增量式數字PID的算法 。若想修改轉的速度就修改宏定義中這三個參數的值 , 其中AA_KPVALUE影響最大 。PID的東西很多 , 我也只是初窺門徑 。希望對你有所幫助

怎么控制舵機轉動的速度?是速度不是角度?。?!更換液壓泵

如何控制舵機轉速?舵機轉速這個是控制信號 , 你要反應速度那個只能換舵機了

控制一個舵機跟連續控制多個舵機轉過的角度不同 這是為什么?這是因為不是每個舵機的機械性質都一樣的 , 一般情況下 , 控制一個舵機 , 改變占空比 , 改變多少 , 舵機轉動相應的角度 , 但是不是每個舵機轉角特性都一樣 , 一樣的占空比改變 , 不一定能轉動相同角度 , 如果想轉同相同角度需要進行校準

鋼琴五線譜上的有關速度的單詞有那些 , 分別是什么意思?Grave 極緩板 -- 莊嚴而緩慢, 與 Larghissimo, Lentissimo, Adagissimo 接近Largo 最緩板 M. M. = 40 - 60Larghetto 稍緩板 M. M. = 60 - 66Lento 緩板 -- 速度介於最緩板和慢板之間Adagio 慢板 M. M. = 66 - 76Andante 行板 M. M. = 76 - 108Andantino 小行 板 -- 比行板稍快, 介於行板和中板之間Moderato 中板 M. M. = 108 - 120Allegretto 稍快板 -- 較快板稍慢, 介於中板和快板之間Allegro 快板 M. M. = 120 - 168Vivace 甚快板 -- 含有活潑的甚快板之意, 速度介於 Allegro 和 Presto 之間Presto 急板 M. M. = 168 - 200Prestissimo 最急板 M. M. = 200 - 208ritardando (rit.) 漸慢 -- poco a poco rit. 一點一點漸慢rallentando (rall.) 漸慢 --accelerando (accel.) 漸快, 加快 --a tempo 恢復原速Allegro giusto 適度的快板, 至於"適度"是多快? 並無絕對, 依各樂曲風格而定Allegro Comodo 從容的快板Allegro Moderato 類似稍快板, 速度介於中板(Moderato)和快板(Allegro)之間Allegro Vivace 速度介於快板(Allegro)和甚快板(Vivace)之間rubato 彈性速度, 在一定範圍內, 依表情需要可做適度的漸快漸慢處理Fermata 延長記號, 英文稱作 "Bird's eye" or "Hold".

AVR自帶延時函數 , _delay_ms() _delay_loop_2()要想使_delay_ms()正常工作需要正確定義常量F_CPU為所采用的時鐘頻率 , 以Hz為單位 , 若沒有定義則系統默認定義為# define F_CPU 1000000UL , 也就是1MHz , 并在編譯時出現警告 warning "F_CPU not defined for " , 所以如果你的時鐘不是1MHz時要正確定義F_CPU , 再有_delay_ms()延時以毫秒為單位 , 你的_delay_ms(1000)延時了整整1秒 , 因而用在你的函數DelayMs(300)里要延時300秒 , 你耐心等上5分鐘它會變低的 。其實_delay_ms()函數內部調用了_delay_loop_2() , 這個函數內部執行空循環 , 每個循環要四個時鐘周期 , 忽略開始時設置寄存器所需時間,在1MHz時鐘頻率時_delay_loop_2(1000)延時4ms , 你的DelayMs(300)將延時大約1.2秒 , 所以很容易看到IO口高低變換 , 當然如果你的時鐘頻率不是1MHz , 那么具體時間就要具體計算了 。

avr單片機delay延時函數問題你覺得一個for循環所有部分是一個指令周期嗎 , 里面有個三個指令

用GCC寫的mega128的測試程序 , 加了_delay_ms()函數就不好使了 , 不知道為什么 。程序貼下面了很簡單的是熔絲位設置問題!!mega128A是兼容mega128的 。在你把程序加載到單片機之前 , 在軟件里設置一下熔絲位 , 一般軟件默認是片內RC振蕩器 , 所以選擇外部晶振我用PROGISP(Ver1.6.8)直接用ISP下載所以要這樣設置(參考圖片)!??!AVR studio里也應該有設置的注意:熔絲位不要亂設置會引起鎖死!!到那時就慘了!!
這兩個延時程序的區別是不是一個us一個msx=100
delay_us(100)--i循環100次 j循環12 次
delay_ms(100)--i循環100次 j循環120 次, 多 100 * 10 次
x=100 時 , 兩個程序耗時 為 1比100 , 像似 微秒 和 毫秒 。
如果 x=1 兩個程序耗時比 為10.
猜測 delay_us(100)是1微秒 , delay_ms(100)是1毫秒 。
實際上 , 計算機速度不同 。這個程序的時間精度難說 。

精確計時可用 QueryPerformanceCounter()函數返回當時時鐘讀數 , 計時開始用它得到開始讀數 , 計時結束用它得到結束讀數 , 兩個數相減是時間差讀數 。讀數轉換為時間 , 要用QueryPerformanceFrequency()函數獲得時鐘頻率 , 讀數除以時鐘頻率 , 得時間 , 單位是秒 。乘1000得毫秒 。
還有一種方法是用Pentium芯片匯編指令 0x0F 和 0x31 , 讀取時鐘計數圖章 , 類似QueryPerformanceCounter()函數 , 計時開始和結束分別調用一次 , 得讀數差 , 并扣除執行一次調用函數消耗的額外時間 。如果知道CPU速度可以算得時間 , 如果知道時間 , 可以估算CPU速度 。

怎樣在excel表格中同時縮小數據 , 例如100倍A1為數據 , B1=A1/100回車 。
A2起有數據的 , B1(變黑十字)下拉 。

你好 。我想問一下 , word的里面有100個表格想要與excel里面的數據鏈接問題 。如果都是一模一樣 , 完全用不著做100個表 , 用一個表 , 郵件合并功能就足夠了 。

電子表格里的數值怎么會由100變成99.5輸入99.5如不顯示小數的話 , 即為100 , 設置了顯示小數位數的話 , 就會顯示為99.5  , 見附圖 。
電子表格怎么樣把所有單位的數值全加100在空單元格中輸入 100
然后復制該單元格 , 選擇所有你要加的數的區域 , 右鍵選擇性粘貼 , 選擇數值 , 下面選擇 加  , 確定

EXCEL表中 , 把小于100的數據怎么加???沒有實際的行列號?
假設在ABCDEF列
F2
=SUMPRODUCT(($A$2:$A$10=E2)*($B$2:$B$10<100)*($C$2:$C$10))
下拉