久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2779|回復: 18
收起左側

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

[復制鏈接]
ID:202586 發表于 2021-4-18 20:20 | 顯示全部樓層 |閱讀模式
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來寫程序去實現,謝謝大家

大神們請教你們,我想用1個開關(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2還亮著,2分鐘后LED1又亮起來,5秒鐘后LED1,LED2都熄滅,不管任何時候K1斷開為高電平時LED1,LED2都熄滅,一直循環,用的STC15F104W單片機,多時段的程序還不會弄,請大神們多多指教謝謝。
回復

使用道具 舉報

ID:894154 發表于 2021-4-19 08:20 | 顯示全部樓層
用Switch就很好理解了
switch(key)
  {
      case 0:if(mscount)   break;
      case 1:LED1=0;LED2=0;break;
      default:break;
  }

評分

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

查看全部評分

回復

使用道具 舉報

ID:592807 發表于 2021-4-19 10:25 | 顯示全部樓層
哪來的的多時段?5秒一次中斷,中斷一次全局變量flag_5S+=1,,flag_5S==1時LED1滅和flag_5S==60時flag_5S=0;LED1亮。數羊只會數1-5,有20只羊,那你分成4組不就行了,每組5只。

評分

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

查看全部評分

回復

使用道具 舉報

ID:77840 發表于 2021-4-19 13:11 | 顯示全部樓層
你可以參考用定時器典型用法來設置好時間基數,比如設置定時器10ms溢出一次,那溢出標志TF0(或TF1)就作為if語句判斷條件來執行變量計數,變量計數達到100次就是1秒,再以此作為條件來執行IO輸出的亮滅。你可以自己去計算需要的計數值,以獲取具體的執行效果。

評分

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

查看全部評分

回復

使用道具 舉報

ID:326430 發表于 2021-4-19 13:16 | 顯示全部樓層
樓上說的對,做個時間片就行了。
回復

使用道具 舉報

ID:587810 發表于 2021-4-19 13:27 | 顯示全部樓層
你可以設計固定時間中斷一次,在中斷程序中用一個int變量來記錄時間,每中斷一次記錄一次,然后再用if-else指令或者switch-Case做判斷,來執行led的亮滅順序就好。

評分

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

查看全部評分

回復

使用道具 舉報

ID:202586 發表于 2021-4-23 20:17 | 顯示全部樓層
好的。謝謝大家的幫助,謝謝
回復

使用道具 舉報

ID:911048 發表于 2021-4-23 21:29 | 顯示全部樓層
可以用兩個if,一個判斷低電平,一個判斷高電平。對應實現功能的程序寫if里。
回復

使用道具 舉報

ID:911048 發表于 2021-4-23 21:32 | 顯示全部樓層
可以用中斷來實現,把你想要實現功能的寫在中斷程序里
回復

使用道具 舉報

ID:202586 發表于 2021-4-26 17:22 | 顯示全部樓層
        if(k1)       
                                {
                               
                               
                                        LED1=0;//關閉
                                         LED2=0;//關閉       
                                       
                                        CNT_TIMER1++;
                                        if(CNT_TIMER1>40)        //計時2S
                                        {
                                       
                                                LED1=1;        //打開
                                                 LED2=1;        //打開
                                                
                               
                                        }
                                }
                                else       
                                {
                                      CNT_TIMER2++;
                                        if(CNT_TIMER2>100)        //計時大于5S
                                        {  
                                       
                                                {
                                       
                                                LED1=1;        //打開
                                                LED2=0;//關閉
                                                                                                                                                                                
                               
                                                 }

                       

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



                                        }          
                       
                                }                                

                        }
回復

使用道具 舉報

ID:202586 發表于 2021-4-26 17:25 | 顯示全部樓層
這樣不行,2分多鐘后不能停下來,請老師們幫我看下謝謝
回復

使用道具 舉報

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

使用道具 舉報

ID:592807 發表于 2021-4-26 18:16 | 顯示全部樓層
學徒工--靜 發表于 2021-4-26 17:28
(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2 ...

你要么在亮滅一定次數后吧定時器關掉,要么就該標志位
回復

使用道具 舉報

ID:202586 發表于 2021-4-27 07:30 | 顯示全部樓層
老師怎么弄,我不知道啊,請幫幫我謝謝
回復

使用道具 舉報

ID:592807 發表于 2021-4-27 08:41 | 顯示全部樓層
學徒工--靜 發表于 2021-4-27 07:30
老師怎么弄,我不知道啊,請幫幫我謝謝

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

                        


回復

使用道具 舉報

ID:89515 發表于 2021-4-27 09:22 來自手機 | 顯示全部樓層
按你的邏輯,你得一直按著按鍵2分多鐘!!!這是干嘛呢?
回復

使用道具 舉報

ID:89515 發表于 2021-4-27 09:40 來自手機 | 顯示全部樓層
是開關呢!那直接用一個時間變量就行了,每次清零。if:開關閉合的所有功能else:開關開啟的功能。但是必須分狀態,不然對開關打開檢測會有延時。
回復

使用道具 舉報

ID:202586 發表于 2021-5-14 07:55 來自手機 | 顯示全部樓層
mengzhixinheng 發表于 2021-4-27 09:40
是開關呢!那直接用一個時間變量就行了,每次清零。if:開關閉合的所有功能else:開關開啟的功能。但是必須 ...

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

使用道具 舉報

ID:213173 發表于 2021-5-14 14:57 | 顯示全部樓層
學徒工--靜 發表于 2021-4-26 17:28
(K1,)控制兩個IO口(LED1,LED2),假如K1合閉為低電平,延時2秒鐘后LED1和LED2點亮,5秒鐘后LED1熄滅,LED2 ...

這是非常簡單的邏輯控制,給你寫一個示例,你試試。IO口可以根據實際需要重新定義,最好避開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延時子函數(11.0592MHz 1T單片機)
  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. //啟動開關函數
  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;                //設置定時器模式
  37.         TL0 = 0x00;                //設置定時初值
  38.         TH0 = 0x4C;                //設置定時初值
  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 //全部復位
  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;                //設置定時初值
  83.         TH0 = 0x4C;                //設置定時初值
  84.         if(flag)
  85.         {
  86.                 if(++num>=20)
  87.                 {
  88.                         num=0;
  89.                         sec++;                       
  90.                 }
  91.         }
  92. }

復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线欧美 | 精品亚洲一区二区三区 | 日韩超碰 | 一级免费看片 | 亚洲精品视频免费观看 | 欧美精品一区二区三区蜜桃视频 | 成人精品一区亚洲午夜久久久 | 成人一区二区视频 | 九九综合九九 | 青青草视频网站 | 综合色播 | 国产午夜精品一区二区三区嫩草 | 日韩欧美在线免费 | 91麻豆精品国产91久久久久久久久 | 日韩有码在线观看 | 国产不卡一区在线观看 | 美女视频三区 | 久草热视频 | 国产网站在线播放 | 久久国产成人 | 国产一区91精品张津瑜 | 国产一区日韩在线 | 日韩在线免费 | 国产精品高潮呻吟久久 | 久久噜噜噜精品国产亚洲综合 | 国产小视频在线 | 毛片一级片 | 欧美精品一区二区三区在线 | 日韩精品一区二区三区在线观看 | 第一福利社区1024 | 成人免费网站视频 | 亚洲精品毛片av | 婷婷中文字幕 | 一级视频在线免费观看 | 一区二区三区四区免费在线观看 | 国产精品福利视频 | 国内精品视频一区二区三区 | 精品一级毛片 | 黑人巨大精品 | 久久99久久99 | 欧美精品中文字幕久久二区 |