找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6579|回复: 30
收起左侧

怎样让单片机程序按键后执行一次就停止呢

  [复制链接]
ID:603592 发表于 2019-8-30 21:22 | 显示全部楼层 |阅读模式
就比如两个按键控制一个LED 按下按键1: LED亮1秒后灭 (只亮一次不循环 )
按下按键1: LED亮2秒后灭 (只亮一次不循环 )
像按下去闪烁直接取反就好了 那亮一次改怎么弄  思路框架应该是什么样的

回复

使用道具 举报

ID:370639 发表于 2019-8-31 08:26 | 显示全部楼层
检测按键;亮;延时1秒;灭,就这么简单
回复

使用道具 举报

ID:56665 发表于 2019-8-31 09:01 | 显示全部楼层
陌上轻雨寒 发表于 2019-8-31 08:26
检测按键;亮;延时1秒;灭,就这么简单

你这个放while循环里面会一直闪烁的,虽然你想它只执行一次,楼主肯定也试过。
回复

使用道具 举报

ID:605695 发表于 2019-8-31 09:07 | 显示全部楼层
等待按键,按键按下任务执行,执行完进入死循环,只有等单片机重启才能再按按键。如果想按一次以后都不能用,那就在后备寄存器或者可存储芯片里存标识,上电读取标识位是否按下过。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:33 | 显示全部楼层
你对单片机还没有理解清楚!单片机你可以理解它只执行一次。如果没有循环,它就只运行一次。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:34 | 显示全部楼层
比如:LED=1,如只有这么一条语句,你打开单片机,它就会只会执行一次。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:35 | 显示全部楼层
你想要执行很多次,就得加循环。while(1)。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:37 | 显示全部楼层
如果你用两个按键来控制一个LED灯,不需要加循环,就只执行一次。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:38 | 显示全部楼层
1,先用一个循环监听是按下按键1还是按键2,记得加按键延迟。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:38 | 显示全部楼层
在按键里分别对应LED亮的时间长度。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:40 | 显示全部楼层
比如按按键1,亮1秒后停止。LED=1 ;延迟1秒,LED=0;这就完成了按键1的功能。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:41 | 显示全部楼层
再按键2也是一样。LED=1,延迟2秒,LED=0;完成了按键2的操作。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:42 | 显示全部楼层
说得那么详细应该明白了吧?LED=1灯亮,LED=0灯灭。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:44 | 显示全部楼层
如果你想弄复杂一点,比如我想连续按1二次,就会自动执行2,你可以加个计数参数。
回复

使用道具 举报

ID:604919 发表于 2019-8-31 09:53 | 显示全部楼层
你要理解两个点:
1,单片机程序原本就只会执行一次。是我们为了让单片机一直执行下去,才加了循环。也就是说,不加循环,就只执行一次。
2,灯亮和灭无非就是0和1.单片机的脚出来的无非就是0和1,灯亮就是LED=1,灯灭就是LED=0;取反是算法更简单而已。
两个按键控制一个LED,按键判断需要循环进行,
先判断是哪个按键按下了,再决定LED亮灯的时间长度。判断按键的时候记得加上延迟去抖动。
比如:按键1按下,延迟0.005秒,再判断是否是按键1按下,如果是,执行   LED=1,延迟1秒,LED=0;
按键2按下,延迟0.005秒,再判断是否是按键2按下,如果是,执行   LED=1,延迟2秒,LED=0;
这么详细,应该明白了吧?


回复

使用道具 举报

ID:149144 发表于 2019-8-31 10:01 | 显示全部楼层
可以说详细点吗
两个按键控制…… 按下按键 1  …… 按下按键 1  ……
只按按键 1  为什么还要两个按键,一个按键就可以了。
按下按键要松手吗,按着的时候灯亮灭,还是松开的时候再执行 ?
回复

使用道具 举报

ID:516309 发表于 2019-9-2 08:23 来自手机 | 显示全部楼层
引用标志位不知是否可以
回复

使用道具 举报

ID:606526 发表于 2019-9-3 12:09 | 显示全部楼层
不加循环
回复

使用道具 举报

ID:505787 发表于 2019-9-4 17:55 | 显示全部楼层
led点亮,扫描案件,按键按下检查是哪个按键,去抖。进入一个在shile里面搞俩个while(1)里面设置好定时关闭就行了。灯不亮即便再关也没有问题
回复

使用道具 举报

ID:601639 发表于 2019-9-5 11:03 | 显示全部楼层
设置个标志位不就行了,按一次,标志位+1,检测不到标志位,灯就不会再亮了。想什么时候亮,再把标志位置位回来。
回复

使用道具 举报

ID:547839 发表于 2019-9-5 20:32 | 显示全部楼层
用标志位,按键读取高低电平,然后判断条件。或者用中断,外部中断
回复

使用道具 举报

ID:484951 发表于 2019-9-5 21:57 | 显示全部楼层
用中断,在中断服务函数里面启动LED延时之后关闭
回复

使用道具 举报

ID:608245 发表于 2019-9-6 06:11 | 显示全部楼层
1)main函数里不写控制逻辑,只写初始化代码。控制LED的逻辑写在外部中断里。
回复

使用道具 举报

ID:608245 发表于 2019-9-6 06:13 | 显示全部楼层
2)不开中断,在main函数里不断检测两个按键状态。同时用两个全局变量记录灯是不是已经亮过了。如果没亮过那么检测到按键按下就点亮。如果已经亮过了那即使检测到按键按下也不点亮。
回复

使用道具 举报

ID:426861 发表于 2019-9-6 10:42 | 显示全部楼层
条件判断啊,C语言的基础知识
回复

使用道具 举报

ID:584556 发表于 2019-9-6 15:25 | 显示全部楼层
这种问题入门后都比较简单了,第一步先检查按键是否按下,如果按下则执行你的操作(如点灯),判断按键是否松开,如果按键松开则不进行操作(如熄灭灯)
回复

使用道具 举报

ID:1005338 发表于 2022-5-24 10:45 | 显示全部楼层
void main()
{       
                LED1=0;        //点亮
                delay_ms(5000); //大约延时450ms
                LED1=1;        //熄灭
                delay_ms(5000);        
}
像以上程序,虽然没有循环,但实际运行起来后一直不停地亮、灭、亮、灭,这是为什么?
回复

使用道具 举报

ID:1029096 发表于 2022-5-24 10:48 | 显示全部楼层
用个if语句
回复

使用道具 举报

ID:1004455 发表于 2022-5-24 11:11 | 显示全部楼层
不要写在while里面就不会一直循环,写个按键,当按键按下led灯亮一下就好了
回复

使用道具 举报

ID:1005338 发表于 2022-5-24 11:27 | 显示全部楼层
LXJG 发表于 2022-5-24 11:11
不要写在while里面就不会一直循环,写个按键,当按键按下led灯亮一下就好了

如果写个按键是可以解决,那是因为按键没有被再次按下,就不会再亮灯。
但上面这个简单的程序中,明显是没有while循环的,为什么程序会重复执行呢?
我一直也有这个困惑,main主程序是不是一直会自动重复循环?结束了再从头再来?51单片机是不是默认的就是这样?
回复

使用道具 举报

ID:1005338 发表于 2022-5-24 12:05 | 显示全部楼层
51好黑电子论坛 发表于 2019-8-31 09:33
你对单片机还没有理解清楚!单片机你可以理解它只执行一次。如果没有循环,它就只运行一次。

我试过多次了,虽然没有while,它也会重复执行main
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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