找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

請大神們賜教單片機(jī)鍵控LED程序思路 謝謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:202586 發(fā)表于 2021-4-18 20:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實現(xiàn),謝謝大家

大神們請教你們,我想用1個開關(guān)(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2還亮著,2分鐘后LED1又亮起來,5秒鐘后LED1,LED2都熄滅,不管任何時候K1斷開為高電平時LED1,LED2都熄滅,一直循環(huán),用的STC15F104W單片機(jī),多時段的程序還不會弄,請大神們多多指教謝謝。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:894154 發(fā)表于 2021-4-19 08:20 | 只看該作者
用Switch就很好理解了
switch(key)
  {
      case 0:if(mscount)   break;
      case 1:LED1=0;LED2=0;break;
      default:break;
  }

評分

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

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:592807 發(fā)表于 2021-4-19 10:25 | 只看該作者
哪來的的多時段?5秒一次中斷,中斷一次全局變量flag_5S+=1,,flag_5S==1時LED1滅和flag_5S==60時flag_5S=0;LED1亮。數(shù)羊只會數(shù)1-5,有20只羊,那你分成4組不就行了,每組5只。

評分

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

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:77840 發(fā)表于 2021-4-19 13:11 | 只看該作者
你可以參考用定時器典型用法來設(shè)置好時間基數(shù),比如設(shè)置定時器10ms溢出一次,那溢出標(biāo)志TF0(或TF1)就作為if語句判斷條件來執(zhí)行變量計數(shù),變量計數(shù)達(dá)到100次就是1秒,再以此作為條件來執(zhí)行IO輸出的亮滅。你可以自己去計算需要的計數(shù)值,以獲取具體的執(zhí)行效果。

評分

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

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:326430 發(fā)表于 2021-4-19 13:16 | 只看該作者
樓上說的對,做個時間片就行了。
回復(fù)

使用道具 舉報

6#
ID:587810 發(fā)表于 2021-4-19 13:27 | 只看該作者
你可以設(shè)計固定時間中斷一次,在中斷程序中用一個int變量來記錄時間,每中斷一次記錄一次,然后再用if-else指令或者switch-Case做判斷,來執(zhí)行l(wèi)ed的亮滅順序就好。

評分

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

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:202586 發(fā)表于 2021-4-23 20:17 | 只看該作者
好的。謝謝大家的幫助,謝謝
回復(fù)

使用道具 舉報

8#
ID:911048 發(fā)表于 2021-4-23 21:29 | 只看該作者
可以用兩個if,一個判斷低電平,一個判斷高電平。對應(yīng)實現(xiàn)功能的程序?qū)慽f里。
回復(fù)

使用道具 舉報

9#
ID:911048 發(fā)表于 2021-4-23 21:32 | 只看該作者
可以用中斷來實現(xiàn),把你想要實現(xiàn)功能的寫在中斷程序里
回復(fù)

使用道具 舉報

10#
ID:202586 發(fā)表于 2021-4-26 17:22 | 只看該作者
        if(k1)       
                                {
                               
                               
                                        LED1=0;//關(guān)閉
                                         LED2=0;//關(guān)閉       
                                       
                                        CNT_TIMER1++;
                                        if(CNT_TIMER1>40)        //計時2S
                                        {
                                       
                                                LED1=1;        //打開
                                                 LED2=1;        //打開
                                                
                               
                                        }
                                }
                                else       
                                {
                                      CNT_TIMER2++;
                                        if(CNT_TIMER2>100)        //計時大于5S
                                        {  
                                       
                                                {
                                       
                                                LED1=1;        //打開
                                                LED2=0;//關(guān)閉
                                                                                                                                                                                
                               
                                                 }

                       

                                        }
                                        else
                                        {           
                                                       
                                                CNT_TIMER3++;
                                                if(CNT_TIMER3>2400)//計時2分鐘
                                        {       
                                                LED1=1;        //打開
                                                LED2=1;        //打開
                                                 }
                                  else
                                        {           
                                                       
                                                CNT_TIMER4++;
                                                if(CNT_TIMER4>100)//計時5S
                                        {       
                                                LED1=0;        //關(guān)閉
                                                LED2=0;        //關(guān)閉
                                     }



                                        }          
                       
                                }                                

                        }
回復(fù)

使用道具 舉報

11#
ID:202586 發(fā)表于 2021-4-26 17:25 | 只看該作者
這樣不行,2分多鐘后不能停下來,請老師們幫我看下謝謝
回復(fù)

