9、單片機延時(shí)函數的問(wèn)題
void delay(uchar i)
{
uchar j;
while(i--)
{
for(j=125;j>0;j--)
;
}
}
這個(gè)函數中的i,j的大小有**嗎?
答:這個(gè)函數中j的大小和你定義的數據類(lèi)型有關(guān),因為你定義的為無(wú)符號字符型,為單字節數據,所以zui大為255。.
如果你需要增大,可以改變j的數據類(lèi)型定義,如unsigned int (2字節)可以到65535;無(wú)符號長(cháng)整形unsigned long(4字節) 可以到4294967295。 而上面所所256是-1,而你定義的是無(wú)符號字符型。
10、請教一個(gè)AVR單片機延時(shí)的問(wèn)題
外部晶振用的是8MHz,延時(shí)1微秒的程序如下:
void delay_us(unsigned int delay_counter)//延時(shí)1us
{
do
{
delay_counter--;
}
while(delay_counter>1);
}
請問(wèn),為什么能延時(shí)1微秒啊?
答:8MHZ表示單片機的運行周期為1/8us,也就是0.125us執行一步
你使用的是軟件延時(shí)
那么包括程序的提取,執行等都要花費時(shí)間
比如,你提取這個(gè)函數可能花去一步,那現在就使用了0.125us啦
接著(zhù)你執行這個(gè)函數,在單片機內部,運算是通過(guò)寄存器的移來(lái)移去實(shí)現的
這都需要時(shí)間,可能你看到的就一句counter--這個(gè)指令,可能會(huì )花費好幾個(gè)時(shí)鐘周期來(lái)實(shí)現
舉個(gè)例子:
c=a+b,只有一句,但實(shí)際上花費的時(shí)間并不短
mov a,#data1;//數據data1放入a寄存器
mov b,#data2;//數據data2放入b寄存器
add a,b;//寄存器a的值與b相加,結果放入a
mov c,a;//將a的值放入c
這樣才是單片機內部真正執行的指令,這需要花費至少4個(gè)時(shí)鐘周期,而不是1個(gè)
至于晶體管級的我就不解釋了,你得好好學(xué)習匯編才能理解單片機的運作。
至于這個(gè)函數為什么能延時(shí)1ms,這個(gè)是靠經(jīng)驗來(lái)判斷的,zui直接的方法就是用示波器看,以上均為推論。
11、PIC單片機的延時(shí)問(wèn)題 晶振4Mhz:
void delay()
{
unsigned int d=1000;
while(--d){;}
}
此函數在4M晶體下產(chǎn)生10003us的延時(shí),也就是10MS。
問(wèn)題:我剛算了一下他應該執行了999條指令,1條單周期的指令也才1US,那就是999us,為什么會(huì )有10ms的延時(shí)?
1:for(x=100;--x;){;} : 2: for(x=0;x<100;x++){;} 2句話(huà)相同
第 一句:X的值范圍是不是 1~99?為什么?
第 二句:X的范圍是不是0~99?為什么?這么算的。我知道符號在前在后的區別。2句話(huà)應該是不一樣的才對啊!
答:
問(wèn)題1:“我剛算了一下他應該執行了999條指令”因為你算錯了。延時(shí)時(shí)間是由產(chǎn)生的匯編代碼所決定的,C語(yǔ)言語(yǔ)句只是個(gè)假象,千萬(wàn)不要以為C語(yǔ)言一行就是一條指令!此處由于涉及到雙字節減法,因此會(huì )有額外的判斷,編譯結果每次循環(huán)耗費幾十個(gè)周期毫不奇怪。
問(wèn)題2:前一句x從100開(kāi)始遞減,遞減至1時(shí)退出循環(huán)。后一句x從0開(kāi)始遞增,遞增到100時(shí)退出循環(huán)。所謂“2句話(huà)”相同僅僅是指這兩個(gè)循環(huán)體的循環(huán)次數相同。實(shí)際上兩個(gè)循環(huán)的執行過(guò)程是完全不同的,所消耗時(shí)間也有可能不同。
12、stc單片機的延時(shí)問(wèn)題 ,STC10F08XE單片機,晶振22.1184M
void delay(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
for (j=0;j<5;j++)
{
for (g=0;g
{
_nop_();
_nop_();
_nop_();
}
}
}
當uldata=1時(shí)延時(shí)多少秒?
請給出具體算法…………
答:用keil轉換成匯編語(yǔ)句,然后對照指令表計算就行了
13、我想用單片機連接不斷地向電腦發(fā)數,如下:
while (1)
{
send_char('9');
delay(n);
}
如每發(fā)送一個(gè)數,應延時(shí)多少微妙好呢?即一般zui短能延時(shí)多少微米呢?如延時(shí)太長(cháng)的話(huà),那發(fā)送很多數據不就用很長(cháng)時(shí)間嗎?
答:不做太多的串口處理分析,只順著(zhù)你的問(wèn)題和你的方法說(shuō)說(shuō):
先考慮下串口的速率 假設9600,那么發(fā)送一個(gè)字符要多久?
(9600bit/S) / 10bit(一個(gè)字符1+8+1) = 960字符/秒 約 1ms/byte
也就是說(shuō)你如果在1ms內發(fā)送超過(guò)一個(gè)字符就沒(méi)意義了,硬件速度達不到。
while(1)
{
send_char('9');
delay(n);
}
這個(gè)循環(huán)是執行周期也就十幾微秒+delay()的延遲,所以任何小于1040微秒的延遲對串口硬件來(lái)說(shuō)沒(méi)意義,上一個(gè)還沒(méi)處理完,下一個(gè)就來(lái)了根本執行不了嘛。
如果你send_char()里面有while(!TI);TI = 0;這樣的語(yǔ)句或有串口中斷TI的處理的話(huà),那么實(shí)際上你的delay()已經(jīng)在發(fā)送函數里了,while(!TI);這部就是延遲等待嗎?那根本不需要主函數去延遲了,直接發(fā)就行了。
14、一個(gè)單片機延時(shí)子程序的問(wèn)題,在延時(shí)子程序那里,一直搞不明白,給r7和r6賦予0,然后下面的djnz r7,delayloop不就一直循環(huán)了,那還怎么接下去的程序?
[!--empirenews.page--]
org 0000h
ljmp start
org 0030h
start: mov a,#0feh
mov r5,#8
output: mov p1,a
rl a
call delay
djnz r5,output
ljmp start
delay: mov r6,#0
mov r7,#0
delayloop:djnz r7,delayloop
djnz r6,delayloop
ret
end
答: 你的延時(shí)程序不是因為值為0,而是跳轉位置不對,改為如下:
delay: mov r6,#0
delayloop:mov r7,#0
:djnz r7,$
djnz r6,delayloop
ret
R7,R6初值為0,但是當DJNZ執行時(shí),這條指令是先減1再判斷,所以0-1=255,判斷的話(huà)也不為0,仍然循環(huán)256次。
0-1=255的解釋?zhuān)?
0000 0000
- 0000 0001
-------------------------
1111
15、我想提兩個(gè)單片機延時(shí)與按鍵的問(wèn)題
1:如果一個(gè)程序中延時(shí)和按鍵,如果延時(shí)子程序比較長(cháng)(假如2秒),怎樣確保按鍵能夠得到及時(shí)響應(假如PC正在執行延時(shí)子程序,正在這時(shí)候有按鍵輸入,不是響應不了)——,,,前提是不能用定時(shí)器定時(shí)掃描,和中斷來(lái)做,因為定時(shí)器和中斷我另有其他用途
2:?jiǎn)纹瑱C沒(méi)有串口。怎樣才能使得他與24C02進(jìn)行通信(24C02是具有2K內存的EEPROM)
答:
首先明確一點(diǎn)你說(shuō)單片機沒(méi)有串口,應該是指沒(méi)有I2C口吧。
1 在延時(shí)程序里面加入按鍵的檢測
2 用IO口模擬I2C時(shí)序讀寫(xiě)
16、51單片機延時(shí)小程序,求高手解釋什么意思?
delay200ms:
mov r2,#82
l0:mov r1,#116
l1:mov r0,#9
djnz r0,$
djnz r1,l1
djnz r2,l0
ret
答:以下是每條指令的時(shí)間,T為一個(gè)機器周期
delay200ms:
mov r2,#82;1T
l0:mov r1,#116;1T
l1:mov r0,#9;1T
djnz r0,$;2T
djnz r1,l1;2T
djnz r2,l0;2T
ret;2T
以上共三層循環(huán),忽略部分指令,zui簡(jiǎn)單算法是:
2*9*116*82=171216
不忽略指令是:
1+(1+(1+2*9+2)*116+2)*82+2=200001
因此延時(shí)時(shí)間大約為200ms
17、于51單片機延遲時(shí)間的問(wèn)題
uchar i;i--;
uint i;i--;
這兩條語(yǔ)句在12M晶振下運行時(shí)間分別是多少??
答:一個(gè)時(shí)鐘周期,2us,共4us
18、周期為6MHZ的單片機延時(shí)10秒的子程序的怎么編?
答:/********************************************************************
* 名稱(chēng) : Delay()
* 功能 : 延時(shí),延時(shí)時(shí)間為 10ms * del。這是通過(guò)軟件延時(shí),有一定誤差。
* 輸入 : del
* 輸出 : 無(wú)
***********************************************************************/
void Delay(uint del)
{
uint i,j;
for(i=0; i
for(j=0; j<1827; j++) //這個(gè)是通過(guò)軟件仿真得出的數
;
}
這個(gè)是晶振為12mhz的單片機延時(shí)10ms的程序,你只要在這個(gè)基礎上減小一倍就行了,當然至于具體值還是要調試下的。
19、片機的有些程序需要調用延時(shí)程序,如何能合理的安排循環(huán)次數以及空操作的個(gè)數?
答:用匯編的話(huà)就根據你的當前晶振頻率去推算你的指令周期,然后結合你需要延遲的時(shí)間,編寫(xiě)延遲程序,用C的話(huà)還是要看zui后生成的匯編碼是什么樣的了。zui簡(jiǎn)單的方法就是寫(xiě)好程序以后再編譯器里軟仿真看時(shí)間。贊同2| 評論(1)
20、單片機延時(shí)程序問(wèn)題
延時(shí)程序 void delay(uint dt)
{
uchar bt;
for(;dt;dt--);
for(bt=0;bt<255;bt++);
}
編譯時(shí)有警告C:DOCUMENTS AND SETTINGSADMINISTRATOR桌面字 310 點(diǎn)陣LED顯示.C(46): warning C235: parameter 1: different types
為什么?求大俠指點(diǎn)
答:某個(gè)函數傳參類(lèi)型與聲明類(lèi)型不符。
另外你這個(gè)for(;dt;dt--);沒(méi)有起