|
發布時間: 2024-12-1 21:13
正文摘要:51單片機控制燈亮滅:用一個非自鎖開關控制2個燈亮滅,當做總開關K總,再分別用2個自鎖按鍵開關K1,K2控制這2個燈LED1,LED2亮滅。這種組合開關的用法程序怎么寫呢? K總合上,K1,K2才起作用。K總斷開,K1, ... |
lch327 發表于 2024-12-10 09:54 你可以加一個上拉電阻,實際上我就不加。軟件就是多次讀取嘛 |
xiaobendan001 發表于 2024-12-8 14:54 我看到網上教學里有這種套娃式接法,可是實際不行。不知道軟件能否解決? |
| 只要沒有被干擾到復位,就可以用軟件處理 |
lch327 發表于 2024-12-6 14:42 你這屬于硬件問題了, 單片機電源這里 加大電容,開關到IO之間接個1K電阻,然后IO這里接104電容對地,應該會好很多。 |
|
經過試驗,這個程序和上面的效果差不多,也有干擾。接上照明燈沒有問題。放棄ULN2003電路,使用三極管電路就行了。本來也是想控制照明用的。控制中間繼電器有干擾,可能需要在硬件電路上改變。十分感謝您的幫助! |
lch327 發表于 2024-12-6 14:31 試試這個
|
|
自鎖與非自鎖,不就是邏輯關系嗎? 請原諒我實話實說,連這么簡單的邏輯都搞不定,代碼也不用寫了。 如果不考慮去抖的動作: 自鎖就是按一下一個狀態(比如連通),再按一下是另一個狀態(斷開); 非自鎖就是按下時是一個狀態(比如連通),放開時是另一個狀態(斷開); 簡單地說,自鎖開關按兩下,相當于非自鎖按一下而已。 搞不定自鎖,就加標志,又不用占用太多的代碼空間。。。 ![]() ![]() |
lch327 發表于 2024-12-6 14:42 2003里面就是三極管吧 開關線不能太長,否則要增加上拉電阻,還有電容。再長就要加光耦隔離了 |
|
這個程序解決了按鍵卡死的問題。我搭建一個電路,用單片機控制ULN2003驅動電路,單片機輸出高電平給2003,2003反相后低電位驅動12V繼電器,12V繼電器再控制一個中間繼電器,這時候,KZONG,K1,K2都不穩定,有時好使,有時不好使,K1和K2還互相干擾。可能接入中間繼電器后,會受到電磁干擾。不接中間繼電器沒事。如果換用三極管驅動電路就沒問題。(單片機低電位控制三極管驅動12V小繼電器,再控制中間繼電器)用2種電路做了試驗。還沒用燈泡做試驗,等有了燈泡再試試。我想是不是加按鍵延時,會抵消干擾呢?下降沿觸發沒有延時,按鍵一瞬間會受到干擾嗎? |
lch327 發表于 2024-12-4 17:07 非死等版本
|
lch327 發表于 2024-12-4 17:07 做個演示沒問題,控制個燈光也不打緊,如果是涉及安全性問題,不能使用這種死等的方式了,做為實用產品,必須方方面面考慮到各種可能出現的情況。 |
lkc8210 發表于 2024-12-1 21:13 感謝您的解答,困擾我多日的問題解決了。我是新手,單片機愛好者,望您以后多多指教。十分感謝!!! |
188610329 發表于 2024-12-3 21:32 經過試驗,確實有這個問題,假如常按K1或K2不松手,K總就不起作用了,一直在那里死循環了。可程序具體怎么改能實現呢?我看一些教學里,也不提K1,K2卡住的問題啊。那屬于硬件故障吧。教學里沒考慮這個問題。如果按鍵壞了,肯定就得換按鍵,保證它是完好的。 |
lkc8210 發表于 2024-12-3 09:19 代碼有個小漏洞,假定 K1 / K2 年久失修,容易按下后卡住,不一定能彈起, 此時 Kzong 會失效,建議,按下后,不要等待彈起,而是標記“未彈起”,在“未彈起”標記被清除前,不再判斷按鍵按下。 沒特別意思,屬于職業習慣的強迫癥。發現有漏洞,不說就難受。 |
lch327 發表于 2024-12-2 23:25 看起來C你是一點不懂啊,還是先看看書吧,代碼都給你了你都看不懂啊 |
|
能寫一個完整的嗎?U8是什么意思,(--off_Delay==0)是什么意思啊?看不懂,能注釋一下嗎? |
lkc8210 發表于 2024-12-1 23:20 能寫一個完整的嗎?U8是什么意思,(--off_Delay==0)是什么意思啊?看不懂,能注釋一下嗎? |
xiaobendan001 發表于 2024-12-2 11:13 K總開關觸發后,2個燈就亮了,然后再用分開關K1,,K2按鍵控制亮滅,然后不管燈亮滅,只要關斷K總,2個燈是滅的狀態就行了。 |
xiaobendan001 發表于 2024-12-2 17:37 對,對,對,感謝理解我的意思,就是您說的這樣。我以為描述清楚了,實際容易誤解,您說的準確。 ![]() |
lch327 發表于 2024-12-2 12:03
|
|
描述不對,K1K2不是按下去燈亮,松開燈滅,而是在K總接通的情況下,按一下改變一下燈的狀態。 K總斷開后,如果燈亮就延時滅,不亮就不管了。 |
188610329 發表于 2024-12-1 22:03 經過試驗,還是不行。 |
188610329 發表于 2024-12-1 22:03 不好意思,開關表達錯了,應該K總是自鎖開關,K1,K2是非自鎖按鍵開關。所以這個程序K1,K2按下時燈滅,可是抬起時燈又亮了。應該抬起是還保持滅的狀態 ,再按一下燈亮,抬起時保持不變。 |
lch327 發表于 2024-12-2 10:27 那你這個延時是K總觸發的,這不是沒有啥意義了?平時K1K2都是斷開的,燈也不亮啊 |
lch327 發表于 2024-12-2 10:27 原來是說反了,不是畫反了 |
| K總應該是自鎖開關,K1,K2是非自鎖按鍵開關,說錯了。不好意思。 |
xiaobendan001 發表于 2024-12-2 08:03 K1,K2就是按鍵開關,屬于非自鎖開關。我畫的不好。 |
man1234567 發表于 2024-12-2 08:47 不需要再亮起,只要給一個滅的指令就行,滅的 狀態不管,保持原樣,亮的 狀態滅掉就行了。 |
| “K總斷開后,K1,K2延時10秒滅”是K總斷開后,無論K1,K2是亮是滅都要亮起延時10秒滅 ? |
| 開關畫的不太對吧,K1K2好像表示非自鎖才比較合適吧 |
|
本帖最后由 lkc8210 于 2024-12-2 11:10 編輯 稍修一下 重開不用等10秒
|
|
delay 函數你應該自己會寫吧? 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; } } } } |
lch327 發表于 2024-12-2 22:15 你一開始這么說就不用改那么多次
|