找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

有關(guān)單片機(jī)c語言一直弄不懂的三個問題,望賜教

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:86913 發(fā)表于 2017-9-1 16:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請教3個問題:(請看以下程序)

1、在主函數(shù)中,加while(1){ }和不加while(1){ }的問題,經(jīng)實踐試過,結(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. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

來自 2#
ID:230544 發(fā)表于 2017-9-3 15:18 | 只看該作者
第一個,加不加的確它都會循環(huán),這個實驗我也做過,其實加while循環(huán)是為了減小單片機(jī)出錯的概率,貌似書本上都是這么說
第二, 有兩種方法可以搞定你說的,軟件實現(xiàn),在單片機(jī)完成既定任務(wù),可以讓他一直while循環(huán),死在循環(huán)里就好了。硬件實現(xiàn),用個繼電器,繼電器線圈倆開關(guān),一個是按下彈起開關(guān),另一個用單片機(jī)引腳接通當(dāng)開關(guān),兩者并聯(lián),繼電器常閉又控制單片機(jī)電源,單片機(jī)完成任務(wù)后,當(dāng)做開關(guān)的引腳置零,繼電器不吸合就停止工作了

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:81352 發(fā)表于 2017-9-3 12:07 | 只看該作者
void main()
回復(fù)

使用道具 舉報

地板
ID:81352 發(fā)表于 2017-9-3 12:11 | 只看該作者
將while(1)放在Delay_ms(10000),后面可以嗎?是否開通看門狗功能呢?

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

使用道具 舉報

6#
ID:97438 發(fā)表于 2017-9-5 17:02 | 只看該作者
我說說第一個吧,不加while(1),不做其他死循環(huán)的話,看起來也會循環(huán),但是這屬于未定義操作,屬于不按要求來,出了問題不能怪人。
回復(fù)

使用道具 舉報

7#
ID:86913 發(fā)表于 2017-9-11 20:20 | 只看該作者
黑暗人才 發(fā)表于 2017-9-3 15:18
第一個,加不加的確它都會循環(huán),這個實驗我也做過,其實加while循環(huán)是為了減小單片機(jī)出錯的概率,貌似書本 ...

感謝“黑暗人才”,為我提供了思路,照您的辦法做,對的。只要在后面加上       
while(1)
     {
      P1=0xff;               
     }       
就可以了。謝謝!
回復(fù)

使用道具 舉報

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

謝謝您的指導(dǎo)!
回復(fù)

使用道具 舉報

9#
ID:233455 發(fā)表于 2017-9-16 11:17 | 只看該作者
首先定義一個靜態(tài)變量默認(rèn)賦值為0,執(zhí)行一次就把這個變量置1,下次判斷這個變量為1跳過就可以了
回復(fù)

使用道具 舉報

10#
ID:203840 發(fā)表于 2017-9-16 16:21 | 只看該作者
主程序不加while(1) 當(dāng)程序執(zhí)行完成以后,會自動跳轉(zhuǎn)到最初的位置開始再執(zhí)行  類似于復(fù)位
回復(fù)

使用道具 舉報

11#
ID:187532 發(fā)表于 2017-9-16 17:53 | 只看該作者
第一,加上while(1)可以防止程序跑飛,造成單片機(jī)錯誤。做流水燈實驗時必須有while(1)不然如何循環(huán)。
第二,只循環(huán)一次的話在程序末尾加上while(1);
回復(fù)

使用道具 舉報

12#
ID:233530 發(fā)表于 2017-9-16 19:47 | 只看該作者
break可以跳出終止循環(huán)
回復(fù)

使用道具 舉報

13#
ID:233571 發(fā)表于 2017-9-16 22:27 | 只看該作者
我是來學(xué)習(xí)的。
回復(fù)

使用道具 舉報

14#
ID:86913 發(fā)表于 2018-2-25 11:53 | 只看該作者
多謝樓上各位熱心的朋友,通過您們的幫助,我又增長了相關(guān)知識。
回復(fù)

使用道具 舉報

15#
ID:285408 發(fā)表于 2018-2-25 15:43 | 只看該作者
1、有的跟編譯軟件有關(guān)系,如果你沒加上,他會幫你加上
回復(fù)

使用道具 舉報

16#
ID:285412 發(fā)表于 2018-2-25 16:53 | 只看該作者
我也是來學(xué)習(xí)的~
回復(fù)

使用道具 舉報

17#
ID:285545 發(fā)表于 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è)計。比如,自鎖開關(guān),將單片機(jī)的電源串入常閉,線圈串入常開,單片機(jī)動作,激活自鎖開關(guān),這樣單片機(jī)斷電了,線圈通電了。最好單片機(jī)并接個大電容,延遲下斷電。
回復(fù)

使用道具 舉報

18#
ID:279601 發(fā)表于 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),停止給脈沖就行了
回復(fù)

使用道具 舉報

19#
ID:260290 發(fā)表于 2018-3-2 15:29 | 只看該作者
多謝樓上各位熱心的朋友,通過您們的幫助,我又增長了相關(guān)知識。
回復(fù)

使用道具 舉報

20#
ID:284007 發(fā)表于 2018-3-4 12:48 | 只看該作者
因為你想啊你本來可以容納100行程序可實際的只要50行那么當(dāng)運(yùn)行完50行后地51行就不是自己想要運(yùn)行的了,而是不確定的未知內(nèi)容,一旦執(zhí)行下去程序就會出錯,從而導(dǎo)致單片機(jī)自動復(fù)位,所以通常在程序中加入一個死循環(huán),讓程序不要亂運(yùn)行
回復(fù)

使用道具 舉報

21#
ID:287444 發(fā)表于 2018-3-4 15:05 | 只看該作者

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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