標(biāo)題: 51單片機(jī)功能實(shí)現(xiàn) 啟動(dòng)條件,不自鎖開(kāi)關(guān)1按下 燈1,2,3,4閃爍, 傳感器1,2,3,4觸發(fā)... [打印本頁(yè)]

作者: 小菜苗    時(shí)間: 2022-11-9 21:04
標(biāo)題: 51單片機(jī)功能實(shí)現(xiàn) 啟動(dòng)條件,不自鎖開(kāi)關(guān)1按下 燈1,2,3,4閃爍, 傳感器1,2,3,4觸發(fā)...
啟動(dòng)條件,不自鎖開(kāi)關(guān)1按下
燈1,2,3,4閃爍,
傳感器1,2,3,4觸發(fā),對(duì)應(yīng)燈1,2,3,4長(zhǎng)亮,未感應(yīng)到的繼續(xù)閃爍,
若4盞燈同時(shí)亮則結(jié)束程序等待下一次啟動(dòng)信號(hào)
在程序運(yùn)行過(guò)程中只要自鎖開(kāi)關(guān)2按下程序全部停止,
自鎖松開(kāi),開(kāi)關(guān)1按下程序從頭運(yùn)行。
求大神給我一個(gè)大概的思路用什么方法去實(shí)現(xiàn)。下面是我的一部分其他的不知道怎么寫(xiě)了

#include<reg51.h>
sbit S1=P3^6;
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
void Delay(unsigned int t);
void main (void)
{



while (1)        
  {
    if(S1==1)
     {
      LED0=0;
          LED1=0;
          LED2=0;
          LED2=0;

      Delay(10000);     

      LED0=1;  
          LED1=1;
          LED2=1;
          LED3=1;         
      Delay(10000);
     }                 
  }
}

void Delay(unsigned int t)
{
while(--t);
}




作者: lkc8210    時(shí)間: 2022-11-9 21:04
小菜苗 發(fā)表于 2022-11-10 10:17
如果我是開(kāi)關(guān)1按下,燈1閃爍,傳感器1觸發(fā)燈1常亮,燈1常亮以后燈2閃爍,傳感器2觸發(fā)燈2常亮,燈2常亮以 ...

基于我的代碼加幾個(gè)中大括號(hào)就行了
自己想一下
作者: 小菜苗    時(shí)間: 2022-11-9 22:22
大佬們可不可以用if ... else if ...else if...來(lái)實(shí)現(xiàn)呀
作者: lkc8210    時(shí)間: 2022-11-9 22:40


作者: 大漠落日    時(shí)間: 2022-11-10 09:59
這個(gè)方案應(yīng)該采用一個(gè)定時(shí)器產(chǎn)生閃爍信號(hào),按鍵由于只檢測(cè)觸發(fā),所以不用采用按鍵延時(shí)方法處理。檢測(cè)到按鍵后,產(chǎn)生一個(gè)標(biāo)志,再判斷標(biāo)志去檢測(cè)傳感器,傳感器信號(hào)置位一個(gè)標(biāo)志,該標(biāo)志與閃爍信號(hào)進(jìn)行位運(yùn)算產(chǎn)生最終位標(biāo)志,驅(qū)動(dòng)LED,當(dāng)四路傳感器標(biāo)志全為1時(shí),清除LED指示燈及傳感器標(biāo)志位,返回停止?fàn)顟B(tài)
作者: 小菜苗    時(shí)間: 2022-11-10 10:17
lkc8210 發(fā)表于 2022-11-9 22:40

如果我是開(kāi)關(guān)1按下,燈1閃爍,傳感器1觸發(fā)燈1常亮,燈1常亮以后燈2閃爍,傳感器2觸發(fā)燈2常亮,燈2常亮以后燈3閃爍,傳感器3觸發(fā)燈3常亮,燈3常亮以后燈4閃爍,傳感器4觸發(fā)燈4常亮。所有燈都常亮后停止運(yùn)行等待下一次啟動(dòng),開(kāi)關(guān)2還是急停作用。這個(gè)應(yīng)該用什么方法去實(shí)現(xiàn)呢
作者: 大漠落日    時(shí)間: 2022-11-10 12:20
這個(gè)一樣的,按照順序控制進(jìn)行,開(kāi)關(guān)1觸發(fā)后,寫(xiě)燈1標(biāo)志位,允許燈1進(jìn)入工作態(tài),用閃爍信號(hào)與傳感器觸發(fā)信號(hào)來(lái)控制燈1,燈1常亮標(biāo)志允許燈2進(jìn)入工作態(tài),依次類(lèi)推,不是很難
作者: Longan.Wang    時(shí)間: 2022-11-10 13:48
說(shuō)實(shí)話(huà),你的需求都沒(méi)有表述清楚!
還有,你程序初始化部分都沒(méi)有。
作者: 小菜苗    時(shí)間: 2022-11-10 14:32
大漠落日 發(fā)表于 2022-11-10 12:20
這個(gè)一樣的,按照順序控制進(jìn)行,開(kāi)關(guān)1觸發(fā)后,寫(xiě)燈1標(biāo)志位,允許燈1進(jìn)入工作態(tài),用閃爍信號(hào)與傳感器觸發(fā)信 ...

