標(biāo)題: 請(qǐng)教C語(yǔ)言if語(yǔ)句執(zhí)行邏輯問(wèn)題 [打印本頁(yè)]

作者: xiaoyuxinke    時(shí)間: 2022-10-24 15:08
標(biāo)題: 請(qǐng)教C語(yǔ)言if語(yǔ)句執(zhí)行邏輯問(wèn)題
單片機(jī)源程序如下:
void SpeakerDiDi2(void)
{                                             //以程序每循環(huán)一次的時(shí)間為延時(shí),蜂鳴器鳴的時(shí)間長(zhǎng)短可改變i變量的值來(lái)調(diào)整。
   u8 i;                                     //定義一個(gè)8位變量(這里如果單片機(jī)運(yùn)行速度過(guò)快或晶振用的較大,可改為16位變量定義)
   Speaker=0;                           //這里蜂鳴器響(一定執(zhí)行)
   if (i<200)     {i++;}               //如果i小于200,i++。                                                            else if (i=200)  {Speaker=1; i=0;}   //不然如果i=200,蜂鳴器關(guān)閉,變量清零。
}


想明白 if(i<200)  {i++;}這里的i++,是程序每掃完一遍加1,還是停在這里一直加到200才轉(zhuǎn)去執(zhí)行下一句。
我想實(shí)現(xiàn)的意思是,程序運(yùn)行一遍i才加1,i=200就相當(dāng)于程序運(yùn)行了200次,使用程序循環(huán)變量次的時(shí)間做延時(shí),又不太影響系統(tǒng)其它程序運(yùn)行。
本人初學(xué)菜鳥(niǎo),多謝各位大神。









作者: pcbboy    時(shí)間: 2022-10-24 17:18
加一次就出去了,直到滿足條件i>=200就不循環(huán)了。
作者: 188610329    時(shí)間: 2022-10-24 17:32
你需要了解:
for(i=0;i<200;i++){;}  的另一種寫(xiě)法:  for(;i<200;){i++;}

已經(jīng)了解:
if(i<200)  {i++;}

for(;i<200;){i++;}
的區(qū)別。
作者: xiaoyuxinke    時(shí)間: 2022-10-24 18:55
pcbboy 發(fā)表于 2022-10-24 17:18
加一次就出去了,直到滿足條件i>=200就不循環(huán)了。

感謝您的回復(fù),意思就是說(shuō)程序掃到這里只加1,然后順序往下執(zhí)行,下次程序再掃到這里再加1,一直加到200這里就不再循環(huán)了么(簡(jiǎn)單說(shuō)就是程序跑了200次,這里才加夠是么)
作者: 一事無(wú)成    時(shí)間: 2022-10-24 22:58
一步步來(lái)
void SpeakerDiDi2(void)
{
u16 i;  //整點(diǎn)報(bào)時(shí)延時(shí)
{
          Speaker=0;//一定執(zhí)行
    if(i<200)  {i++;}//如果i<200則執(zhí)行i++;
    Speaker=1;//一定執(zhí)行
          if(i>0)    {i--;}//如果i>0則執(zhí)行i--;
}
}
這個(gè)函數(shù)應(yīng)該是有問(wèn)題的,少了循環(huán)吧,不然中間的{}沒(méi)必要,進(jìn)一次函數(shù)就定義一次i,而且只要i在0<i<200,那i++又i--,執(zhí)行完了i值不變,而且每次重復(fù)定義i,自動(dòng)賦值為0的話,那每次只有i--不執(zhí)行,是不是漏了代碼?
作者: 黃youhui    時(shí)間: 2022-10-25 08:42
xiaoyuxinke 發(fā)表于 2022-10-24 18:55
感謝您的回復(fù),意思就是說(shuō)程序掃到這里只加1,然后順序往下執(zhí)行,下次程序再掃到這里再加1,一直加到200 ...

你的i是局部變量,每次進(jìn)來(lái)都會(huì)被初始化一次。你可以百度關(guān)鍵字static或者全局變量和局部變量的區(qū)別
作者: 黃youhui    時(shí)間: 2022-10-25 08:43
188610329 發(fā)表于 2022-10-24 17:32
你需要了解:
for(i=0;i

他需要全局變量或者靜態(tài)變量  
作者: 愛(ài)德華    時(shí)間: 2022-10-25 09:17
一事無(wú)成 發(fā)表于 2022-10-24 22:58
一步步來(lái)
void SpeakerDiDi2(void)
{

感覺(jué)函數(shù)實(shí)現(xiàn)意思應(yīng)該和你想得到結(jié)果有出入吧。
作者: coody_sz    時(shí)間: 2022-10-25 11:28
每運(yùn)行一次這條語(yǔ)句就+1.for或while循環(huán)才是循環(huán)加到滿。
作者: pcbboy    時(shí)間: 2022-10-25 13:47
xiaoyuxinke 發(fā)表于 2022-10-24 18:55
感謝您的回復(fù),意思就是說(shuō)程序掃到這里只加1,然后順序往下執(zhí)行,下次程序再掃到這里再加1,一直加到200 ...

真的看錯(cuò)了,你的源程序是一直加到200才退出, 以為你這個(gè)是for(;i<200;){i++;} ,其實(shí)你這個(gè)if(i<200)  {i++;} 就是簡(jiǎn)單的條件,小于200就一直加到200才退出。如果這是你的原意,因該要加個(gè)延時(shí)才有效果:if(i<200)  {i++;  delay();} .
作者: wing_s    時(shí)間: 2022-10-25 16:16
for語(yǔ)句是循環(huán)語(yǔ)句,if是條件選擇語(yǔ)句,在這里只會(huì)執(zhí)行一次就順延往下執(zhí)行了(也就是i加一次1之后),不會(huì)循環(huán)掃描。
作者: Sean_Shao    時(shí)間: 2022-10-26 18:17
單步調(diào)試 用起來(lái) 你就能知道 程序是否按照你的意愿在走。。。

另外 提問(wèn)題時(shí) 先把需求說(shuō)清楚 然后再展示 自己的解決方案 這樣人家才知道你的解決方案正確與否 說(shuō)實(shí)在的 你的問(wèn)題 我看起來(lái) 就是一頭霧水 無(wú)法明白
作者: 2tafvw    時(shí)間: 2022-10-26 18:42
加1后繼續(xù)往下執(zhí)行,不過(guò)由于大循環(huán)再次到if時(shí)會(huì)繼續(xù)加1直到不滿足小于200的條件
作者: hondephy@126.co    時(shí)間: 2022-10-26 21:58
i++ =( i = i + 1);
作者: xiaoyuxinke    時(shí)間: 2022-10-27 08:39
2tafvw 發(fā)表于 2022-10-26 18:42
加1后繼續(xù)往下執(zhí)行,不過(guò)由于大循環(huán)再次到if時(shí)會(huì)繼續(xù)加1直到不滿足小于200的條件

感謝您的回復(fù),我可不可以認(rèn)為,其實(shí)這樣的延時(shí)并不占用單片機(jī)多少時(shí)間,
作者: xiaoyuxinke    時(shí)間: 2023-3-11 14:36
一事無(wú)成 發(fā)表于 2022-10-24 22:58
一步步來(lái)
void SpeakerDiDi2(void)
{

我是新手,不是漏了,是沒(méi)寫(xiě)好,是這樣的,您說(shuō)的沒(méi)錯(cuò),感謝您的支持!代碼重新寫(xiě)過(guò)。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1