giveyou 发表于 2024-11-2 21:34:10

32G12K128 TSSOP20封装端口输出问题

使用端口P17输出控制继电器,低电平继电器工作,高电平继电器停止,
P15作为输入,低电平变为高电平,继电器工作;
高电平变成低电平延时一段时间继电器停止,
如果一直为低电平延时时间够长继电器停止。
P54作为指示灯,继电器工作切换成停止后状态变化。

设置代码如下:

      sbit      LED_yellow      =         P5^4;      // 作为指示灯
      
      sbit      Relay_1      =         P1^7;      // 作为输出

      sbit      SCL      =         P1^5;         // 作为输入



      P1M0 = 0x80; P1M1 = 0x20;                // P17推挽输出,P15高阻输入


输出控制代码有的不起作用,不知道什么原因。

                        if(Add_flag == 1)                Delay_LastTime++;      // 开始计时
                        if(Add_flag == 0)                Relay_1 = 1;      // 停止继电器,---------- 不起作用 --------
                        if(Delay_LastTime > 60)                // 超过60秒停继电器
                        {
                              Delay_LastTime = 50;
                              Relay_1 = 1;      // ---------------------- 不起作用 ------------------------------------
                        }
                        if((Delay_LastTime > 30) && (SCL == 1))                // 超过30秒,都停继电器
                        {
                              Add_flag = 0;
                              Relay_1 = 1;      // ---------------------- 不起作用 ------------------------------------
                              LED_yellow = ~LED_yellow;                // 黄色指示灯      有变化,起作用                        
                        }

                        if((SCL == 1) && (Add_flag == 0))                        // SCL从0变为1,继电器输出
                        {
                              Delay_LastTime = 0;
                              Add_flag = 1;
                              Relay_1 = 0;      // 起作用                        
                        }

                        if((Delay_LastTime > 15) && (SCL == 0))                // 时间到,则停止继电器
                        {
                              Add_flag = 0;
                              Relay_1 = 1;      // 起作用
                        }




王昱顺 发表于 2024-11-2 22:57:37

建议使用硬件仿真打断点进行测试。打到不执行的那一句,单步运行看看生不生效
你这个逻辑似乎有点小问题,捕获的是电平,而不是边沿信号。

giveyou 发表于 2024-11-3 08:34:06

王昱顺 发表于 2024-11-2 22:57
建议使用硬件仿真打断点进行测试。打到不执行的那一句,单步运行看看生不生效
你这个逻辑似乎有点小问题, ...

捕获电平应该也可以的啊。在起作用的地方是可以的,为啥那两个地方不行呢?没搞明白,逻辑上也没错。
按照您说的改成边沿中断试试看,谢谢。

神农鼎 发表于 2024-11-3 09:08:51






神农鼎 发表于 2024-11-3 09:11:49

P15作为输入,低电平变为高电平,继电器工作;
高电平变成低电平延时一段时间继电器停止,
如果一直为低电平延时时间够长继电器停止。


===这个描述,应该是开个 1mS 的定时器中断,去检测 P1.5
===正好去干扰,反应不要那么 快


大叶子 发表于 2024-11-3 09:30:20

本帖最后由 大叶子 于 2024-11-3 09:34 编辑

我感觉,好像是,硬件的引脚端,要有个下拉,会不会,好点。

程序启动,先,全部,强制,关闭端口输出,待有信号后,再执行,操作相关继电器。


再申明,执行个,延时函数,会不会,好点。

王昱顺 发表于 2024-11-3 11:12:24

giveyou 发表于 2024-11-3 08:34
捕获电平应该也可以的啊。在起作用的地方是可以的,为啥那两个地方不行呢?没搞明白,逻辑上也没错。
按 ...
给你改了个代码,你试试能不能用?24Mhz下进去就行



以下是演示视频,左边的LED模拟你的继电器,亮就是继电器打开了,
右边LED模拟的是指示灯,在高电平超时的时候改变状态。
按键按下代表1,抬起就是0



giveyou 发表于 2024-11-4 10:55:05

王昱顺 发表于 2024-11-3 11:12
给你改了个代码,你试试能不能用?24Mhz下进去就行




谢谢大神

giveyou 发表于 2024-11-9 16:55:09

神农鼎 发表于 2024-11-3 09:11
P15作为输入,低电平变为高电平,继电器工作;
高电平变成低电平延时一段时间继电器停止,
如果一直为低电 ...

没考虑消抖的问题,谢谢 回复

giveyou 发表于 2024-11-10 11:28:21

王昱顺 发表于 2024-11-3 11:12
给你改了个代码,你试试能不能用?24Mhz下进去就行




根据提供的代码已经实现功能,谢谢。
页: [1]
查看完整版本: 32G12K128 TSSOP20封装端口输出问题