使用道具 舉報

12#
ID:202586 發(fā)表于 2021-4-26 17:28 | 只看該作者
(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2還亮著,2分鐘后LED1又亮起來,5秒鐘后LED1,LED2都熄滅,等待下一次開關(guān)斷開后再合閉,不管任何時候K1斷開為高電平時LED1,LED2都熄滅,一直循環(huán),用的STC15F104W單片機(jī),還不會弄,請大神們多多指教謝謝。
回復(fù)

使用道具 舉報

13#
ID:592807 發(fā)表于 2021-4-26 18:16 | 只看該作者
學(xué)徒工--靜 發(fā)表于 2021-4-26 17:28
(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2 ...

你要么在亮滅一定次數(shù)后吧定時器關(guān)掉,要么就該標(biāo)志位
回復(fù)

使用道具 舉報

14#
ID:202586 發(fā)表于 2021-4-27 07:30 | 只看該作者
老師怎么弄,我不知道啊,請幫幫我謝謝
回復(fù)

使用道具 舉報

15#
ID:592807 發(fā)表于 2021-4-27 08:41 | 只看該作者
學(xué)徒工--靜 發(fā)表于 2021-4-27 07:30
老師怎么弄,我不知道啊,請幫幫我謝謝

程序規(guī)范一下,問題一下子就出來了。
     if(k1)      
        {                       
           LED1=0;//關(guān)閉
           LED2=0;//關(guān)閉      
           CNT_TIMER1++;
           if(CNT_TIMER1>40)        //計時2S
               {
                  LED1=1;        //打開
                 LED2=1;        //打開
                }
           }
    /*上面部分,K1閉合狀態(tài)下有效,LED1,LED2關(guān)閉,2秒后LED1,LED2打開,
         但是CNT_TIMER1一直保持大于40的記錄,
         因此每次進(jìn)入中斷必然經(jīng)歷LED1 LED2先關(guān)閉再開啟過程,太快了,可能肉眼不可見
*/
     else      
     {
       CNT_TIMER2++;
        if(CNT_TIMER2>100)        //計時大于5S
           {  
               {
                   LED1=1;        //打開
                   LED2=0;//關(guān)閉
                }
             }
             else
               {           
                  CNT_TIMER3++;
/*我不知道這是誰教你寫的,這么多循環(huán)嵌套,思路是怎么來的。
  當(dāng)開關(guān)K1==0時候,CNT_TIMER2+=1;但是當(dāng)CNT_TIMER2小于或者等于200時,CNT_TIMER3+=1。
  也就是說在 CNT_TIMER2 小于或者等于200的前提下CNT_TIMER2 = CNT_TIMER3.
問一下,當(dāng)CNT_TIMER2大于200的時候,CNT_TIMER3呢?
*/
                     if(CNT_TIMER3>2400)//計時2分鐘
                        {      
                           LED1=1;        //打開
                           LED2=1;        //打開
                          }
                         else
                           {           
                                 CNT_TIMER4++;
                                 if(CNT_TIMER4>100)//計時5S
                                   {      
                                       LED1=0;        //關(guān)閉
                                       LED2=0;        //關(guān)閉
                                     }
                                 }         
      }                                

                        


回復(fù)

使用道具 舉報

16#
ID:89515 發(fā)表于 2021-4-27 09:22 來自手機(jī) | 只看該作者
按你的邏輯,你得一直按著按鍵2分多鐘。!這是干嘛呢?
回復(fù)

使用道具 舉報

17#
ID:89515 發(fā)表于 2021-4-27 09:40 來自手機(jī) | 只看該作者
是開關(guān)呢!那直接用一個時間變量就行了,每次清零。if:開關(guān)閉合的所有功能else:開關(guān)開啟的功能。但是必須分狀態(tài),不然對開關(guān)打開檢測會有延時。
回復(fù)

使用道具 舉報

18#
ID:202586 發(fā)表于 2021-5-14 07:55 來自手機(jī) | 只看該作者
mengzhixinheng 發(fā)表于 2021-4-27 09:40
是開關(guān)呢!那直接用一個時間變量就行了,每次清零。if:開關(guān)閉合的所有功能else:開關(guān)開啟的功能。但是必須 ...

謝謝您老師,我想用
(K1,)控制兩個燈(LED1,LED2),假如K1合閉為低電平,2秒鐘后LED1和LED2都點亮,過5秒鐘后LED1熄滅,LED2還亮著,過2分鐘后LED1又亮起來,再過5秒鐘后LED1,LED2都熄滅,一直等待K1斷開,如果K1三分鐘還沒斷開的話,我想用LED1和LED2閃爍報警,不管任何時候如果K1斷開為高電平時直接熄滅LED1和LED2,等待下一次K1合閉執(zhí)行以上的動作,
問題就出在這里我不知道它要怎么寫,前面的是開關(guān)K1關(guān)閉時有二種狀態(tài),我的意思第一種狀態(tài)就是過了132秒后,即使K1開關(guān)還是關(guān)閉的狀態(tài)也要LED1和LED2全部熄滅;
第二種狀態(tài)就是180秒后如果K1開關(guān)還是關(guān)閉狀態(tài)的話,就讓LED1和LED2以1秒一次的閃爍報警。
不管任何時候如果K1斷開了就直接熄滅LED和1LED2。等待著開關(guān)K1的下次合閉,不知道這樣會不會沖突,能不能幫我寫個學(xué)習(xí)一下謝謝
回復(fù)

使用道具 舉報

19#
ID:213173 發(fā)表于 2021-5-14 14:57 | 只看該作者
學(xué)徒工--靜 發(fā)表于 2021-4-26 17:28
(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2 ...

這是非常簡單的邏輯控制,給你寫一個示例,你試試。IO口可以根據(jù)實際需要重新定義,最好避開P3.0和P3.1,以免影響下載程序。

  1. #include <STC15F2K60S2.H>//頭文件適用STC15F104W
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit key =P3^2;
  5. sbit LED1=P3^3;
  6. sbit LED2=P3^4;

  7. bit sign=0,flag=0;
  8. uchar sec,num;

  9. //ms延時子函數(shù)(11.0592MHz 1T單片機(jī))
  10. void delay(uint k)
  11. {
  12.         uint i,j;
  13.         for(i=k;i>0;i--)
  14.                 for(j=829;j>0;j--);
  15. }
  16. //啟動開關(guān)函數(shù)
  17. void switch_scan()
  18. {
  19.         if(!key)
  20.         {
  21.                 delay(10);
  22.                 if(!key && !sign)
  23.                 {
  24.                         sign=1;
  25.                         flag=1;
  26.                 }
  27.         }
  28.         else
  29.         {
  30.                 sign=0;
  31.                 flag=0;
  32.         }
  33. }

  34. void Timer0Init()        //50毫秒@11.0592MHz
  35. {
  36.         TMOD= 0x01;                //設(shè)置定時器模式
  37.         TL0 = 0x00;                //設(shè)置定時初值
  38.         TH0 = 0x4C;                //設(shè)置定時初值
  39.         TR0 = 1;                        //定時器0開始計時
  40.         EA  = 1;                        //開總中斷
  41.         ET0 = 1;                        //開T0中斷
  42. }

  43. void main()
  44. {
  45.         Timer0Init();
  46.         while(1)
  47.         {
  48.                 switch_scan();
  49.                 if(flag)
  50.                 {
  51.                         if(sec>=2&&sec<7)//延時2秒鐘后LED1和LED2點亮5秒鐘
  52.                         {
  53.                                 LED1=0;
  54.                                 LED2=0;
  55.                         }
  56.                         else if(sec>=7&&sec<127)//5秒鐘后LED1熄滅,LED2還亮著2分鐘
  57.                         {
  58.                                 LED1=1;
  59.                         }
  60.                         else if(sec>=127&&sec<132)//2分鐘后LED1又亮起來5秒鐘
  61.                         {
  62.                                 LED1=0;
  63.                         }
  64.                         else if(sec>=132)//5秒鐘后LED1,LED2都熄滅
  65.                         {
  66.                                 LED1=1;
  67.                                 LED2=1;
  68.                                 flag=0;
  69.                         }
  70.                 }
  71.                 else //全部復(fù)位
  72.                 {
  73.                         LED1=1;
  74.                         LED2=1;
  75.                         sec=0;
  76.                         num=0;
  77.                 }
  78.         }
  79. }

  80. void timer0_isr()interrupt 1
  81. {
  82.         TL0 = 0x00;                //設(shè)置定時初值
  83.         TH0 = 0x4C;                //設(shè)置定時初值
  84.         if(flag)
  85.         {
  86.                 if(++num>=20)
  87.                 {
  88.                         num=0;
  89.                         sec++;                       
  90.                 }
  91.         }
  92. }

復(fù)制代碼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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