找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3411|回复: 18
打印 上一主题 下一主题
收起左侧

不用延时实现LED灯闪烁的单片机程序问题

  [复制链接]
跳转到指定楼层
楼主
ID:706567 发表于 2020-11-4 08:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
高手们 总说  不用延时函数 或少用延时函数,想了半天,能不能这样搞,掉去while循环,放在主程 序里跟着一遍一遍跑,是不是就可以实现,加外还有没有别的思路?void main()
                {
                        
                        while(1)
                                {
                                          vv++;        
                                          if(vv<20000)   
                                                        {
                                                                P0=0xff;   //供阳极LED,P0口高电压全灭
                                                        }
                                        if(vv>20001)
                                                        {
                                                                P0=0x00;   //P0口低电压全亮
                                                        
                                                                if(vv==40000)
                                                                        {
                                                                                vv=0;
                                                                        }
                                
                                }


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:654028 发表于 2020-11-4 09:07 | 只看该作者
去掉while(1)好像程序只跑一次吧。你可以开个看门狗,然后不喂狗,自动重启。
回复

使用道具 举报

板凳
ID:609192 发表于 2020-11-4 09:15 | 只看该作者
你贴出来的程序和延时函数无关啊
回复

使用道具 举报

地板
ID:267932 发表于 2020-11-4 09:33 | 只看该作者
放定时器里呀
回复

使用道具 举报

5#
ID:426861 发表于 2020-11-4 09:54 | 只看该作者
放定时器中
回复

使用道具 举报

6#
ID:88256 发表于 2020-11-4 10:01 | 只看该作者
不用延时就用计数啊,程序跑一趟记一次数,判断是否到达设定值
回复

使用道具 举报

7#
ID:213173 发表于 2020-11-4 10:07 | 只看该作者
楼主的想法是正确的,已经实现了入门道路上的跨越。如下写法逻辑更严密。
void main()
{
        unsigned int vv;
        while(1)
        {
                if(vv<20000)   
                        P0=0xff;    //供阳极LED,P0口高电压全灭
                else P0=0x00;   //P0口低电压全亮
                vv++;        
                if(vv>=40000)
                        vv=0;                       
        }
}
回复

使用道具 举报

8#
ID:706567 发表于 2020-11-4 12:33 | 只看该作者

定时器  被别的任务占用了!!!
回复

使用道具 举报

9#
ID:706567 发表于 2020-11-4 12:34 | 只看该作者
wulin 发表于 2020-11-4 10:07
楼主的想法是正确的,已经实现了入门道路上的跨越。如下写法逻辑更严密。
void main()
{

谢啦!
回复

使用道具 举报

10#
ID:425577 发表于 2020-11-4 16:28 | 只看该作者
每个程序都要一个定时器用来跑系统的,把时间分成很多点,这个想要多长的时候都行
回复

使用道具 举报

11#
ID:137736 发表于 2020-11-4 17:24 | 只看该作者
看高级一些的书,里面有,主循环加标志变量,利用变量延时。利用定时器延时。
回复

使用道具 举报

12#
ID:706567 发表于 2020-11-4 19:42 | 只看该作者
zmc419 发表于 2020-11-4 17:24
看高级一些的书,里面有,主循环加标志变量,利用变量延时。利用定时器延时。

有啊,没看过,自己瞎琢磨。
回复

使用道具 举报

13#
ID:451718 发表于 2020-11-4 20:53 | 只看该作者
这个vv变量的累加和归零,放到定时器中执行,这样控制精度更高,可移植性更大。 不会随主程序的单次循环周期变化而发生闪烁频率的变化。  不过说回来, 如果只是一个端口的的变化,放到定时器中,不会对定时器中断有太大的影响。  如果是液晶屏幕刷新控制,可以通过这样方法,在定时器中刷新标志位。在主程序中判断标志位来控制是否要运行的函数。
回复

使用道具 举报

14#
ID:738987 发表于 2020-11-4 21:16 | 只看该作者
不懂你在干什么,延时函数本来就是通过变量循环自增自减来占用cpu实现的,不用延时就用定时器
回复

使用道具 举报

15#
ID:706567 发表于 2020-11-5 15:26 | 只看该作者
robinsonlin 发表于 2020-11-4 20:53
这个vv变量的累加和归零,放到定时器中执行,这样控制精度更高,可移植性更大。 不会随主程序的单次循环周 ...

学习了,
回复

使用道具 举报

16#
ID:712493 发表于 2020-11-5 16:14 | 只看该作者
robinsonlin 发表于 2020-11-4 20:53
这个vv变量的累加和归零,放到定时器中执行,这样控制精度更高,可移植性更大。 不会随主程序的单次循环周 ...

问下  在中断设置标志  主程序运行  这样精度能保证?
回复

使用道具 举报

17#
ID:493010 发表于 2020-11-5 16:37 | 只看该作者
这个代码写的可读性不强,延时单独写一个函数。另外不用循环就得用定时器。
回复

使用道具 举报

18#
ID:451718 发表于 2020-11-6 15:52 | 只看该作者
fj51hei 发表于 2020-11-5 16:14
问下  在中断设置标志  主程序运行  这样精度能保证?

呵呵。 这个要自己理解咯。  单次误差和累积误差的区别。
回复

使用道具 举报

19#
ID:851329 发表于 2020-12-17 21:26 | 只看该作者
如果不用延时函数的话那就只能用定时器控制
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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