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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

自鎖和非自鎖開(kāi)關(guān)在單片機(jī)程序中用法?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
10黑幣
51單片機(jī)控制燈亮滅:用一個(gè)非自鎖開(kāi)關(guān)控制2個(gè)燈亮滅,當(dāng)做總開(kāi)關(guān)K總,再分別用2個(gè)自鎖按鍵開(kāi)關(guān)K1,K2控制這2個(gè)燈LED1,LED2亮滅。這種組合開(kāi)關(guān)的用法程序怎么寫(xiě)呢?

K總合上,K1,K2才起作用。K總斷開(kāi),K1,K2不起作用。K總合上時(shí),2個(gè)燈都亮,然后K1,K2可以分別控制亮滅。K總斷開(kāi)后,K1,K2延時(shí)10秒滅。

最佳答案

查看完整內(nèi)容

你一開(kāi)始這么說(shuō)就不用改那么多次
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2024-12-1 21:13 | 只看該作者
lch327 發(fā)表于 2024-12-2 22:15
K總開(kāi)關(guān)觸發(fā)后,2個(gè)燈就亮了,然后再用分開(kāi)關(guān)K1,,K2按鍵控制亮滅,然后不管燈亮滅,只要關(guān)斷K總,2個(gè)燈 ...

你一開(kāi)始這么說(shuō)就不用改那么多次
  1. #include <REG52.h>

  2. // 定義類(lèi)型別名
  3. typedef unsigned char u8;  // 0 到 255
  4. typedef unsigned int u16;   // 0 到 65535

  5. // 延時(shí)函數(shù),產(chǎn)生約 50 毫秒的延時(shí)
  6. void Delay50ms(void) //@11.0592MHz
  7. {
  8.     unsigned char data i, j; // 定義循環(huán)變量

  9.     i = 90;  // 外層循環(huán)次數(shù)
  10.     j = 163; // 內(nèi)層循環(huán)次數(shù)
  11.     do
  12.     {
  13.         while (--j); // 內(nèi)層循環(huán)
  14.     }
  15.     while (--i); // 外層循環(huán)
  16. }

  17. // 定義按鍵和 LED 引腳
  18. sbit Kzong = P3^1; // 總按鍵連接到 P3.1
  19. sbit K1 = P3^2;    // 按鍵 1 連接到 P3.2
  20. sbit K2 = P3^3;    // 按鍵 2 連接到 P3.3
  21. sbit LED1 = P2^0;  // LED1 連接到 P2.0
  22. sbit LED2 = P2^1;  // LED2 連接到 P2.1

  23. u8 Off_Delay = 0;  // 關(guān)燈延時(shí)計(jì)數(shù)器,初始化為 0

  24. void main()
  25. {
  26.     while(1) // 主循環(huán)
  27.     {
  28.         if(Kzong == 0) // 如果總按鍵被按下
  29.         {
  30.             if(Off_Delay == 0) // 如果延時(shí)計(jì)數(shù)器為 0
  31.             {
  32.                 LED1 = 0; // 開(kāi)啟 LED1
  33.                 LED2 = 0; // 開(kāi)啟 LED2
  34.             }
  35.             if(K1 == 0) // 如果按鍵 1 被按下
  36.             {
  37.                 Delay50ms(); // 延時(shí) 50ms
  38.                 if(K1 == 0) // 確認(rèn)按鍵 1 仍被按下
  39.                 {
  40.                     LED1 = !LED1; // 切換 LED1 狀態(tài)
  41.                     while(K1 == 0); // 等待按鍵 1 釋放
  42.                 }
  43.             }
  44.             if(K2 == 0) // 如果按鍵 2 被按下
  45.             {
  46.                 Delay50ms(); // 延時(shí) 50ms
  47.                 if(K2 == 0) // 確認(rèn)按鍵 2 仍被按下
  48.                 {
  49.                     LED2 = !LED2; // 切換 LED2 狀態(tài)
  50.                     while(K2 == 0); // 等待按鍵 2 釋放
  51.                 }
  52.             }
  53.             Off_Delay = 200; // 設(shè)置關(guān)燈延時(shí)計(jì)數(shù)器為 200
  54.         }
  55.         else // 如果總按鍵沒(méi)有被按下
  56.         {
  57.             if(Off_Delay != 0) // 如果延時(shí)計(jì)數(shù)器不為 0
  58.             {
  59.                 Delay50ms(); // 延時(shí) 50ms
  60.                 Off_Delay = Off_Delay - 1; // 遞減延時(shí)計(jì)數(shù)器
  61.                 if(Off_Delay == 0) // 如果計(jì)數(shù)器減到 0
  62.                 {
  63.                     LED1 = 1; // 熄滅 LED1
  64.                     LED2 = 1; // 熄滅 LED2
  65.                 }
  66.             }
  67.         }
  68.     }
  69. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:624769 發(fā)表于 2024-12-1 22:03 | 只看該作者
delay 函數(shù)你應(yīng)該自己會(huì)寫(xiě)吧?

bit  Off_Delay;
void  main()
{
     while(1)
     {
          if(Kzong == 0)
          {
                LED1 = K1;
                LED2 = K2;
                Off_Delay = 1;
          }
          else
         {
                 if(Off_Delay == 1)
                 {
                        Off_Delay  = 0;
                        delay_Sec(10);
                        LED1  = 1;
                        LED2  = 1;
                 }
         }
     }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:161164 發(fā)表于 2024-12-1 23:20 | 只看該作者
本帖最后由 lkc8210 于 2024-12-2 11:10 編輯

稍修一下
重開(kāi)不用等10秒
  1. u8  Off_Delay = 0;
  2. void  main()
  3. {
  4.         while(1)
  5.         {
  6.                 if(Kzong == 0)
  7.                 {
  8.                         LED1 = K1;
  9.                         LED2 = K2;
  10.                         Off_Delay = 200;
  11.                 }
  12.                 else
  13.                 {
  14.                         if(Off_Delay)
  15.                         {
  16.                                 if(--Off_Delay==0)
  17.                                 {
  18.                                         LED1  = 1;
  19.                                         LED2  = 1;
  20.                                 }
  21.                                 delay_ms(50);
  22.                         }
  23.                 }
  24.         }
  25. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

5#
ID:1109793 發(fā)表于 2024-12-2 08:03 | 只看該作者
開(kāi)關(guān)畫(huà)的不太對(duì)吧,K1K2好像表示非自鎖才比較合適吧
回復(fù)

使用道具 舉報(bào)

6#
ID:584814 發(fā)表于 2024-12-2 08:47 | 只看該作者
“K總斷開(kāi)后,K1,K2延時(shí)10秒滅”是K總斷開(kāi)后,無(wú)論K1,K2是亮是滅都要亮起延時(shí)10秒滅 ?
回復(fù)

使用道具 舉報(bào)

7#
ID:1009628 發(fā)表于 2024-12-2 10:11 | 只看該作者
man1234567 發(fā)表于 2024-12-2 08:47
“K總斷開(kāi)后,K1,K2延時(shí)10秒滅”是K總斷開(kāi)后,無(wú)論K1,K2是亮是滅都要亮起延時(shí)10秒滅 ?

不需要再亮起,只要給一個(gè)滅的指令就行,滅的 狀態(tài)不管,保持原樣,亮的 狀態(tài)滅掉就行了。
回復(fù)

使用道具 舉報(bào)

8#
ID:1009628 發(fā)表于 2024-12-2 10:16 | 只看該作者
xiaobendan001 發(fā)表于 2024-12-2 08:03
開(kāi)關(guān)畫(huà)的不太對(duì)吧,K1K2好像表示非自鎖才比較合適吧

K1,K2就是按鍵開(kāi)關(guān),屬于非自鎖開(kāi)關(guān)。我畫(huà)的不好。
回復(fù)

使用道具 舉報(bào)

9#
ID:1009628 發(fā)表于 2024-12-2 10:27 | 只看該作者
K總應(yīng)該是自鎖開(kāi)關(guān),K1,K2是非自鎖按鍵開(kāi)關(guān),說(shuō)錯(cuò)了。不好意思。
回復(fù)

使用道具 舉報(bào)

10#
ID:1109793 發(fā)表于 2024-12-2 11:12 | 只看該作者
lch327 發(fā)表于 2024-12-2 10:27
K總應(yīng)該是自鎖開(kāi)關(guān),K1,K2是非自鎖按鍵開(kāi)關(guān),說(shuō)錯(cuò)了。不好意思。

原來(lái)是說(shuō)反了,不是畫(huà)反了
回復(fù)

使用道具 舉報(bào)

11#
ID:1109793 發(fā)表于 2024-12-2 11:13 | 只看該作者
lch327 發(fā)表于 2024-12-2 10:27
K總應(yīng)該是自鎖開(kāi)關(guān),K1,K2是非自鎖按鍵開(kāi)關(guān),說(shuō)錯(cuò)了。不好意思。

那你這個(gè)延時(shí)是K總觸發(fā)的,這不是沒(méi)有啥意義了?平時(shí)K1K2都是斷開(kāi)的,燈也不亮啊
回復(fù)

使用道具 舉報(bào)

12#
ID:1009628 發(fā)表于 2024-12-2 12:03 | 只看該作者
188610329 發(fā)表于 2024-12-1 22:03
delay 函數(shù)你應(yīng)該自己會(huì)寫(xiě)吧?

bit  Off_Delay;

不好意思,開(kāi)關(guān)表達(dá)錯(cuò)了,應(yīng)該K總是自鎖開(kāi)關(guān),K1,K2是非自鎖按鍵開(kāi)關(guān)。所以這個(gè)程序K1,K2按下時(shí)燈滅,可是抬起時(shí)燈又亮了。應(yīng)該抬起是還保持滅的狀態(tài) ,再按一下燈亮,抬起時(shí)保持不變。
回復(fù)

使用道具 舉報(bào)

13#
ID:1009628 發(fā)表于 2024-12-2 14:01 | 只看該作者
188610329 發(fā)表于 2024-12-1 22:03
delay 函數(shù)你應(yīng)該自己會(huì)寫(xiě)吧?

bit  Off_Delay;

經(jīng)過(guò)試驗(yàn),還是不行。
回復(fù)

使用道具 舉報(bào)

14#
ID:1109793 發(fā)表于 2024-12-2 17:37 | 只看該作者
描述不對(duì),K1K2不是按下去燈亮,松開(kāi)燈滅,而是在K總接通的情況下,按一下改變一下燈的狀態(tài)。
K總斷開(kāi)后,如果燈亮就延時(shí)滅,不亮就不管了。
回復(fù)

使用道具 舉報(bào)

15#
ID:161164 發(fā)表于 2024-12-2 21:01 | 只看該作者
lch327 發(fā)表于 2024-12-2 12:03
不好意思,開(kāi)關(guān)表達(dá)錯(cuò)了,應(yīng)該K總是自鎖開(kāi)關(guān),K1,K2是非自鎖按鍵開(kāi)關(guān)。所以這個(gè)程序K1,K2按下時(shí)燈滅, ...
  1. u8  Off_Delay = 0;
  2. void  main()
  3. {
  4.         while(1)
  5.         {
  6.                 if(Kzong == 0)
  7.                 {
  8.                         if(!K1)
  9.                         {
  10.                                 delay_ms(50);
  11.                                 if(!K1)
  12.                                 {
  13.                                         LED1=!LED1;
  14.                                         while(!K1);
  15.                                 }
  16.                         }
  17.                         if(!K2)
  18.                         {
  19.                                 delay_ms(50);
  20.                                 if(!K2)
  21.                                 {
  22.                                         LED2=!LED2;
  23.                                         while(!K2);
  24.                                 }
  25.                         }
  26.                         Off_Delay = 200;
  27.                 }
  28.                 else
  29.                 {
  30.                         if(Off_Delay)
  31.                         {
  32.                                 if(--Off_Delay==0)
  33.                                 {
  34.                                         LED1  = 1;
  35.                                         LED2  = 1;
  36.                                 }
  37.                                 delay_ms(50);
  38.                         }
  39.                 }
  40.         }
  41. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

16#
ID:1009628 發(fā)表于 2024-12-2 21:40 | 只看該作者
xiaobendan001 發(fā)表于 2024-12-2 17:37
描述不對(duì),K1K2不是按下去燈亮,松開(kāi)燈滅,而是在K總接通的情況下,按一下改變一下燈的狀態(tài)。
K總斷開(kāi)后, ...

對(duì),對(duì),對(duì),感謝理解我的意思,就是您說(shuō)的這樣。我以為描述清楚了,實(shí)際容易誤解,您說(shuō)的準(zhǔn)確。
回復(fù)

使用道具 舉報(bào)

17#
ID:1009628 發(fā)表于 2024-12-2 22:15 | 只看該作者
xiaobendan001 發(fā)表于 2024-12-2 11:13
那你這個(gè)延時(shí)是K總觸發(fā)的,這不是沒(méi)有啥意義了?平時(shí)K1K2都是斷開(kāi)的,燈也不亮啊

K總開(kāi)關(guān)觸發(fā)后,2個(gè)燈就亮了,然后再用分開(kāi)關(guān)K1,,K2按鍵控制亮滅,然后不管燈亮滅,只要關(guān)斷K總,2個(gè)燈是滅的狀態(tài)就行了。
回復(fù)

使用道具 舉報(bào)

18#
ID:1009628 發(fā)表于 2024-12-2 22:28 | 只看該作者
lkc8210 發(fā)表于 2024-12-1 23:20
稍修一下
重開(kāi)不用等10秒

能寫(xiě)一個(gè)完整的嗎?U8是什么意思,(--off_Delay==0)是什么意思啊?看不懂,能注釋一下嗎?
回復(fù)

使用道具 舉報(bào)

19#
ID:1009628 發(fā)表于 2024-12-2 23:25 | 只看該作者

能寫(xiě)一個(gè)完整的嗎?U8是什么意思,(--off_Delay==0)是什么意思啊?看不懂,能注釋一下嗎?
回復(fù)

使用道具 舉報(bào)

20#
ID:1109793 發(fā)表于 2024-12-3 07:25 | 只看該作者
lch327 發(fā)表于 2024-12-2 23:25
能寫(xiě)一個(gè)完整的嗎?U8是什么意思,(--off_Delay==0)是什么意思啊?看不懂,能注釋一下嗎?

看起來(lái)C你是一點(diǎn)不懂啊,還是先看看書(shū)吧,代碼都給你了你都看不懂啊
回復(fù)

使用道具 舉報(bào)

21#
ID:624769 發(fā)表于 2024-12-3 21:32 | 只看該作者
lkc8210 發(fā)表于 2024-12-3 09:19
你一開(kāi)始這么說(shuō)就不用改那么多次

代碼有個(gè)小漏洞,假定 K1 / K2 年久失修,容易按下后卡住,不一定能彈起, 此時(shí) Kzong 會(huì)失效,建議,按下后,不要等待彈起,而是標(biāo)記“未彈起”,在“未彈起”標(biāo)記被清除前,不再判斷按鍵按下。
沒(méi)特別意思,屬于職業(yè)習(xí)慣的強(qiáng)迫癥。發(fā)現(xiàn)有漏洞,不說(shuō)就難受。
回復(fù)

使用道具 舉報(bào)

22#
ID:1009628 發(fā)表于 2024-12-4 17:07 | 只看該作者
188610329 發(fā)表于 2024-12-3 21:32
代碼有個(gè)小漏洞,假定 K1 / K2 年久失修,容易按下后卡住,不一定能彈起, 此時(shí) Kzong 會(huì)失效,建議,按下 ...

經(jīng)過(guò)試驗(yàn),確實(shí)有這個(gè)問(wèn)題,假如常按K1或K2不松手,K總就不起作用了,一直在那里死循環(huán)了。可程序具體怎么改能實(shí)現(xiàn)呢?我看一些教學(xué)里,也不提K1,K2卡住的問(wèn)題啊。那屬于硬件故障吧。教學(xué)里沒(méi)考慮這個(gè)問(wèn)題。如果按鍵壞了,肯定就得換按鍵,保證它是完好的。
回復(fù)

使用道具 舉報(bào)

23#
ID:1009628 發(fā)表于 2024-12-4 18:03 | 只看該作者
lkc8210 發(fā)表于 2024-12-1 21:13
你一開(kāi)始這么說(shuō)就不用改那么多次

感謝您的解答,困擾我多日的問(wèn)題解決了。我是新手,單片機(jī)愛(ài)好者,望您以后多多指教。十分感謝!!!
回復(fù)

使用道具 舉報(bào)

24#
ID:1109793 發(fā)表于 2024-12-4 18:18 | 只看該作者
lch327 發(fā)表于 2024-12-4 17:07
經(jīng)過(guò)試驗(yàn),確實(shí)有這個(gè)問(wèn)題,假如常按K1或K2不松手,K總就不起作用了,一直在那里死循環(huán)了。可程序具體怎 ...

做個(gè)演示沒(méi)問(wèn)題,控制個(gè)燈光也不打緊,如果是涉及安全性問(wèn)題,不能使用這種死等的方式了,做為實(shí)用產(chǎn)品,必須方方面面考慮到各種可能出現(xiàn)的情況。
回復(fù)

使用道具 舉報(bào)

25#
ID:161164 發(fā)表于 2024-12-5 00:03 | 只看該作者
lch327 發(fā)表于 2024-12-4 17:07
經(jīng)過(guò)試驗(yàn),確實(shí)有這個(gè)問(wèn)題,假如常按K1或K2不松手,K總就不起作用了,一直在那里死循環(huán)了。可程序具體怎 ...

非死等版本
  1. #include <REG52.h>

  2. // 定義類(lèi)型別名
  3. typedef unsigned char u8;  // 0 到 255
  4. typedef unsigned int u16;   // 0 到 65535

  5. // 延時(shí)函數(shù),產(chǎn)生約 50 毫秒的延時(shí)
  6. void Delay50ms(void) //@11.0592MHz
  7. {
  8.     unsigned char data i, j; // 定義循環(huán)變量

  9.     i = 90;  // 外層循環(huán)次數(shù)
  10.     j = 163; // 內(nèi)層循環(huán)次數(shù)
  11.     do
  12.     {
  13.         while (--j); // 內(nèi)層循環(huán)
  14.     }
  15.     while (--i); // 外層循環(huán)
  16. }

  17. // 定義按鍵和 LED 引腳
  18. sbit Kzong = P3^1; // 總按鍵連接到 P3.1
  19. sbit K1 = P3^2;    // 按鍵 1 連接到 P3.2
  20. sbit K2 = P3^3;    // 按鍵 2 連接到 P3.3
  21. sbit LED1 = P2^0;  // LED1 連接到 P2.0
  22. sbit LED2 = P2^1;  // LED2 連接到 P2.1

  23. u8 Off_Delay = 0;  // 關(guān)燈延時(shí)計(jì)數(shù)器,初始化為 0

  24. void main()
  25. {
  26.         bit K1_Lock = 1;
  27.         bit K2_Lock = 1;
  28.     while(1) // 主循環(huán)
  29.     {
  30.         if(Kzong == 0) // 如果總按鍵被按下
  31.         {
  32.             if(Off_Delay == 0) // 如果延時(shí)計(jì)數(shù)器為 0
  33.             {
  34.                 LED1 = 0; // 開(kāi)啟 LED1
  35.                 LED2 = 0; // 開(kāi)啟 LED2
  36.             }
  37.                         if(K1 == 0 && K1_Lock ==1) //下降沿觸發(fā)
  38.                         {
  39.                                 LED1 = !LED1; // 切換 LED1 狀態(tài)
  40.                         }
  41.                         K1_Lock = L1;
  42.                         if(K2 == 0 && K2_Lock ==1) //下降沿觸發(fā)
  43.                         {
  44.                                 LED2 = !LED2; // 切換 LED1 狀態(tài)
  45.                         }
  46.                         K2_Lock = L2;
  47.             Delay50ms(); // 延時(shí) 50ms
  48.             Off_Delay = 200; // 設(shè)置關(guān)燈延時(shí)計(jì)數(shù)器為 200
  49.         }
  50.         else // 如果總按鍵沒(méi)有被按下
  51.         {
  52.             if(Off_Delay != 0) // 如果延時(shí)計(jì)數(shù)器不為 0
  53.             {
  54.                 Delay50ms(); // 延時(shí) 50ms
  55.                 Off_Delay = Off_Delay - 1; // 遞減延時(shí)計(jì)數(shù)器
  56.                 if(Off_Delay == 0) // 如果計(jì)數(shù)器減到 0
  57.                 {
  58.                     LED1 = 1; // 熄滅 LED1
  59.                     LED2 = 1; // 熄滅 LED2
  60.                 }
  61.             }
  62.         }
  63.     }
  64. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

26#
ID:1009628 發(fā)表于 2024-12-6 14:31 | 只看該作者

這個(gè)程序解決了按鍵卡死的問(wèn)題。我搭建一個(gè)電路,用單片機(jī)控制ULN2003驅(qū)動(dòng)電路,單片機(jī)輸出高電平給2003,2003反相后低電位驅(qū)動(dòng)12V繼電器,12V繼電器再控制一個(gè)中間繼電器,這時(shí)候,KZONG,K1,K2都不穩(wěn)定,有時(shí)好使,有時(shí)不好使,K1和K2還互相干擾。可能接入中間繼電器后,會(huì)受到電磁干擾。不接中間繼電器沒(méi)事。如果換用三極管驅(qū)動(dòng)電路就沒(méi)問(wèn)題。(單片機(jī)低電位控制三極管驅(qū)動(dòng)12V小繼電器,再控制中間繼電器)用2種電路做了試驗(yàn)。還沒(méi)用燈泡做試驗(yàn),等有了燈泡再試試。我想是不是加按鍵延時(shí),會(huì)抵消干擾呢?下降沿觸發(fā)沒(méi)有延時(shí),按鍵一瞬間會(huì)受到干擾嗎?
回復(fù)

使用道具 舉報(bào)

27#
ID:1009628 發(fā)表于 2024-12-6 14:42 | 只看該作者

這種接法單片機(jī)會(huì)受到干擾
回復(fù)

使用道具 舉報(bào)

28#
ID:1109793 發(fā)表于 2024-12-6 16:05 | 只看該作者
lch327 發(fā)表于 2024-12-6 14:42
這種接法單片機(jī)會(huì)受到干擾

2003里面就是三極管吧
開(kāi)關(guān)線(xiàn)不能太長(zhǎng),否則要增加上拉電阻,還有電容。再長(zhǎng)就要加光耦隔離了
回復(fù)

使用道具 舉報(bào)

29#
ID:69038 發(fā)表于 2024-12-6 17:23 | 只看該作者
自鎖與非自鎖,不就是邏輯關(guān)系嗎?
請(qǐng)?jiān)徫覍?shí)話(huà)實(shí)說(shuō),連這么簡(jiǎn)單的邏輯都搞不定,代碼也不用寫(xiě)了。
如果不考慮去抖的動(dòng)作:
自鎖就是按一下一個(gè)狀態(tài)(比如連通),再按一下是另一個(gè)狀態(tài)(斷開(kāi));
非自鎖就是按下時(shí)是一個(gè)狀態(tài)(比如連通),放開(kāi)時(shí)是另一個(gè)狀態(tài)(斷開(kāi));
簡(jiǎn)單地說(shuō),自鎖開(kāi)關(guān)按兩下,相當(dāng)于非自鎖按一下而已。
搞不定自鎖,就加標(biāo)志,又不用占用太多的代碼空間。。。

回復(fù)

使用道具 舉報(bào)

30#
ID:161164 發(fā)表于 2024-12-6 17:44 | 只看該作者
lch327 發(fā)表于 2024-12-6 14:31
這個(gè)程序解決了按鍵卡死的問(wèn)題。我搭建一個(gè)電路,用單片機(jī)控制ULN2003驅(qū)動(dòng)電路,單片機(jī)輸出高電平給2003, ...

試試這個(gè)
  1. #include <REG52.h>

  2. // 定義類(lèi)型別名
  3. typedef unsigned char u8;  // 0 到 255
  4. typedef unsigned int u16;   // 0 到 65535

  5. // 延時(shí)函數(shù),產(chǎn)生約 50 毫秒的延時(shí)
  6. void Delay50ms(void) //@11.0592MHz
  7. {
  8.         unsigned char data i, j; // 定義循環(huán)變量

  9.         i = 90;  // 外層循環(huán)次數(shù)
  10.         j = 163; // 內(nèi)層循環(huán)次數(shù)
  11.         do
  12.         {
  13.                 while (--j); // 內(nèi)層循環(huán)
  14.         }
  15.         while (--i); // 外層循環(huán)
  16. }

  17. // 定義按鍵和 LED 引腳
  18. sbit Kzong = P3^1; // 總按鍵連接到 P3.1
  19. sbit K1 = P3^2;    // 按鍵 1 連接到 P3.2
  20. sbit K2 = P3^3;    // 按鍵 2 連接到 P3.3
  21. sbit LED1 = P2^0;  // LED1 連接到 P2.0
  22. sbit LED2 = P2^1;  // LED2 連接到 P2.1

  23. u8 Off_Delay = 0;  // 關(guān)燈延時(shí)計(jì)數(shù)器,初始化為 0

  24. void main()
  25. {
  26.         bit K1_Lock = 1;
  27.         bit K2_Lock = 1;
  28.         while(1) // 主循環(huán)
  29.         {
  30.                 if(Kzong == 0) // 如果總按鍵被按下
  31.                 {
  32.                         if(Off_Delay == 0) // 如果延時(shí)計(jì)數(shù)器為 0
  33.                         {
  34.                                 LED1 = 0; // 開(kāi)啟 LED1
  35.                                 LED2 = 0; // 開(kāi)啟 LED2
  36.                         }
  37.                         if(K1 == 0)
  38.                         {
  39.                                 if(K1_Lock == 0)
  40.                                 {
  41.                                         LED1 = !LED1; // 切換 LED1 狀態(tài)
  42.                                         K1_Lock = 1;
  43.                                 }
  44.                         }
  45.                         else
  46.                         {
  47.                                 K1_Lock = 0;
  48.                         }
  49.                         if(K2 == 0)
  50.                         {
  51.                                 if(K2_Lock == 0)
  52.                                 {
  53.                                         LED2 = !LED2; // 切換 LED2 狀態(tài)
  54.                                         K2_Lock = 1;
  55.                                 }
  56.                         }
  57.                         else
  58.                         {
  59.                                 K2_Lock = 0;
  60.                         }
  61.                         Delay50ms(); // 延時(shí) 50ms
  62.                         Off_Delay = 200; // 設(shè)置關(guān)燈延時(shí)計(jì)數(shù)器為 200
  63.                 }
  64.                 else // 如果總按鍵沒(méi)有被按下
  65.                 {
  66.                         if(Off_Delay != 0) // 如果延時(shí)計(jì)數(shù)器不為 0
  67.                         {
  68.                                 Delay50ms(); // 延時(shí) 50ms
  69.                                 Off_Delay = Off_Delay - 1; // 遞減延時(shí)計(jì)數(shù)器
  70.                                 if(Off_Delay == 0) // 如果計(jì)數(shù)器減到 0
  71.                                 {
  72.                                         LED1 = 1; // 熄滅 LED1
  73.                                         LED2 = 1; // 熄滅 LED2
  74.                                 }
  75.                         }
  76.                 }
  77.         }
  78. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

31#
ID:1009628 發(fā)表于 2024-12-7 16:41 | 只看該作者

經(jīng)過(guò)試驗(yàn),這個(gè)程序和上面的效果差不多,也有干擾。接上照明燈沒(méi)有問(wèn)題。放棄ULN2003電路,使用三極管電路就行了。本來(lái)也是想控制照明用的。控制中間繼電器有干擾,可能需要在硬件電路上改變。十分感謝您的幫助!
回復(fù)

使用道具 舉報(bào)

32#
ID:624769 發(fā)表于 2024-12-8 00:15 | 只看該作者
lch327 發(fā)表于 2024-12-6 14:42
這種接法單片機(jī)會(huì)受到干擾

你這屬于硬件問(wèn)題了, 單片機(jī)電源這里 加大電容,開(kāi)關(guān)到IO之間接個(gè)1K電阻,然后IO這里接104電容對(duì)地,應(yīng)該會(huì)好很多。
回復(fù)

使用道具 舉報(bào)

33#
ID:1109793 發(fā)表于 2024-12-8 14:54 | 只看該作者
只要沒(méi)有被干擾到復(fù)位,就可以用軟件處理
回復(fù)

使用道具 舉報(bào)

34#
ID:1009628 發(fā)表于 2024-12-10 09:54 | 只看該作者
xiaobendan001 發(fā)表于 2024-12-8 14:54
只要沒(méi)有被干擾到復(fù)位,就可以用軟件處理

我看到網(wǎng)上教學(xué)里有這種套娃式接法,可是實(shí)際不行。不知道軟件能否解決?
回復(fù)

使用道具 舉報(bào)

35#
ID:1109793 發(fā)表于 2024-12-10 15:35 | 只看該作者
lch327 發(fā)表于 2024-12-10 09:54
我看到網(wǎng)上教學(xué)里有這種套娃式接法,可是實(shí)際不行。不知道軟件能否解決?

你可以加一個(gè)上拉電阻,實(shí)際上我就不加。軟件就是多次讀取嘛
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区三区在线观看国产 | 亚洲一区 | 日韩高清国产一区在线 | 亚洲精品中文字幕在线观看 | 国产999精品久久久久久 | 91久久国产精品 | 国产精品美女www爽爽爽视频 | 日韩欧美在线观看视频 | 日日做夜夜爽毛片麻豆 | a在线免费观看 | 亚洲国产精品久久 | 亚洲一区电影 | 国产精品一区二区三 | 成人欧美一区二区三区白人 | 日本久久久影视 | 国产色片 | 四虎影院久久 | 91精品www| 午夜爱爱网| 一区二区三区影院 | 日本不卡一区二区三区在线观看 | 欧美色综合网 | 色必久久 | 视频在线一区二区 | 欧美色综合一区二区三区 | 亚洲精品一区av在线播放 | 久久五月婷 | 国产盗摄视频 | 欧美二区三区 | 九九综合九九 | 97精品超碰一区二区三区 | 夜夜骑首页 | 99久久精品国产毛片 | 久操亚洲| 国产日韩精品一区二区三区 | 久久国产精品久久久久久 | 久久久久中文字幕 | 日本精品一区二区 | 国产精品免费一区二区三区 | 午夜视频免费在线观看 | 欧美成人aaa级毛片在线视频 |