對(duì)于你們大佬來(lái)說(shuō)簡(jiǎn)單,我們小白就難了呀,大佬能指導(dǎo)一下程序怎么改么
作者: wzh598    時(shí)間: 2022-11-10 14:53
這個(gè)方案可以使用一個(gè)定時(shí)器根據(jù)指置時(shí)間間隔來(lái)翻轉(zhuǎn)四根引腳,產(chǎn)生四路閃爍信號(hào),使用四個(gè)外部中斷接入四個(gè)傳感器觸發(fā)信號(hào),在外部中斷程序里置對(duì)應(yīng)引腳停止翻轉(zhuǎn)標(biāo)志,定時(shí)中斷里根據(jù)停止翻轉(zhuǎn)標(biāo)志來(lái)停止翻轉(zhuǎn)引腳,并置相應(yīng)引腳高電平。當(dāng)四個(gè)停止翻轉(zhuǎn)標(biāo)志都置位時(shí),定時(shí)器停止運(yùn)行,再次檢測(cè)到啟動(dòng)信號(hào),再開(kāi)啟定時(shí)器的運(yùn)行。
作者: wzh598    時(shí)間: 2022-11-10 15:01
這個(gè)方案可以使用定時(shí)器,在定時(shí)中斷程序里翻轉(zhuǎn)四根IO引腳產(chǎn)生四路閃爍信號(hào),使用外部中斷接收四個(gè)傳感器輸入信號(hào),在外部中斷程序里對(duì)相應(yīng)IO引腳是否翻轉(zhuǎn)置失能標(biāo)志,定時(shí)中斷程序里檢測(cè)到該標(biāo)志則停止翻轉(zhuǎn)相應(yīng)IO引腳,并置高電平。當(dāng)四個(gè)標(biāo)志都置位時(shí),停止定時(shí)器。當(dāng)再檢測(cè)到輸入信號(hào)時(shí),開(kāi)啟定時(shí)器。
作者: 小菜苗    時(shí)間: 2022-11-10 16:48
Longan.Wang 發(fā)表于 2022-11-10 13:48
說(shuō)實(shí)話(huà),你的需求都沒(méi)有表述清楚!
還有,你程序初始化部分都沒(méi)有。

就是不曉得怎么去搞
作者: 小菜苗    時(shí)間: 2022-11-10 16:56
Longan.Wang 發(fā)表于 2022-11-10 13:48
說(shuō)實(shí)話(huà),你的需求都沒(méi)有表述清楚!
還有,你程序初始化部分都沒(méi)有。

下面有要求更加全一些的,這是我自己想的,不是很全面,謝謝大哥提意見(jiàn)
作者: feihong0563    時(shí)間: 2022-11-10 17:05
可以研究一下,謝謝樓主
作者: 小菜苗    時(shí)間: 2022-11-10 17:48
小菜苗 發(fā)表于 2022-11-10 16:56
下面有要求更加全一些的,這是我自己想的,不是很全面,謝謝大哥提意見(jiàn)

就是這個(gè)邏輯

6E4A08DF-0972-45B5-B857-1F455A764746.jpeg (809.53 KB, 下載次數(shù): 99)

6E4A08DF-0972-45B5-B857-1F455A764746.jpeg

作者: 小菜苗    時(shí)間: 2022-11-10 20:31
lkc8210 發(fā)表于 2022-11-10 17:52
基于我的代碼加幾個(gè)中大括號(hào)就行了
自己想一下

之前的代碼我感覺(jué)都不能實(shí)現(xiàn)功能
作者: 小菜苗    時(shí)間: 2022-11-10 21:07
小菜苗 發(fā)表于 2022-11-10 20:31
之前的代碼我感覺(jué)都不能實(shí)現(xiàn)功能

