找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5280|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)流水燈編程求教 不理解怎么和delay配合工作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:250349 發(fā)表于 2017-11-17 11:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)源程序:

#include<reg52.h>//開(kāi)頭,字體HGSoeiPresemceEB
#include<intrins.h>//用intrins頭文件函數(shù)
#define uchar unsigned char//宏定義uchar代表unsigned char
#define uint  unsigned int//宏定義unit代表unsigned int
uint a;//定義a為無(wú)符號(hào)整型(16位)
uchar i;//定義i為無(wú)符號(hào)字符型(8位)
uchar temp;//定義字符型變量
void delay(uint z);//void為無(wú)返回值函數(shù),delay為時(shí)間延時(shí)函數(shù)
void main()//唯一主函數(shù),無(wú)返回值,沒(méi)參數(shù)
{
        temp = 0x7f;//temp賦值為11111110
        P1 = temp;//P1賦值為temp
        while(1)//無(wú)限循環(huán)
        {
                for(i = 0; i <8; i++)//i從0開(kāi)始,<8,執(zhí)行函數(shù),0+1,<8,執(zhí)行函數(shù),0+1+1,<8,執(zhí)行函數(shù)...一直到0+1+1+1+1+1+1+1+1為止跳出函數(shù)
                {
                        temp = _crol_(temp,1);//定義的temp每次左移一位,循環(huán)
                        P1 = temp;//賦值P1為temp
                        delay(500);//延時(shí)500毫秒
                 }
        }
}         
void delay(uint z) //定義z,z是int型形式參數(shù)(形參)
{
        uint x,y;//定義x和y都是int型數(shù)值
        for(x = z; x > 0; x--)//for循環(huán)初始值x=z,當(dāng)x>0時(shí),成立,x自減
                for(y = 120; y > 0 ; y--);//for循環(huán)初始值y=120,當(dāng)y>0時(shí),成立,y自減

}        
按照教程,控制led燈的流水閃爍,但是有幾個(gè)紅字的地方,我不是很懂,希望得到大家的幫助
最后這段
uint x,y;//定義x和y都是int型數(shù)值
        for(x = z; x > 0; x--)//for循環(huán)初始值x=z,當(dāng)x>0時(shí),成立,x自減
                for(y = 120; y > 0 ; y--);//for循環(huán)初始值y=120,當(dāng)y>0時(shí),成立,y自減
雖然做了注釋,但是,我不理解,他是怎么和delay(500)配合工作的,如果刪了這一段,led燈就流水閃爍的特別厲害,,謝謝大家的幫助,,,





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:215444 發(fā)表于 2017-11-17 11:55 | 只看該作者
刪除這一段,為什么LED還能亮,因?yàn)槟惆炎雍瘮?shù)都刪除,不能編譯的吧,還有delay(500)可以用stc-isp-15xx-v6.86D這個(gè)軟件生出
回復(fù)

使用道具 舉報(bào)

板凳
ID:250349 發(fā)表于 2017-11-17 13:09 | 只看該作者
k455619 發(fā)表于 2017-11-17 11:55
刪除這一段,為什么LED還能亮,因?yàn)槟惆炎雍瘮?shù)都刪除,不能編譯的吧,還有delay(500)可以用stc-isp-15xx-v6 ...

我不了解y=120   和  delay(500)他們中間的關(guān)系,,,
回復(fù)

使用道具 舉報(bào)

地板
ID:247257 發(fā)表于 2017-11-23 11:20 | 只看該作者
  delay(500)是延時(shí)500ms的意思,就是執(zhí)行到  delay(500)《---這里的時(shí)候等500ms在繼續(xù)運(yùn)行,也就是以500ms的間隔進(jìn)行燈的切換。你刪了這一段就沒(méi)有延時(shí)了,自然閃爍地很快了
回復(fù)

使用道具 舉報(bào)

5#
ID:212797 發(fā)表于 2017-11-23 13:18 | 只看該作者
void delay(uint z) //定義z,z是int型形式參數(shù)(形參)
{
        uint x,y;//定義x和y都是int型數(shù)值
        for(x = z; x > 0; x--)//for循環(huán)初始值x=z,當(dāng)x>0時(shí),成立,x自減
                for(y = 120; y > 0 ; y--);//for循環(huán)初始值y=120,當(dāng)y>0時(shí),成立,y自減

}  
這個(gè)函數(shù)的意思是,當(dāng)z=1時(shí),函數(shù)運(yùn)行需要消耗1ms的時(shí)間。而把z改為500時(shí),執(zhí)行這段程序就需要消耗500ms,所以說(shuō)把這段程序嵌入到主程序里面就是為了延時(shí)500ms(實(shí)際是CPU在那干耗著)。
回復(fù)

