![]() |
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 你一开始这么说就不用改那么多次
|