大佬是我自己搞錯(cuò)了定義的端口啦,
作者: 小菜苗    時(shí)間: 2022-11-10 23:21
#include<reg51.h>
typedef   unsigned char  u8;
typedef   unsigned int  u16;
typedef   unsigned long  u32;
sbit S1=P3^6;
sbit S2=P3^7;


sbit Sensor1 = P2^0;
sbit Sensor2 = P2^1;
sbit Sensor3 = P2^2;
sbit Sensor4 = P2^3;


sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;



void Delay1ms()
   {
     unsigned char i,j;
         i=2;
         j=239;
         do
         {
            while(--j);
         }
         while(--i);
   }

void main(void)
{
      u16 DelayCnt = 0;
          bit Flash1 = 0,Flash2 = 0, Flash3 = 0,Flash4 = 0, Start = 0;

          while(1)
          {
            if(S1==0)
                  {
                    Start = 1;
                        Flash1 = 0;
                        Flash2 = 0;
                        Flash3 = 0;
                        Flash4 = 0;
                       
                  }
                if(S2==0)
                  {
                   Start = 0;
                   DelayCnt = 0;
                   Flash1 = 0;
                   Flash2 = 0;
                   Flash3 = 0;
                   Flash4 = 0;
                   LED1=1;
                   LED2=1;
                   LED3=1;
                   LED4=1;
                  
                  }
                 if(Sensor1==0)Flash1 = 1;
                 if(Sensor2==0)Flash2 = 1;
                 if(Sensor3==0)Flash3 = 1;
                 if(Sensor4==0)Flash4 = 1;       
                 

                 if(Start)
                 {
                     if(DelayCnt++>=1000)
                         {
                             DelayCnt = 0;
                                 if(Flash1==0)
                                    LED1=!LED1;
                                 else
                                    LED1=0;

                                 if(Flash1==1)
                                      {
                                          
                                      DelayCnt = 0;
                                          if(Flash2==0)
                                             LED2=!LED2;
                                          else
                                            LED2=0;
                                                                if(Flash2==1)
                                                    {
                                          
                                                   DelayCnt = 0;
                                                       if(Flash3==0)
                                                          LED3=!LED3;
                                                       else
                                                          LED3=0;
                                                                                      if(Flash3==1)
                                                                  {
                                          
                                                                DelayCnt = 0;
                                                                    if(Flash4==0)
                                                                       LED4=!LED4;
                                                                    else
                                                                       LED4=0;
                                                                                                   }
                                                                         }
                                          }
                                 
                               
                         }
                 
                 
                 }
                 
                Delay1ms();
          }






}感謝大佬們的不吝指導(dǎo),雖有艱難但也完成,感謝
作者: 小菜苗    時(shí)間: 2022-11-11 12:06
lkc8210 發(fā)表于 2022-11-9 22:40

哈嘍,你可不可以幫我看一下,我的那個(gè)最后程序,現(xiàn)在傳感器2.3.4觸發(fā),燈234也會(huì)亮,我的設(shè)計(jì)初衷是只有1亮了,2才能亮,12亮了3才能亮,123亮了4才能亮,指導(dǎo)一下唄
作者: 熱度三分    時(shí)間: 2022-11-11 15:57
小菜苗 發(fā)表于 2022-11-11 12:06
哈嘍,你可不可以幫我看一下,我的那個(gè)最后程序,現(xiàn)在傳感器2.3.4觸發(fā),燈234也會(huì)亮,我的設(shè)計(jì)初衷是只有 ...

你把 if(Sensor2==0)Flash2 = 1; if(Sensor3==0)Flash3 = 1; if(Sensor4==0)Flash4 = 1;   一層一層套進(jìn)去不就好了嗎,只有1觸發(fā),燈1亮,1觸發(fā)的前提下,2再觸發(fā)燈2亮,
作者: lkc8210    時(shí)間: 2022-11-11 16:56
小菜苗 發(fā)表于 2022-11-11 12:06
哈嘍,你可不可以幫我看一下,我的那個(gè)最后程序,現(xiàn)在傳感器2.3.4觸發(fā),燈234也會(huì)亮,我的設(shè)計(jì)初衷是只有 ...
  1.                 if(Sensor1==0)Flash1 = 1;
  2.                 if(Flash1)if(Sensor2==0)Flash2 = 1;
  3.                 if(Flash2)if(Sensor3==0)Flash3 = 1;
  4.                 if(Flash3)if(Sensor4==0)Flash4 = 1;
復(fù)制代碼





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