使用道具 舉報(bào)

6#
ID:252134 發(fā)表于 2017-11-23 18:08 | 只看該作者
……就2句話……
這是一個(gè)延時(shí)函數(shù)……沒(méi)啥好解釋的啊
函數(shù)內(nèi)部就是一個(gè)2層的for循環(huán)結(jié)構(gòu),調(diào)用該函數(shù)以后,cpu就開(kāi)始在for循環(huán)里執(zhí)行,for循環(huán)里只做循環(huán)體的判斷,沒(méi)有任何其他語(yǔ)句,目的就是消耗CPU時(shí)間以達(dá)到延時(shí)的目的.
void delay(uint z)
{
uint x,y;
//總共 z * 120 次循環(huán)
for(x=z;x>0;x--) //z次循環(huán)
for(y=120;y>0;y--); //120次循環(huán)
}
如果想具體計(jì)算上面的函數(shù)究竟延時(shí)多長(zhǎng)時(shí)間,要先知道CPU的時(shí)鐘頻率是多少,還有搞清楚這段代碼在編譯器編譯以后的匯編指令有多少條(每條指令的執(zhí)行周期是多少),這些信息都知道了就可以算延時(shí)時(shí)間了.
真正要相對(duì)比較精確地延時(shí)的話,延時(shí)函數(shù)的代碼一般是直接使用匯編語(yǔ)言來(lái)寫(xiě)的.
回復(fù)

使用道具 舉報(bào)

7#
ID:243143 發(fā)表于 2017-11-24 13:47 | 只看該作者
void delay(uint z) //定義z,z是int型形式參數(shù)(形參)
{
        uint x,y;//定義x和y都是int型數(shù)值
        for(x = z; x > 0; x--)//for循環(huán)初始值x=z,當(dāng)x>0時(shí),成立,x自減
                for(y = 120; y > 0 ; y--);//for循環(huán)初始值y=120,當(dāng)y>0時(shí),成立,y自減

}   

看第二個(gè)for循環(huán)后面有個(gè)分號(hào),實(shí)際就是在空運(yùn)行。
回復(fù)

使用道具 舉報(bào)

8#
ID:111634 發(fā)表于 2017-11-24 14:47 | 只看該作者
先學(xué)理論,打基礎(chǔ),就不會(huì)有這么多問(wèn)題了,本壇至少有50%的問(wèn)題屬于此類情況。
回復(fù)

使用道具 舉報(bào)

9#
ID:253106 發(fā)表于 2017-11-24 16:29 | 只看該作者
心靜不下 發(fā)表于 2017-11-17 13:09
我不了解y=120   和  delay(500)他們中間的關(guān)系,,,

delay()括號(hào)里的數(shù)值是多少,就是延時(shí)多少ms,執(zhí)行for(y=120;y>0,y--)語(yǔ)句約需要1ms的時(shí)間,假如y=240,那么執(zhí)行for(y=240;y>0,y--)語(yǔ)句約需要2ms的時(shí)間,這時(shí)  延時(shí)的時(shí)間=delay()括號(hào)里的數(shù)值*2ms,大概意思就是這樣
回復(fù)

使用道具 舉報(bào)

10#
ID:253135 發(fā)表于 2017-11-24 20:22 | 只看該作者
所謂的延遲,其實(shí)是:1.計(jì)算機(jī)對(duì)每一條語(yǔ)句處理需要時(shí)間。2.每一條語(yǔ)句處理的時(shí)間不同。3.具體需要多長(zhǎng)時(shí)間就要看cpu的頻率了。
delay(500)的意思是讓延遲子程序運(yùn)行500次,每一次又要經(jīng)過(guò)120次y運(yùn)算,而每一次運(yùn)算都需要時(shí)間,所以delay(500)就要很長(zhǎng)很長(zhǎng)時(shí)間,自然的就會(huì)主程序卡在P1=temp語(yǔ)句,不進(jìn)行下一步。所以led才會(huì)亮好久。
      
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表