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
建议使用硬件仿真打断点进行测试。打到不执行的那一句,单步运行看看生不生效
你这个逻辑似乎有点小问题, ...
捕获电平应该也可以的啊。在起作用的地方是可以的,为啥那两个地方不行呢?没搞明白,逻辑上也没错。
按照您说的改成边沿中断试试看,谢谢。
P15作为输入,低电平变为高电平,继电器工作;
高电平变成低电平延时一段时间继电器停止,
如果一直为低电平延时时间够长继电器停止。
===这个描述,应该是开个 1mS 的定时器中断,去检测 P1.5
===正好去干扰,反应不要那么 快
本帖最后由 大叶子 于 2024-11-3 09:34 编辑
我感觉,好像是,硬件的引脚端,要有个下拉,会不会,好点。
程序启动,先,全部,强制,关闭端口输出,待有信号后,再执行,操作相关继电器。
再申明,执行个,延时函数,会不会,好点。
giveyou 发表于 2024-11-3 08:34
捕获电平应该也可以的啊。在起作用的地方是可以的,为啥那两个地方不行呢?没搞明白,逻辑上也没错。
按 ...
给你改了个代码,你试试能不能用?24Mhz下进去就行
以下是演示视频,左边的LED模拟你的继电器,亮就是继电器打开了,
右边LED模拟的是指示灯,在高电平超时的时候改变状态。
按键按下代表1,抬起就是0
王昱顺 发表于 2024-11-3 11:12
给你改了个代码,你试试能不能用?24Mhz下进去就行
谢谢大神 神农鼎 发表于 2024-11-3 09:11
P15作为输入,低电平变为高电平,继电器工作;
高电平变成低电平延时一段时间继电器停止,
如果一直为低电 ...
没考虑消抖的问题,谢谢 回复 王昱顺 发表于 2024-11-3 11:12
给你改了个代码,你试试能不能用?24Mhz下进去就行
根据提供的代码已经实现功能,谢谢。
页:
[1]