標(biāo)題: 有關(guān)單片機(jī)c語言一直弄不懂的三個問題,望賜教 [打印本頁]

作者: tmxk0574    時間: 2017-9-1 16:50
標(biāo)題: 有關(guān)單片機(jī)c語言一直弄不懂的三個問題,望賜教
請教3個問題:(請看以下程序)

1、在主函數(shù)中,加while(1){ }和不加while(1){ }的問題,經(jīng)實(shí)踐試過,結(jié)果是一
樣的,都是無限循環(huán)。那么可以不加while(1){ }嗎?
2、如果不要循環(huán),只要運(yùn)行一次后停機(jī),主函數(shù)該怎么寫?
3、如果只要運(yùn)行一次后停機(jī),并且某個線圈繼續(xù)通電,但電機(jī)不轉(zhuǎn)(即把電機(jī)軸用電鎖住不動)
,主函數(shù)又該怎么寫?

*****

代碼:

  1. #include <reg51.h>  //步進(jìn)電機(jī)正反轉(zhuǎn)運(yùn)行程序
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. uchar code up_data[8]={0xE,0xC,0xD,0x9,0xB,0x3,0x7,0x6}; //1相勵磁正轉(zhuǎn)表
  5. uchar code down_data[8]={0X6,0X7,0X3,0XB,0X9,0XD,0XC,0XE};//1相勵磁反轉(zhuǎn)表
  6.             
  7. /********以下是延時函數(shù)********/
  8. void Delay_ms(uint xms)                                
  9. {
  10.         uint i,j;
  11.         for(i=xms;i>0;i--)                          //i=xms即延時約xms毫秒
  12.                 for(j=110;j>0;j--);表   
  13. }
  14. /********以下是步進(jìn)電機(jī)1相勵磁法正轉(zhuǎn)函數(shù)********/
  15. void  motor_up(uint n)
  16. {
  17.    uchar i;
  18.    uint  j;
  19.    for (j=0; j<509*n; j++)            //正轉(zhuǎn)1圈
  20.     {
  21.      for (i=0; i<8; i++)     
  22.        {
  23.                P1 = up_data[i];         
  24.         Delay_ms(4);        
  25.        }
  26.     }
  27. }
  28. /********步進(jìn)電機(jī)1相勵磁法反轉(zhuǎn)函數(shù)********/
  29. void  motor_down(uint n)
  30. {
  31.     uchar i;
  32.     uint  j;
  33.     for (j=0; j<509*n; j++)    //反轉(zhuǎn)1圈               
  34.      {
  35.       for (i=0; i<8; i++)            
  36.        {
  37.                P1 = down_data[i];   
  38.         Delay_ms(4);            
  39.        }
  40.      }
  41. }
  42. /********以下是主函數(shù)********/
  43. void main()
  44. {     
  45.    while(1)           //此語句有或無效果都一樣!
  46.      {
  47.        motor_up(1);                  //電機(jī)正轉(zhuǎn)1圈
  48.        P1=0xff;                        //電機(jī)停轉(zhuǎn)
  49.        Delay_ms(4000);          //換向延時為4s
  50.        motor_down(1);           //電機(jī)反轉(zhuǎn)1圈
  51.        P1=0x00;                        //電機(jī)停轉(zhuǎn)
  52.        Delay_ms(4000);          //換向延時為4s
  53.        P1=0xff;                        //電機(jī)停轉(zhuǎn)        
  54.        Delay_ms(10000);         //換向延時為10s
  55.      }
  56. }

作者: feng_67107023    時間: 2017-9-3 12:07
void main()
作者: feng_67107023    時間: 2017-9-3 12:11
將while(1)放在Delay_ms(10000),后面可以嗎?是否開通看門狗功能呢?
作者: 黑暗人才    時間: 2017-9-3 15:18
第一個,加不加的確它都會循環(huán),這個實(shí)驗(yàn)我也做過,其實(shí)加while循環(huán)是為了減小單片機(jī)出錯的概率,貌似書本上都是這么說
第二, 有兩種方法可以搞定你說的,軟件實(shí)現(xiàn),在單片機(jī)完成既定任務(wù),可以讓他一直while循環(huán),死在循環(huán)里就好了。硬件實(shí)現(xiàn),用個繼電器,繼電器線圈倆開關(guān),一個是按下彈起開關(guān),另一個用單片機(jī)引腳接通當(dāng)開關(guān),兩者并聯(lián),繼電器常閉又控制單片機(jī)電源,單片機(jī)完成任務(wù)后,當(dāng)做開關(guān)的引腳置零,繼電器不吸合就停止工作了
作者: zhangda1230    時間: 2017-9-3 21:18
只需設(shè)置一個標(biāo)志位就可以了,執(zhí)行一次就置1或置0,看自己習(xí)慣來
,并將一個線圈得電并維持。
作者: luoluoluo136    時間: 2017-9-5 17:02
我說說第一個吧,不加while(1),不做其他死循環(huán)的話,看起來也會循環(huán),但是這屬于未定義操作,屬于不按要求來,出了問題不能怪人。
作者: tmxk0574    時間: 2017-9-11 20:20

