数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2104|回复: 13

[C51] 谁能给指导一个小程序的结构,谢谢

[复制链接]
发表于 2019-10-10 09:12:56 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
STC90C52RC
5路输入,微动开关。5路输出,一一对应。

程序要求
微动开关按下抬起或保持按下,对应输出开启并延时1.5秒关闭,五路开关允许同时动作。
现在延时用的循环,会挡住输入检测。
没有RTOS,C语言。


发表于 2019-10-10 09:32:47 | 显示全部楼层
你把按键检测放到定时器中断里面就好了,定时器选方式1,中断时间设定为20ms左右。
其实更好的方案是主循环做按键检测,延时用定时器,时间到了之后置标志位,在主函数查询。
回复 支持 反对

使用道具 举报

发表于 2019-10-10 09:45:11 | 显示全部楼层
要么轮询,要么中断,反正就这两种喽
回复 支持 反对

使用道具 举报

发表于 2019-10-10 10:30:15 | 显示全部楼层
本帖最后由 zhuls 于 2019-10-10 11:00 编辑

视乎楼主的逻辑,应该不难,按键有4种状态:按下瞬间、持续按下、释放瞬间、保持释放。只要能检测到这4种,就过了。。又想了想,按下瞬间、和持续按下,都要输出一个1.5S的电平,会不会在逻辑上有冲突?按下瞬间发一个脉冲,然后持续按下超过2S,才能再输出另外一个冲,这样才更合理一点。
回复 支持 反对

使用道具 举报

发表于 2019-10-10 10:44:42 | 显示全部楼层
增加1个静态变量,记录当前时间。定时器的中断更新静态变量。
增加5个变量,记录开关的关闭时间。
主循环判断按钮状态,检测到按钮就接通,同时设置关闭时间;检测6个变量是否需要关闭开关。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-10 11:00:30 | 显示全部楼层
谢谢大家,知道自己问题在哪里了。:smile:
我先去补下课。定时器和中断没有弄懂,构造起来是有困难。
回复 支持 反对

使用道具 举报

发表于 2019-10-10 12:19:41 | 显示全部楼层
本帖最后由 苏州熊猫 于 2019-10-10 12:20 编辑

这在以前,与非或门搞定后面加个延时。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-10 15:10:59 | 显示全部楼层
先抄一个sysTick() 1ms单位

unsigned int system_tick;
unsigned int wait_count;
//////////////// 定时器T0
//11.0592M (50ms 4C00, 5ms EE00, 1ms FC66, 0.5ms FE33, 0.2ms FF47, 0.1ms FFA3, 0.05ms FFD1, 0.01ms FFF6)
//22.1184M (50ms xxxx, 5ms DC00, 1ms F8CD, 0.5ms FC66, 0.2ms FE8F, 0.1ms FF48, 0.05ms FFA4, 0.01ms FFEE)
#define T0_TH0 0xFC
#define T0_TL0 0x66
void timer0_init(){
    TMOD &= 0xf0;    //定时器0,工作方式1
    TMOD |= 0x01;
    TH0 = T0_TH0;
    TL0 = T0_TL0;
    ET0=1; //开定时中断允许
    TR0 = 1;//启动定时器0
    EA=1; //开总中断
    system_tick = 0;
        wait_count = 0;
}

void timer0_interrupt(void) __interrupt 1
{
    TH0 = T0_TH0;    //必须重新赋值才能让定时器循环工作
    TL0 = T0_TL0;
    ++system_tick;
        wait_count--;
}
回复 支持 反对

使用道具 举报

发表于 2019-10-11 08:22:41 | 显示全部楼层
看标题进来的  还以为是微信小程序 :shy::shy::shy: 这个真不懂
回复 支持 反对

使用道具 举报

发表于 2019-10-11 10:46:36 | 显示全部楼层
本帖最后由 devcang 于 2019-10-11 10:53 编辑

来个轮询的方法









按一次延时1.5秒(大概),按住不释放,也是延时那么长时间。(没有做防抖)。

Ptoteus 模拟过。








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 1 反对 0

使用道具 举报

发表于 2019-10-11 12:15:31 | 显示全部楼层
先把按键的功能逻辑想清楚,再来想怎么实现
你说的 “微动开关按下抬起或保持按下” 是不能同时实现的。
按下抬起就是上升沿触发,保持按下就是低电平持续一段时间。
回复 支持 反对

使用道具 举报

发表于 2019-10-11 14:35:20 | 显示全部楼层
本帖最后由 netbeetle 于 2019-10-11 14:36 编辑

延时要利用定时器功能,不能独占系统时间,这样肯定会漏检的。而且键盘扫描需要的时间极短,可以放在定时器中断里面,这样受到的影响就更加小了。
回复 支持 反对

使用道具 举报

发表于 2019-10-16 19:15:43 | 显示全部楼层
这个难度应该不大:lol:
回复 支持 反对

使用道具 举报

发表于 2019-10-19 13:43:54 | 显示全部楼层
不要用啥米中断中检测按键。
弄一个定时器中断,只需要计时就行了。精度要求高可以做1ms中断,精度要求不高,做几十ms的中断计时

在主循环中做三件事:
while(1)
{
1不停地检测io,按键做个上次状态记录,发现新状态,对应的计时单位设置成1.5s(比如1ms的计时中断,就设置1500个计数),
2设置io输出出,只要1~5中对应计时不为0,就设置输出为1,否则为0
3时间检测,这个也要做个状态记录,如果系统计时跟记录不一样,说明计时状态变化了,把所有的不为0的倒计时减1
}
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-19 16:19 , Processed in 0.483600 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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