找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2332|回復: 31
打印 上一主題 下一主題
收起左側

怎么樣在同樣的條件下,實現(xiàn)兩種不同的程序語句?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1104510 發(fā)表于 2023-12-15 20:21 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,在if()條件相同的情況下,實現(xiàn)兩種不同的{}語句,使之實現(xiàn)兩種不同的功能?求大神指點!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:401564 發(fā)表于 2023-12-15 23:12 | 只看該作者
不知道你要求是什么?
if如果為真,那就是唯一選擇執(zhí)行呀!
回復

使用道具 舉報

板凳
ID:1104510 發(fā)表于 2023-12-16 06:56 來自手機 | 只看該作者
Y_G_G 發(fā)表于 2023-12-15 23:12
不知道你要求是什么?
if如果為真,那就是唯一選擇執(zhí)行呀!

我做了一套自動化小設備,就是用4個接近開關控制一個小直流電機的正反轉,就是在同樣的一個條件下,需要實現(xiàn)停止跟反轉這兩個功能,我現(xiàn)在正轉跟停止已經實現(xiàn)了,就是無法實現(xiàn)反轉,整個流程是:反轉~停止~正轉~停止~反轉~停止,我已經實現(xiàn)了前面四個動作,就差后面兩個動作了,就差最后兩個動作,因為第五個反轉的條件跟第三個正轉的條件一樣,所以導致第五個反轉無法實現(xiàn),求指導一下,應該怎么處理,才能實現(xiàn)反轉

回復

使用道具 舉報

地板
ID:895440 發(fā)表于 2023-12-16 09:52 | 只看該作者
不可能,一個條件必定對于一個動作
沒有這種東西,人也做不到
回復

使用道具 舉報

5#
ID:213173 發(fā)表于 2023-12-16 11:23 | 只看該作者
鄭效桂 發(fā)表于 2023-12-16 06:56
我做了一套自動化小設備,就是用4個接近開關控制一個小直流電機的正反轉,就是在同樣的一個條件下,需要 ...

相同判斷條件不可能做出截然相反且都正確的結果,否則不就亂套了。必須創(chuàng)造可以識別的條件。既然有4個接近開關就能判斷機械位置,不同的機械位置就是判斷條件。比如再設置一個變量x,初始為0,正轉后停止x=1,反轉后停止x=2來記憶運行經歷。當不知道下一步是正還是反轉,x就是判斷條件。
回復

使用道具 舉報

6#
ID:341045 發(fā)表于 2023-12-16 13:20 | 只看該作者
多加一個以前電機正反轉的標志一起帶進來判斷.  如果不能處理, 就多弄一個標志, 碰到這條件標志取反, 由標志控制電機正反轉(比如標志為0正轉, 不為0反轉)
回復

使用道具 舉報

7#
ID:384109 發(fā)表于 2023-12-16 13:28 | 只看該作者
鄭效桂 發(fā)表于 2023-12-16 06:56
我做了一套自動化小設備,就是用4個接近開關控制一個小直流電機的正反轉,就是在同樣的一個條件下,需要 ...

增加標志吧
回復

使用道具 舉報

8#
ID:883242 發(fā)表于 2023-12-16 23:28 | 只看該作者
鄭效桂 發(fā)表于 2023-12-16 06:56
我做了一套自動化小設備,就是用4個接近開關控制一個小直流電機的正反轉,就是在同樣的一個條件下,需要 ...

狀態(tài)機,加個狀態(tài)變量,反轉~停止~正轉~停止~反轉~停止分別對應狀態(tài)0、1、2、3、4、5……
回復

使用道具 舉報

9#
ID:1104510 發(fā)表于 2023-12-17 07:21 | 只看該作者
lzts88 發(fā)表于 2023-12-16 13:20
多加一個以前電機正反轉的標志一起帶進來判斷.  如果不能處理, 就多弄一個標志, 碰到這條件標志取反, 由標 ...


//IN1 IN2 IN3 IN4分別對應4個接近開關
//COM1 對應正轉繼電器,
//COM2對應反轉繼電器,
//COM3對應警報繼電器
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //開機初始化,電機反轉
void zz(){COM1 =0;COM2 =1;COM3 =1;}//正轉
void fz(){COM1 =1;COM2 =0;COM3 =0;}//反轉,并發(fā)出警報
void jb(){COM1 =1;COM2 =1;COM3 =0;}//反轉到達限位,警報繼續(xù)
void tz(){COM1 =1;COM2 =1;COM3 =1;}//正轉或者反轉到達限位后,電機停止
void main()                                  
        {
                 while(1)
                        {
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();}
                                  //開機初始化,電機反轉
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                  //I電機停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}
                                 //電機正轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}
                                 //電機正轉
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();}
                                 //電機停止
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1)){tz();}
                     //電機停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1)){fz();}
                     //電機反轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}
                        //電機反轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                   //電機停止

                   }

                       
        }
