标题: 怎样使得单片机的LED灯闪烁又不影响主程序运行? [打印本页]

作者: /Jake    时间: 2018-8-11 16:12
标题: 怎样使得单片机的LED灯闪烁又不影响主程序运行?
51单片机问题,紧急求助!
怎样使得单片机的LED灯闪烁又不影响主程序运行???
我想通过单片机接收串口命令让一个LED灯闪烁,但同时又不影响其他程序的运行,应该怎样去写这个程序呢?

作者: zhujt    时间: 2018-8-11 16:46
用中断来实现啊,在串口程序中触发LED闪烁的标志位,定时器中断监控这个位,并根据定时时长来改变LED状态。
作者: 人中狼    时间: 2018-8-11 16:55
使用定时器来控制LED的闪烁,主程序只需要设置一个标志,来代表启动或关闭闪烁,在定时器里判断这个标志,并执行相应的操作
作者: wulin    时间: 2018-8-11 17:28
//可以放在主函数循环中,不影响其它程序
void Twinkle()
{
        static unsigned int count=0;//定义静态局部变量
        if(sign==1)//如果闪烁标志为真,由串口命令使能
        {
                count++;//计数延时
                if(count>=30000)//可以按实际需要调整闪烁频率
                {
                        count=0;
                        LED=~LED;        //LED取反
                }
        }
        else
        {
                count=0;                //计数变量清0
                LED=0;                        //LED熄灭
        }
}
作者: 哦喔噢哦哦    时间: 2018-8-11 17:32
把LED灯闪烁的程序写进一个串口接收的函数,再把这个函数引入到主函数里。
作者: 1330012643    时间: 2018-8-11 18:27
通过判断串口接收数据来打开或关闭一个定时器中断,在这个中断服务函数里面再写led闪烁的代码(不影响主函数),控制定时时间长短就可以控制闪烁频率,led闪烁频率(就是进入中断频率),这种频率很低也不会影响主函数运行
作者: /Jake    时间: 2018-8-12 17:30
wulin 发表于 2018-8-11 17:28
//可以放在主函数循环中,不影响其它程序
void Twinkle()
{

谢谢您了,很有效果。
作者: yangjiawei123    时间: 2018-8-12 19:19
定时器中断
作者: yangjiawei123    时间: 2018-8-12 19:19
定时器中断,或者主函数设标志查询
作者: ch12063119    时间: 2018-8-12 19:43
通过计数的方法,就是达到这个数就跳出循环,时间很短,不会影响主函数运行
作者: galvin123    时间: 2018-8-12 20:09
可以用定时器中断,具体用法根据实际程序编写需要灵活运用
作者: lang123    时间: 2018-8-12 22:29
中断不就是实现这个功能的吗
作者: xiaoyuzhou123    时间: 2018-8-12 23:34
让LED闪烁怎么会影响其他程序?
作者: hopedream    时间: 2018-8-13 08:21
单独的中断处理比较好
作者: 13458736873    时间: 2018-8-13 08:59
单独写一个函数控制LED灯,然后在主函数的开头调用就行了啊
作者: 200901289    时间: 2018-8-13 09:45
使用中断实现,看门狗程序监控中断位置,或者是做一个函数,使得和其他程序一起运行
作者: 200901289    时间: 2018-8-13 09:53
使用定时器中断,或者主函数设标志查询
作者: jiajuntao    时间: 2018-8-13 09:59
中断计数延时置标,主函数判断动作
作者: lxd2757    时间: 2018-8-13 10:30
定时器中断是最合适的。
作者: KWay    时间: 2018-8-13 10:31
STM32的话就可以使用DMA,因为DMA不是由CPU执行的,不会影响到主程序。

作者: yacht06    时间: 2018-8-13 10:50
使用timer中断,设置好中断时间间隔,也就是你需要led灯闪烁的间隔,每进入一次让LED状态改变一次,完成闪烁功能
作者: lalalala256    时间: 2018-8-13 11:45
可以使用定时器终端,设置好时间间隔,在终端中实现led灯状态翻转
作者: qiuwhua    时间: 2018-8-13 11:46
采用定时器中断
作者: woshige    时间: 2018-8-13 11:50
xiaoyuzhou123 发表于 2018-8-12 23:34
让LED闪烁怎么会影响其他程序?

LED闪烁必然会涉及到延时,如果是用最基本的循环延时或者nop延时肯定是要影响CPU的处理的
作者: 如来佛!    时间: 2018-8-13 14:53
wulin 发表于 2018-8-11 17:28
//可以放在主函数循环中,不影响其它程序
void Twinkle()
{

太厉害了
作者: jdshjdd    时间: 2018-8-13 15:06
使用定时器产生中断去控制LED闪烁
作者: 364401508    时间: 2018-8-13 15:49
定时器中断,延时设置好参数
作者: mrjackyu    时间: 2018-8-13 16:27
使用定时器,设定100Hz执行一次,避免一直等待
作者: liuweiqi213654    时间: 2018-8-13 16:30
定时中断啊
作者: kfhzy    时间: 2018-8-13 16:49
定时器中断里 改变LED状态
作者: w13955206936    时间: 2018-8-13 16:59
最简单的方法就是用中断,建议看看单片机手册
作者: 821820338    时间: 2018-8-13 17:03
用定时器中断
作者: 辉哥溜溜溜    时间: 2018-8-13 17:17
定时器中断就ok

作者: 赣州网    时间: 2018-8-13 17:18
我是来要币的 想下个资料
作者: xxxkkk123    时间: 2018-8-13 17:25
可以使用DMA
作者: zl2168    时间: 2018-8-13 18:30
本帖最后由 zl2168 于 2018-8-14 18:13 编辑

介绍你几个参考案例,都有闪烁功能,又不影响主程序运行,自己去对照研究。
先Proteus仿真,确认有效。
实例91  具有校正功能的时钟1302LCD1602显示)
实例91 带校正时钟1302(LCD1602显示).rar (52.68 KB, 下载次数: 10)


实例93  具有校正功能的时钟1302LED数码管显示)
实例94  模拟电子钟(由80C51定时器产生秒时基) 实例94 模拟电子钟(由80C51定时器产生秒时基).rar (43.05 KB, 下载次数: 4)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1,书中电路和程序设计有详细说明,程序语句条条有注解。

