找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 154|回复: 13
打印 上一主题 下一主题
收起左侧

51单片机继电器控制程序

[复制链接]
跳转到指定楼层
楼主
ID:1104510 发表于 2026-1-12 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神,麻烦帮我看一下,用C语言写一个51单片机程序,实现如下功能:单片机型号为STC15W408AS,有四个输入口,两个输出口。4个输入口分别命名为key1~key4,2个输出继电器口分别命名为kt1~kt2;key1接入的是一个自复位按钮开关,key2,key3接入的是两个光电开关。key1主要实现按钮一键控制继电器kt1启停(不管key2和key3的状态),即按一下开,再按一下关。当kt1处于打开状态时,如果检测到key2和key3任意一个输入口没有输入信号时,关闭kt1;引脚定义:sbit key1 = P1^2;                        /*单片机1.2引脚检测key1是否动作*/
        sbit key2 = P1^3;                        /*单片机1.3引脚检测key2是否动作*/
        sbit key3 = P1^4;                        /*单片机1.4引脚检测key3是否动作*/
        sbit key4 = P1^5;                        /*单片机1.5引脚检测key4是否动作*/
           
        sbit kt1 = P3^7;                  /*单片机3.7引脚控制继电器kt1*/
        sbit kt2 = P3^6;                  /*单片机3.6引脚控制继电器kt2*/    输入口为0表示有信号输入;输入口为1表示无信号输入;输出口为0表示开启继电器,输出口为1表示关闭继电器;  我自己写了一些,然后又在deepseek上问了  写出来的都不对  麻烦各位大神看看怎么写
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:69038 发表于 2026-1-12 11:36 | 只看该作者
"我自己写了一些,然后又在deepseek上问了  写出来的都不对"...
DeepSeek也要训练的,不对就要提出来,让它完善啊。。。
回复

使用道具 举报

板凳
ID:230500 发表于 2026-1-12 11:45 | 只看该作者
key1主要实现按钮一键控制继电器kt1启停(不管key2和key3的状态),


KEY1  KEY2 KEY3 控制KT1   那KEY4 和KT2呢?   问题需求你都没描叙清楚
回复

使用道具 举报

地板
ID:1104510 发表于 2026-1-12 12:40 | 只看该作者
a399288395 发表于 2026-1-12 11:45
key1主要实现按钮一键控制继电器kt1启停(不管key2和key3的状态),

key4  kt2 暂时闲置
回复

使用道具 举报

5#
ID:1104510 发表于 2026-1-12 12:41 | 只看该作者
zhuls 发表于 2026-1-12 11:36
"我自己写了一些,然后又在deepseek上问了  写出来的都不对"...
DeepSeek也要训练的,不对就要提出来,让 ...

提了   改来改去都跟没改一样
回复

使用道具 举报

6#
ID:1104510 发表于 2026-1-12 12:45 | 只看该作者
a399288395 发表于 2026-1-12 11:45
key1主要实现按钮一键控制继电器kt1启停(不管key2和key3的状态),

在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;在kt1是打开状态时,不管key2和key3什么状态,只要按下key1,就关闭kt1;在kt1处于打开状态时,key2或者key3任意一个输入点无信号,都关闭kt1;
回复

使用道具 举报

7#
ID:230500 发表于 2026-1-12 13:42 | 只看该作者
郑效桂 发表于 2026-1-12 12:45
在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;在kt1是打开状态时,不管key2和k ...

1; 在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;2; 在kt1是打开状态时,不管key2和key3什么状态,只要按下key1,就关闭kt1;
3; 在kt1处于打开状态时,key2或者key3任意一个输入点无信号,都关闭kt1;


上面1,2,3项是你的要求, 1,2 可以实现,对于1,2. 相当于KEY1是总开关,他的开和关 不受KEY2,KEY3 影响。 但是你第3项 和上面的1,2相冲突,(按下开关后 由于KEY2 KEY3 没信号, 继电器根本不会吸合,吸合马上又断开)  ;





回复

使用道具 举报

8#
ID:1104510 发表于 2026-1-12 15:32 | 只看该作者
a399288395 发表于 2026-1-12 13:42
1; 在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;2; 在kt1是打开状态时,不 ...

对的   这就是问题所在
回复

使用道具 举报

9#
ID:592807 发表于 2026-1-12 16:15 | 只看该作者
郑效桂 发表于 2026-1-12 15:32
对的   这就是问题所在

你将K1换成普通开关,一般自恢复开关都有自锁功能你按下KEY1后,KEY1就会一直处于0状态(按键锁死),你不再按一次将状态解开,他就一直处于0状态。然后当按键KEY1处于0状态时(按下状态),你就必须开启继电器KIT1=0,你开启以后你要检测KEY2 和KEY3状态,如果KEY2 和KEY3没有信号(不为0状态),你要关闭继电器,但是你忘了吗,你的KEY1是自锁自恢复的按键,它锁着呢,你没松开它,他一直处于0状态,你关了继电器KEY1会立刻让你重新打开继电器,这矛盾了。除非你能让KEY1强制复位,不然你的逻辑就是死循环,就是错的。
回复

使用道具 举报

10#
ID:1133081 发表于 2026-1-12 16:32 | 只看该作者
郑效桂 发表于 2026-1-12 12:45
在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;在kt1是打开状态时,不管key2和k ...

这种简单控制本身没有难度,问题是楼主提出的控制功能有逻辑问题。
既然“在kt1是关闭状态时,不管key2和key3什么状态,只要按下key1,就打开kt1;在kt1是打开状态时,不管key2和key3什么状态,只要按下key1,就关闭kt1;”
这段话就是key1点控kt1开关不受key2和key3状态限制。那么后面这段话就与前面的话是矛盾的:“在kt1处于打开状态时,key2或者key3任意一个输入点无信号,都关闭kt1;”

回复

使用道具 举报

11#
ID:1104510 发表于 2026-1-12 16:38 | 只看该作者
WL0123 发表于 2026-1-12 16:32
这种简单控制本身没有难度,问题是楼主提出的控制功能有逻辑问题。
既然“在kt1是关闭状态时,不管key2 ...

对的   这个逻辑有问题   我在尝试换另一种方案
回复

使用道具 举报

12#
ID:1109793 发表于 2026-1-13 07:41 | 只看该作者
if(!key1)kt1 = 0;
kt1 = key2|key3;
回复

使用道具 举报

13#
ID:227818 发表于 2026-1-13 08:00 | 只看该作者
http://www.51hei.com/bbs/dpj-195153-1.html
看看这篇文章,如果你把这些例程都搞懂,你就是大佬。
回复

使用道具 举报

14#
ID:592807 发表于 2026-1-13 10:54 | 只看该作者
郑效桂 发表于 2026-1-12 16:38
对的   这个逻辑有问题   我在尝试换另一种方案

有啥难得加个报警机制就行了,出错报警,复位KEY1取消报警
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表