這是我寫的代碼,應該怎么添加標志呢
回復

使用道具 舉報

10#
ID:1104510 發(fā)表于 2023-12-17 07:22 | 只看該作者
wulin 發(fā)表于 2023-12-16 11:23
相同判斷條件不可能做出截然相反且都正確的結果,否則不就亂套了。必須創(chuàng)造可以識別的條件。既然有4個接 ...

//IN1 IN2 IN3 IN4分別對應4個接近開關
//COM1 對應正轉繼電器,
//COM2對應反轉繼電器,
//COM3對應警報繼電器
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //開機初始化,電機反轉
void zz(){COM1 =0;COM2 =1;COM3 =1;}//正轉
void fz(){COM1 =1;COM2 =0;COM3 =0;}//反轉,并發(fā)出警報
void jb(){COM1 =1;COM2 =1;COM3 =0;}//反轉到達限位,警報繼續(xù)
void tz(){COM1 =1;COM2 =1;COM3 =1;}//正轉或者反轉到達限位后,電機停止
void main()                                  
        {
                 while(1)
                        {
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();}
                                  //開機初始化,電機反轉
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                  //I電機停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}
                                 //電機正轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}
                                 //電機正轉
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();}
                                 //電機停止
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1)){tz();}
                     //電機停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1)){fz();}
                     //電機反轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}
                        //電機反轉
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                   //電機停止

                   }

                       
        }
這是我寫的代碼,應該怎么添加條件呢
回復

使用道具 舉報

11#
ID:161164 發(fā)表于 2023-12-17 14:38 | 只看該作者
  1. uchar Step = 0;
  2. void main()
  3. {
  4.         while(1)
  5.         {
  6.                 switch(Step)
  7.                 {
  8.                         case 0:
  9.                                 if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  10.                                 {
  11.                                         csh();
  12.                                         Step++;
  13.                                 }
  14.                                 break;
  15.                         //開機初始化,電機反轉
  16.                         case 1:
  17.                                 if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  18.                                 {
  19.                                         tz();
  20.                                         Step++;
  21.                                 }
  22.                                 break;
  23.                         //I電機停止
  24.                         case 2:
  25.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  26.                                 {
  27.                                         zz();
  28.                                         Step++;
  29.                                 }
  30.                                 break;
  31.                         //電機正轉
  32.                         case 3:
  33.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  34.                                 {
  35.                                         zz();
  36.                                         Step++;
  37.                                 }
  38.                                 break;
  39.                         //電機正轉
  40.                         case 4:
  41.                                 if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1))
  42.                                 {
  43.                                         tz();
  44.                                         Step++;
  45.                                 }
  46.                                 break;
  47.                         //電機停止
  48.                         case 5:
  49.                                 if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1))
  50.                                 {
  51.                                         tz();
  52.                                         Step++;
  53.                                 }
  54.                                 break;
  55.                         //電機停止
  56.                         case 6:
  57.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1))
  58.                                 {
  59.                                         fz();
  60.                                         Step++;
  61.                                 }
  62.                                 break;
  63.                         //電機反轉
  64.                         case 7:
  65.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  66.                                 {
  67.                                         fz();
  68.                                         Step++;
  69.                                 }
  70.                                 break;
  71.                         //電機反轉
  72.                         case 8:
  73.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  74.                                 {
  75.                                         tz();
  76.                                         Step=0;
  77.                                 }
  78.                                 break;
  79.                                 //電機停止
  80.                 }
  81.         }
  82. }
復制代碼
回復

使用道具 舉報

12#
ID:1056324 發(fā)表于 2023-12-17 18:14 | 只看該作者
鄭效桂 發(fā)表于 2023-12-17 07:22
//IN1 IN2 IN3 IN4分別對應4個接近開關
//COM1 對應正轉繼電器,
//COM2對應反轉繼電器,

這邏輯?命令1111開機初始化,電機反轉,命令1110反轉到達限位后,電機停止,給命令0110電機正轉,然后如果這里沒有正轉到初始位置,電機停止,為什么再給命令0111電機正轉,
命令0011正轉到達限位后,電機停止,為什么再給命令0001電機停止,后面也是,

用狀態(tài)機,switch case 語句,比if簡單,
if的話,反轉1111~停止1110~正轉0000~停止1100~反轉1000~停止1010,這樣不行嗎
回復

使用道具 舉報