实例93 带校正时分秒的时钟1302(6位LED数码管显示).rar

732.75 KB, 下载次数: 5


作者: yosugonasora    时间: 2018-8-18 09:46
用中断来写
作者: bhq0934    时间: 2018-8-18 10:15
用定时器中断实现
作者: jsq347    时间: 2018-8-18 17:11
用中断来实现啊,在串口程序中触发LED闪烁的标志位,定时器中断监控这个位,并根据定时时长来改变LED状态
作者: cona4142    时间: 2018-8-19 10:58
用中断来实现
作者: 袁秉一    时间: 2018-8-19 13:06
main(){cnt++; delay_ms(10); if(cnt%10)led=!led; }
作者: 小水灿    时间: 2018-8-19 14:45
用中断定时器实现
作者: michaelxingtop    时间: 2018-8-19 16:19
用中断实现,LED在中断程序里toogle就行了
作者: liuhailan5757    时间: 2018-8-19 16:37
在定时器中断里取反一个IO就行了,要控制闪的频率的话 就在中断里加一个变量,变量++,当变量等于一个值再取反。
作者: yyfhr    时间: 2018-8-19 20:02
管脚口,看下有没有PWM波输出的复用管脚,没有的话使用定时中断
作者: Nightwatch    时间: 2018-8-19 21:10
可以通过中断处理来实现,更高阶的应用则是可以用中断产生pwm来控制led的亮度
作者: 夜丶太迷茫    时间: 2018-8-20 16:03
用中断实现
作者: 1984528951    时间: 2018-8-23 15:30
加在while里面应该不影响其他程序运行




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1