打印

有点小闷,出个题,有兴趣的可以看看(添加了实际意义)

[复制链接]
4639|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
渤海三叠浪|  楼主 | 2012-9-17 22:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 渤海三叠浪 于 2012-9-19 18:47 编辑

用51单片机搞。共有10个灯。

第一个灯每隔150ms闪烁一次(当然时间要求不可能太准确了。可以考虑有2ms的误差)
第二个灯每隔 250ms闪烁一次
第三个灯每隔 500ms闪烁一次
第四个灯每隔 1500ms闪烁一次
第5个灯每隔 2500ms闪烁一次。。。。
第6个灯每隔 700ms闪烁一次
第7个灯每隔 770ms闪烁一次
第6个灯每隔 900ms闪烁一次
第8个灯每隔 300ms闪烁一次
第9个灯每隔 200ms闪烁一次
第10个灯每隔 1000ms闪烁一次
并且任意两个不同的灯闪烁间隔大于10ms。


==========================觉得简单那就
再出一个题(注意  这里的闪烁就是状态变一下,就是由亮变灭 或者 由灭变亮)
--------------------------------------------------------------------------------------------------
用51单片机搞。共有10个灯。

第一个灯每隔 150ms闪烁一次
第二个灯每隔 250ms闪烁一次
第三个灯每隔 500ms闪烁一次
第四个灯每隔 1500ms闪烁一次
第5个灯每隔 2500ms闪烁一次。。。。
第6个灯每隔 700ms闪烁一次
第7个灯每隔 770ms闪烁一次
第6个灯每隔 900ms闪烁一次
第8个灯每隔 300ms闪烁一次
第9个灯每隔 200ms闪烁一次
第10个灯每隔 1000ms闪烁一次
并且任意两个不同的灯闪烁间隔大于10ms。


给每个灯添加1个按键(一一对应)。
按一下键,对应的灯 状态变一下(但是必须离该灯上一次状态变的相隔至少50ms)
-----------------------------------------------------------------------------------------------------
还是举个例子来说吧。要用文字讲不大容易表达 清楚。比如仅仅考虑灯1(这时候就不用考虑“两个不同的灯闪烁间隔大于10ms”,因为仅有一个灯),假设在时间点8ms时刻亮,那么就会在158ms时刻灭(因为周期要求是150ms),那么若在170ms时刻按键时,就会在158+50=208ms时刻亮灯(这是因为170-150=20,20小于50,因为要求相隔至少50ms。可以看出在150ms周期的范围内,在有键按下的情况下,就不用满足150ms的周期。不过该灯下一次亮的周期从208时刻开始算起),然后在208+150=358ms灭,那么在490ms毫秒时刻按键时,就是会490ms时刻亮灯(因为490-358=132,132大于50而小于150),然后在490+150ms=640ms时刻灭灯。

如果有多个灯,那么在本灯状态改变时,就要考虑本灯改变时刻与前一个亮的灯时刻之差至少大于10ms。
==============================================

这道题的实际意义是这样的:就拿RS485通信来说,假设通信速度500K,一个主,10个从。
灯状态改变一次表示主发送一帧数据。
每个灯的周期不同,表示对数据通信要求不同,有消息或相对实时一点的。
任意两个不同的灯闪烁间隔大于10ms,是为了帧不碰撞,让从帧有充足时间响应主。
有按键按下,表示帧的内容发生变化,需要以更快的速度发出去。但是要满足“离该灯上一次状态变的相隔至少50ms”,是考虑到万一同时有多个按键按下(就是多个帧的数据都发生变化),防止总线负载过高,防止冲突。


今天看了QQ**牌的规则,规则写的很全面。而我这个题目规则表达的不好。




















相关帖子

沙发
ayb_ice| | 2012-9-18 08:06 | 只看该作者
设个时间标志,简单搞定

使用特权

评论回复
板凳
dlyt_test001| | 2012-9-18 08:30 | 只看该作者
弄个10ms的定时器,搞定。

使用特权

评论回复
地板
xiaox314| | 2012-9-18 10:46 | 只看该作者
这个,要么用定时器定时,要么自己用计数能定时!

使用特权

评论回复
5
gx_huang| | 2012-9-18 10:55 | 只看该作者
笑话,肯定有一起亮或者灭的概率的。
任意两个灯闪烁间隔大于10ms,这是什么意思?

使用特权

评论回复
6
渤海三叠浪|  楼主 | 2012-9-18 12:35 | 只看该作者
5# gx_huang
我表达的确实不够清楚。就是某个灯闪烁一下之后,下一个灯必须10ms之后才可以闪烁。

就是一定不能同时亮或者灭,不能有这种概率。

使用特权

评论回复
7
渤海三叠浪|  楼主 | 2012-9-18 12:36 | 只看该作者
本帖最后由 渤海三叠浪 于 2012-9-18 12:38 编辑

我说用51单片机的搞的意思就是说 不能用操作系统。
这个题目其实是个通信调度问题。

使用特权