13#
ID:61140 發(fā)表于 2023-12-17 23:09 | 只看該作者
雷歐庫珀 發(fā)表于 2023-12-16 09:52
不可能,一個條件必定對于一個動作
沒有這種東西,人也做不到

可能的,現(xiàn)在有多核51單片機,網上查一下
回復

使用道具 舉報

14#
ID:1104510 發(fā)表于 2023-12-18 06:31 來自手機 | 只看該作者
白畫求兮 發(fā)表于 2023-12-17 18:14
這邏輯?命令1111開機初始化,電機反轉,命令1110反轉到達限位后,電機停止,給命令0110電機正轉,然后如 ...

不會出現(xiàn)0000這個情況
回復

使用道具 舉報

15#
ID:1104510 發(fā)表于 2023-12-18 06:31 來自手機 | 只看該作者
白畫求兮 發(fā)表于 2023-12-17 18:14
這邏輯?命令1111開機初始化,電機反轉,命令1110反轉到達限位后,電機停止,給命令0110電機正轉,然后如 ...

3跟4不可能同時為0
回復

使用道具 舉報

16#
ID:1104510 發(fā)表于 2023-12-18 06:44 來自手機 | 只看該作者
白畫求兮 發(fā)表于 2023-12-17 18:14
這邏輯?命令1111開機初始化,電機反轉,命令1110反轉到達限位后,電機停止,給命令0110電機正轉,然后如 ...

樓上的switch  case語句昨天我試了,不行。狀態(tài)機我還不知道怎么寫
回復

使用道具 舉報

17#
ID:1104510 發(fā)表于 2023-12-18 07:10 | 只看該作者
白畫求兮 發(fā)表于 2023-12-17 18:14
這邏輯?命令1111開機初始化,電機反轉,命令1110反轉到達限位后,電機停止,給命令0110電機正轉,然后如 ...

4個接近開關處在同一條直線上的不同位置,3是正轉的限位,4是反轉的限位,他們的關系要么是01要么是10要么是11,永遠不會是00
回復

使用道具 舉報

18#
ID:958310 發(fā)表于 2023-12-18 11:40 | 只看該作者
這都不會,,,是剛入行的嗎?標記法、狀態(tài)機 直接秒了
回復

使用道具 舉報

19#
ID:1104510 發(fā)表于 2023-12-18 13:34 | 只看該作者
bigbigcong 發(fā)表于 2023-12-18 11:40
這都不會,,,是剛入行的嗎?標記法、狀態(tài)機 直接秒了

對啊,就是剛學這個
回復

使用道具 舉報

20#
ID:1088099 發(fā)表于 2023-12-18 14:22 | 只看該作者
鄭效桂 發(fā)表于 2023-12-18 07:10
4個接近開關處在同一條直線上的不同位置,3是正轉的限位,4是反轉的限位,他們的關系要么是01要么是10要 ...

那1和2呢,在哪個位置
回復

使用道具 舉報

21#
ID:1104510 發(fā)表于 2023-12-18 14:49 | 只看該作者
金玉之食 發(fā)表于 2023-12-18 14:22
那1和2呢,在哪個位置

IN1 判斷氣脹管是否在機器上,IN2 判斷是否接觸到圖片中的白色物體,IN3是電機的正轉限位,IN4 是電機的反轉限位

5.jpg (838.77 KB, 下載次數: 39)

5.jpg
回復

使用道具 舉報

22#
ID:104825 發(fā)表于 2023-12-18 15:06 來自手機 | 只看該作者
畫個草圖,標記出接近開關位置,描述一下工作流程,讓大家更好的幫助你。
回復

使用道具 舉報

23#
ID:1104510 發(fā)表于 2023-12-18 15:46 | 只看該作者
s1gm 發(fā)表于 2023-12-18 15:06
畫個草圖,標記出接近開關位置,描述一下工作流程,讓大家更好的幫助你。

如圖所示:
IN1用于檢測氣脹管是否在機器上;
IN2用于檢測白色的膜(這個膜是隨著氣脹管的轉動而(厚度)逐漸變薄的)的側面是否到達指定位置;
IN2是隨著電機運動的,電機往哪動它就往哪動;
IN3用于電機正轉限位;
IN4用于反轉限位;
COM1用于電機正轉;
COM2用于電機反轉;
COM3用于發(fā)出警報;
當氣脹管不在機器上時,反轉,警報不響;(1111)
到達IN4位置時,停止;(1110)
當氣脹管被放到機器上時,IN1觸發(fā),電機正轉(0110)(此時IN4處于觸發(fā)狀態(tài),隨著電機的轉動,IN4逐漸丟失信號,(0111)此時持續(xù)正轉);
當IN2接觸到白色膜時,IN2被觸發(fā),此時,電機停止轉動;(0011)
隨著膜逐漸變薄,直到IN2丟失信號,此時,電機反轉,并發(fā)出警報;(0111)
當反轉到IN4位置時,電機停止,警報持續(xù);(0110)


