打印

用delay函数,改变你的编程思维

[复制链接]
4376|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
趣味单片机|  楼主 | 2012-11-11 09:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题很简单(高手就不用回答了,初学者思考一下有益):
1。两个LED A和B,两个按键A和B。
2。按A键LED A以0.5Hz闪,占空比30%,再按一次灭。再按一次闪,如此循环。。。
3。按B键LED B以1Hz闪,占空比60%,再按一次灭。再按一次闪,如此循环。。。
4.  按键要去抖动,且随时按随时响应(即实时,不要有迟钝感)。
5.  不允许用定时器,但有一个delayMs(ms)的函数可调用,输入参数代表延时ms数。

相关帖子

沙发
songhere| | 2012-11-11 15:08 | 只看该作者
51上就不要跑系统了。   操作系统这玩意占用很大一部分资源外,还有许多很难推敲出的bug。  51以微控制为主,一般用定时器做个时基,这样效率也就很高了。。。

使用特权

评论回复
板凳
Ryanhsiung| | 2012-11-11 15:35 | 只看该作者
怎么低的频率,用DELYAMS(1)做系统时间都够啊。。。。。

使用特权

评论回复
地板
shell.albert| | 2012-11-11 17:20 | 只看该作者
不允许用定时器         这一条决定了不能使用时间片轮训算法来调度了啊。
实时响应,那就中断吧。在这中断上做**,应该可以的。

使用特权

评论回复
5
nongfuxu| | 2012-11-11 17:45 | 只看该作者
路过,看看!

使用特权

评论回复
6
eminjie| | 2012-11-11 18:17 | 只看该作者
看看

使用特权

评论回复
7
xlf-101412| | 2012-11-11 23:12 | 只看该作者
怎么搞?

使用特权

评论回复
8
西门看雪| | 2012-11-11 23:14 | 只看该作者
楼主这个题目没有很大的意义呀!其实用不用定时器,其思想都是一样的。用定时器的话时间会准一点;不用定时器的话时间只能算出个大概,程序运行得越久累计的误差就越大!

使用特权

评论回复
9
西门看雪| | 2012-11-11 23:35 | 只看该作者
不允许用定时器         这一条决定了不能使用时间片轮训算法来调度了啊。
实时响应,那就中断吧。在这中断上做**,应该可以的。
shell.albert 发表于 2012-11-11 17:20


这个说法不对!准确地说用定时器是每多少时间执行一次任务,任务的执行周期就是定时的时间;不用定时器时是每隔多少时间执行一次任务,任务周期就是delay的时间加上任务执行所花的时间。

使用特权

评论回复
10
Cortex-M0| | 2012-11-11 23:59 | 只看该作者
看了一下,还是没有改变编程思维~~~ ;P

使用特权

评论回复
11
趣味单片机|  楼主 | 2012-11-12 08:50 | 只看该作者
3楼答对了。

使用特权

评论回复
12
李进| | 2012-11-12 08:56 | 只看该作者
无限制循环模式。
主程序循环一次以1ms的时间,第一个1ms 读一次按键,输出也是在1ms 的基础上计数。

以前老的pic单片机没有中断的,就是这个样子处理的。。。。

使用特权

评论回复
13
李进| | 2012-11-12 08:57 | 只看该作者
一个主程序循环用一个delay,定时1ms,当然有误差,但是只是发光管显示,这显然是足够的;

使用特权

评论回复
14
coody| | 2012-11-12 14:55 | 只看该作者
看了下,思维是要改变,改回教科书上的了

使用特权

评论回复
15
lb0577| | 2012-11-12 15:55 | 只看该作者
坐等lz解答

使用特权

评论回复
16
趣味单片机|  楼主 | 2012-11-12 17:12 | 只看该作者
3楼回答了。
  delayMs(1)产生一个1ms的时基.
  利用1ms的时基,产生100ms的时基,100ms的时基控制LED,如果觉得100ms不够实时,可以再小些。
  利用1ms的时基,产生50ms的时基,用于检测按键。
  实时是相对的,除了实时钟,和很高速的运用外,1ms的时基派生出来的时基足够大多数数运用,如LED扫描2ms,按键50ms, 马达PWM调速等。
  下面是参考,未经过验证,细节不一对(有问题请指正),但大概意思是这样,函数之间尽可能的减少瓜葛,自己产生的标志自己消灭掉。
  带F的是位标志,带d的是变量,Io的是Io口。LED高电平亮。按键是按下=0.


GetClock()
{ F_Clk100ms=0;
  F_Clk50ms=0;
  delayMs(1);
  if(++dCntClk1>=100) {dCntClk1=0;F_Clk100ms=1;}
  if(++dCntClk2>=50)  {dCntClk2=0;F_Clk50ms=1;}
}


GetKey()
{ F_KeyAPush=0;
  F_KeyBPush=0;
  if(!F_Clk50ms) return;
  if(F_KeyAlast!=Io_KeyA) {F_KeyAlast=Io_KeyA;
                           if(F_KeyAlast==0) F_KeyAPush=1;
                          }
  if(F_KeyBlast!=Io_KeyB) {F_KeyBlast=Io_KeyB;
                           if(F_KeyBlast==0) F_KeyBPush=1;
                          }
}


RunLEDA()
{ if(F_KeyAPush==1) { F_LEDA_Enb=!F_LEDA_Enb;
                      if(F_LEDA_Enb==1) {dCntLedA=0;Io_LEDA=1;}
                    }
  if(F_LEDA_Enb==0) {Io_LEDA=0;return;}
  if(!F_Clk100ms)    return;
  if(++dCntLedA>=20) {Io_LEDA=1;dCntLedA=0;}
  if(dCntLedA==6)    Io_LEDA=0;
}


RunLEDB()
{ if(F_KeyBPush==1) { F_LEDB_Enb=!F_LEDB_Enb;
                      if(F_LEDB_Enb==1) {dCntLedB=0;Io_LEDB=1;}
                    }
  if(F_LEDB_Enb==0) {Io_LEDB=0;return;}
  if(!F_Clk100ms)    return;
  if(++dCntLedB>=10) {Io_LEDB=1;dCntLedB=0;}
  if(dCntLedB==6)    Io_LEDB=0;
}



while(1)
{ GetClock();
  Getkey();
  RunLEDA();
  RunLEDB();
}

使用特权

评论回复
17
hjs1618| | 2012-11-12 20:38 | 只看该作者

使用特权

评论回复
18
ZG11211| | 2012-11-13 21:22 | 只看该作者
反正我现在写程序,里面最多也就出现一两个空指令,基本不用延时,太费资源了

使用特权

评论回复
19
zhhbncwu| | 2012-11-15 21:47 | 只看该作者
不用定时器用长延时太浪费资源了

使用特权

评论回复
20
forgot| | 2012-11-16 09:17 | 只看该作者
不想去想

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

196

帖子

1

粉丝