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