7.jpg (2.07 MB, 下載次數: 29)

7.jpg

6.jpg (1.12 MB, 下載次數: 31)

6.jpg
回復

使用道具 舉報

24#
ID:161164 發(fā)表于 2023-12-18 16:54 | 只看該作者
鄭效桂 發(fā)表于 2023-12-18 15:46
如圖所示:
IN1用于檢測氣脹管是否在機器上;
IN2用于檢測白色的膜(這個膜是隨著氣脹管的轉動而(厚度 ...

看11樓我的回復
回復

使用道具 舉報

25#
ID:1104510 發(fā)表于 2023-12-18 19:21 來自手機 | 只看該作者
bigbigcong 發(fā)表于 2023-12-18 11:40
這都不會,,,是剛入行的嗎?標記法、狀態(tài)機 直接秒了

能教教我嗎
回復

使用道具 舉報

26#
ID:1104510 發(fā)表于 2023-12-18 20:54 來自手機 | 只看該作者
lkc8210 發(fā)表于 2023-12-18 16:54
看11樓我的回復

你的程序我試過了,沒達到我的預期效果
回復

使用道具 舉報

27#
ID:1088099 發(fā)表于 2023-12-19 09:01 | 只看該作者
鄭效桂 發(fā)表于 2023-12-18 20:54
你的程序我試過了,沒達到我的預期效果

有問題,我先修改一下
回復

使用道具 舉報

28#
ID:1088099 發(fā)表于 2023-12-19 14:36 來自手機 | 只看該作者

//IN1 IN2 IN3 IN44
//COM1
//COM2
//COM3
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //
void zz(){COM1 =0;COM2 =1;COM3 =1;}//
void fz(){COM1 =1;COM2 =0;COM3 =0;}//
void jb(){COM1 =1;COM2 =1;COM3 =0;}//λ
void tz(){COM1 =1;COM2 =1;COM3 =1;}//λ
void main()                                 
{
        int Flag=0;
  while(1){
          if(IN1 ==1){
                  if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();} //
                  if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();Flag=0;}  //
                }
          if(IN1 ==0){
                  if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}         //
                  if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}         //
                  if((IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();Flag=1;}                     //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}              //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();jb();Flag=0;}  //
                }                        
        }
}
回復

使用道具 舉報

29#
ID:1104510 發(fā)表于 2023-12-19 15:17 | 只看該作者
金玉之食 發(fā)表于 2023-12-19 14:36
//IN1 IN2 IN3 IN44
//COM1
//COM2

最后一步不對,最后一步應該是COM1 =1,COM2 =1,COM3 =0,現(xiàn)在運行出來的結果是,COM1 =0;COM2 =1;COM3 =1;
回復

使用道具 舉報

30#
ID:1088099 發(fā)表于 2023-12-19 15:27 | 只看該作者
鄭效桂 發(fā)表于 2023-12-19 15:17
最后一步不對,最后一步應該是COM1 =1,COM2 =1,COM3 =0,現(xiàn)在運行出來的結果是,COM1 =0;COM2 =1;COM3 =1 ...

說一下實驗現(xiàn)象,也有可能是又重新進入循環(huán)導致的,判斷之間間隔時間短被忽略了
回復

使用道具 舉報

31#
ID:1104510 發(fā)表于 2023-12-19 15:46 | 只看該作者
好了     我改了一下  又加了點新功能  謝謝了
void csh(){COM1 =1;COM2 =0;COM3 =1;}
void tz(){COM1 =1;COM2 =1;COM3 =1;}
void zz(){COM1 =0;COM2 =1;COM3 =1;}
void fz(){COM1 =1;COM2 =0;COM3 =0;}
void jb(){COM1 =1;COM2 =1;COM3 =0;}
void main()                                 
    {
        int Flag=0;
          while(1)
            {
                  if(IN1 ==1)
                    {
                          if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();} //
                          if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();Flag=0;}  //
                    }
                  if(IN1 ==0)
                    {
                          if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}         //
                          if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}         //
                          if((IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();Flag=1;}                     //
                          if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}              //
                          if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){jb();}  //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==0)){tz();Flag=2;}
                        if((Flag ==2)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                    }                        
            }
    }
現(xiàn)在已經達到我的預期效果了   多謝多謝

回復

使用道具 舉報

32#
ID:1104510 發(fā)表于 2023-12-19 16:02 | 只看該作者

這就是標記法吧
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表