引用:

黑暗人才 發(fā)表于 2017-9-3 15:18
第一個,加不加的確它都會循環(huán),這個實(shí)驗(yàn)我也做過,其實(shí)加while循環(huán)是為了減小單片機(jī)出錯的概率,貌似書本 ...

感謝“黑暗人才”,為我提供了思路,照您的辦法做,對的。只要在后面加上       
while(1)
     {
      P1=0xff;               
     }       
就可以了。謝謝!
作者: tmxk0574    時間: 2017-9-11 20:22

引用:

zhangda1230 發(fā)表于 2017-9-3 21:18
只需設(shè)置一個標(biāo)志位就可以了,執(zhí)行一次就置1或置0,看自己習(xí)慣來
,并將一個線圈得電并維持。

謝謝您的指導(dǎo)!
作者: weidy99    時間: 2017-9-16 11:17
首先定義一個靜態(tài)變量默認(rèn)賦值為0,執(zhí)行一次就把這個變量置1,下次判斷這個變量為1跳過就可以了
作者: mioc    時間: 2017-9-16 16:21
主程序不加while(1) 當(dāng)程序執(zhí)行完成以后,會自動跳轉(zhuǎn)到最初的位置開始再執(zhí)行  類似于復(fù)位
作者: q1833605807    時間: 2017-9-16 17:53
第一,加上while(1)可以防止程序跑飛,造成單片機(jī)錯誤。做流水燈實(shí)驗(yàn)時必須有while(1)不然如何循環(huán)。
第二,只循環(huán)一次的話在程序末尾加上while(1);

作者: 1qaz2wsx!@    時間: 2017-9-16 19:47
break可以跳出終止循環(huán)
作者: 古文濤    時間: 2017-9-16 22:27
我是來學(xué)習(xí)的。
作者: tmxk0574    時間: 2018-2-25 11:53
多謝樓上各位熱心的朋友,通過您們的幫助,我又增長了相關(guān)知識。
作者: 1440950423    時間: 2018-2-25 15:43
1、有的跟編譯軟件有關(guān)系,如果你沒加上,他會幫你加上
作者: yww429    時間: 2018-2-25 16:53
我也是來學(xué)習(xí)的~
作者: sand_hunt    時間: 2018-3-1 11:41
1,不用 while() 的話,總感覺很容易跑偏,。畢竟默認(rèn)都加的。
2,只運(yùn)行一次比較好辦,一般都是用標(biāo)志位,但是停機(jī)。停機(jī)是斷電?休眠?還是死循環(huán)?
{斷電,這可能要借助外部電控裝置進(jìn)行,軟件好像不能直接關(guān)機(jī)。
休眠,很多單片機(jī)是可以的。
死循環(huán),就更簡單了。
}
3,要用到一定的自鎖設(shè)計(jì)。比如,自鎖開關(guān),將單片機(jī)的電源串入常閉,線圈串入常開,單片機(jī)動作,激活自鎖開關(guān),這樣單片機(jī)斷電了,線圈通電了。最好單片機(jī)并接個大電容,延遲下斷電。
作者: Steven159    時間: 2018-3-2 13:09
1,看你用的哪款單片機(jī)把,STC單片機(jī)本身是自帶循環(huán)的,你不加While(1),他也會循環(huán),單循環(huán)是主函數(shù)整個循環(huán);2如果只要循環(huán)一次,方法比較多,例如在函數(shù)最后一句加上一句while(1);語句,讓他執(zhí)行一次后陷入while(1)死循環(huán),也可設(shè)置個腳,例如sbit tingzhi=P1^1;默認(rèn)設(shè)置為低狀態(tài),最后一句加上while(tingzhi==0);這樣也會停在這,而且你拉高該引腳時,會跳出循環(huán)重新開始;3想讓點(diǎn)擊不轉(zhuǎn),停止給脈沖就行了
作者: miracle-    時間: 2018-3-2 15:29
多謝樓上各位熱心的朋友,通過您們的幫助,我又增長了相關(guān)知識。
作者: july0    時間: 2018-3-4 12:48
因?yàn)槟阆氚∧惚緛砜梢匀菁{100行程序可實(shí)際的只要50行那么當(dāng)運(yùn)行完50行后地51行就不是自己想要運(yùn)行的了,而是不確定的未知內(nèi)容,一旦執(zhí)行下去程序就會出錯,從而導(dǎo)致單片機(jī)自動復(fù)位,所以通常在程序中加入一個死循環(huán),讓程序不要亂運(yùn)行
作者: 1421380515    時間: 2018-3-4 15:05

只需設(shè)置一個標(biāo)志位就可以了,執(zhí)行一次就置1或置0,看自己習(xí)慣來
,并將一個線圈得電并維持。




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