评论回复
8
gx_huang| | 2012-9-18 12:37 | 只看该作者
那必须保证允许有一定的时间误差,比如大于5毫秒,一个提前,一个推迟,应该容易的。

使用特权

评论回复
9
渤海三叠浪|  楼主 | 2012-9-18 12:45 | 只看该作者
那必须保证允许有一定的时间误差,比如大于5毫秒,一个提前,一个推迟,应该容易的。
gx_huang 发表于 2012-9-18 12:37

容易么? 写个思路看看?

https://bbs.21ic.com/viewthread.php?tid=159355&highlight=

你这个是个共享数据问题

使用特权

评论回复
10
渤海三叠浪|  楼主 | 2012-9-18 12:53 | 只看该作者
本帖最后由 渤海三叠浪 于 2012-9-18 13:02 编辑

觉得简单那就
再出一个题(注意  这里的闪烁就是状态变一下,就是由亮变灭 或者 由灭变亮)
--------------------------------------------------------------------------------------------------
用51单片机搞。共有10个灯。

第一个灯150ms闪烁一次(当然时间要求不可能太准确了。可以考虑有2ms的误差)
第二个灯250ms闪烁一次
第三个灯500ms闪烁一次
第四个灯1500ms闪烁一次
第5个灯2500ms闪烁一次。。。。
第6个灯700ms闪烁一次
第7个灯770ms闪烁一次
第6个灯900ms闪烁一次
第8个灯300ms闪烁一次
第9个灯200ms闪烁一次
第10个灯1000ms闪烁一次
并且任意两个灯闪烁间隔大于10ms。


给每个灯添加1个按键(一一对应)。
按一下键,对应的灯 状态变一下(但是必须离该灯上一次状态变的相隔至少50ms)。
-----------------------------------------------------------------------------------------------------
比如仅仅考虑灯1,在时间点8ms时亮,那么就会在158ms灭(因为周期要求是150ms),那么在170ms按键时,就会在158+50=208ms亮灯,然后在208+150=358ms灭,那么在485ms毫秒按键时,就是会485m亮灯,然后在485+150ms灭灯。

使用特权

评论回复
11
zhm8508| | 2012-9-18 13:44 | 只看该作者
没什么意思,时间片+等待标志轻松解决。

使用特权

评论回复
12
inter_zhou| | 2012-9-18 14:15 | 只看该作者
孔乙己,茴香豆的“茴”有4种写法

使用特权

评论回复
13
mohanwei| | 2012-9-18 14:35 | 只看该作者
typedef struct
{
    u16 ON_10ms;//单周期亮时间
    u16 perio_10ms;//周期
}LED_Pa;
试过普通51单个定时器+外接74HC595控制64个LED都很轻松……单位都是10ms的原因是定时器节拍就是10ms

使用特权

评论回复
14
受不了了| | 2012-9-18 14:38 | 只看该作者
太难,做不出来

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
渤海三叠浪 + 1
15
liaohongcai8204| | 2012-9-18 15:25 | 只看该作者
楼上都是牛人啊!不能同时有两个灯亮,不是简单的让亮让灭就可以的,还要注意调度,比如250MS的和500MS的是怎么避开同时亮的问题,期待大牛出现!

使用特权

评论回复
16
zhm8508| | 2012-9-18 15:51 | 只看该作者
15# liaohongcai8204 不是没注意,关键是楼主的设置不合理,两个灯同一时刻要亮,你只能先亮一个,间隔要50ms,误差只能2ms,这不是坑爹嘛。另外LZ的问题不是任务调度问题,而是共享资源的问题,你一个任务就要锁定50ms,还要要求实时性。。。大牛支招吧

使用特权

评论回复
17
渤海三叠浪|  楼主 | 2012-9-18 16:04 | 只看该作者
16# zhm8508
呵呵 抱歉 我说的不太清晰。我是说第一个灯每隔150ms发一次。就是周期是150ms

使用特权

评论回复
18
duhemayi| | 2012-9-18 17:03 | 只看该作者
有点难

使用特权

评论回复
19
xmar| | 2012-9-18 17:36 | 只看该作者
本帖最后由 xmar 于 2012-9-18 17:41 编辑

非常简单:用10个555定时振荡器。
第一个周期是 150ms翻转一次,
第二个周期是 250ms翻转一次,
第三个周期是 500ms翻转一次,
第四个周期是 1500ms翻转一次,
第5个周期是 2500ms翻转一次,
第6个周期是 700ms翻转一次,
第7个周期是 770ms翻转一次,
第6个周期是 900ms翻转一次,
第8个周期是 300ms翻转一次,
第9个周期是 200ms翻转一次,
第10个周期是 1000ms翻转一次。
然后用51单片机的10个IO输出控制555振荡器。再说一遍:很简单, 非常简单 !

使用特权

评论回复
20
zhm8508| | 2012-9-18 17:44 | 只看该作者
19# xmar 嘿嘿,你又错了。

使用特权

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

本版积分规则

62

主题

637

帖子

1

粉丝