打印

*俺来出题了:一道题区分你是编程老手还是菜鸟

[复制链接]
19037|124
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xwj|  楼主 | 2007-12-4 10:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
借用fxmxh出的一个题,有兴趣的朋友不妨试试看;

1:CPU不限,但只准用一个可中断的timer,其他中断、定时器不准用
2:驱动两位数码管(段驱动用164)
3:四个按键
4:驱动无源蜂鸣器,要求输出频率、时间可变,以实现多键音或音乐演奏
(音乐演奏可作为加分题,自由发挥)
5:驱动一个步进电机(四相八拍)
6:有红外遥控接收
总体要求:蜂鸣器响时,数码管不能闪,且蜂鸣器声音不能失真;红外接收要灵


备注:
1、音乐演奏作为加分题,可以选择发挥,不影响总分
2、CPU、编程语言不限,以便大家用自己熟悉的环境编写
3、主要是考考是否有编复杂程序的能力,程序大小不做严格要求
4、程序规范性、程序大小等不做严格要求,但可以别人的评价哦


注册了个公用邮箱:21icgroup@163.com
大家可以把答案发邮箱里,我一周后公布密码并把程序贴到这个Blog里,大家可以查询、点评

我保证不删除、修改任何东西!


如果匠人姐姐看到这个贴,就去申请些奖品来奖励下优胜者吧:-)
也希望各位大虾们能把自己不用的开发板、试验板拿些出来,赞助下好学者、优胜者吧!


大虾小虾们,
行动起来吧,
程序写的好的话说不定就会有人来高薪挖你们了哦
那就偷着笑吧!!!

呵呵^_^

相关帖子

来自 2楼
computer00| | 2007-12-5 13:18 | 只看该作者

呵呵,先来回答一下57楼d1d2的问题

的确是要对每个音符做逐渐衰减处理(专业术语叫做释放),不过直接用MCU的IO做来完成,
我们就可以简化些,直接停止就行了。以前看到过一个电路,利用电容的放电曲线来产生逐
渐衰减的余音效果。音色主要由它的包络和谐波成分决定。在这里我们不好控制谐波,控制
包络还是可以的。一个音的包络主要由4个阶段决定:上冲,衰退,保持,释放,英文简写
为ADSR。使用RC电路的输出电压,通过控制充电时间常数和放电时间常数(通过IO口选择不
同的电阻),在一定程度上能够获取到不同的音色。例如钢琴音色就是上冲短而快,而释放比较缓慢。



接下来是yewuyi的几个问题:

A1: 这是根据12平均律计算出来的。由于人耳对声音频率的响应是对数关系,所以我们将
一个八度(例如440Hz到880Hz)按照指数关系平均分成12等份,这样刚好跟人耳的对数关系
相补偿,结果让人听起来感觉就是平均分配的。我们用分别用符号来表示这12个音,例如
A #A B C #C D #D E F #F G #G,这些记号叫做绝对音高。每两个记号之间相差的频率距离
叫做一个半音,两个半音合起来就是一个全音。其中B和C,E和F之间是半音,其它不带#(升
记号)的两个之间相差一个全音。这样,任意两个为倍频关系的音之间都可以分为12等份。
而我们规定,标准的A音频率为440Hz。当然,在220Hz到440Hz之间也存在着这12个音,也是
用这样的记号,不过就是低了一个八度,相应的,还有高八度的等等。在钢琴上,用大小写
字母以及配合数字来标记这些音。在钢琴上的白键,就是那些没有#的,而黑键,就是带#的
那些。具体的频率计算公式如下:升高一个半音就是在前一个音的基础上加上2的十二分之一次方,
例如A音频率为440Hz,那么#A音的频率就是440+440*2^(1/12)。


A2: 取C调是我举个例子而已。一个曲子是什么调,在作曲的时候就指定了。当然,为了适合
演奏或者演唱,可以换成其它的调子。例如像我们做的这个,选择一个合适频率的范围,既能
让蜂鸣器比较好的发声,又能让MCU不要太累,这样决定之后,再根据曲子的音符范围,就可以
选择一个合适的调了。你看,总共有12个符号,那么就应该有12种大调和12种小调了。


A3:音符长短是曲谱里面定义好的,是作曲者觉得这样好听就这样定了。通常,在简谱里面,
不加任何修饰的就是一个四分音符,下面加一个下划线就表示八分音符,加两个下划线就表示
十六分音符,依次类推。每多一个下划线,时值要减半。加一个下划线的0.5s就表示这个音符
要连续发声0.5s,这样一个四分音符就是一秒。如果以四分音符为一拍的话,就是60拍每分了。


A4:这个主要是因为我们的MCU不能让它产生包络,所以用停顿片刻来区分下一个音的开始。
这个参考一下对d1d2的回答。自己感觉得差不多就行了吧。实际中是没有这个值的,由乐器
本身的特性来决定。当然,实际乐曲中可能有休止符,那个就是真正的停止发声了,并且有长度规定。


A5:A音是一个绝对音高的符号,我们规定了它的频率,然后其它音的频率是根据它的值算出来的。
7个自然音阶就是指do re mi fa so la si,简谱就是用数字1~7来表示。我们规定3和4,7和1之间
是半音,其它几个之间是全音。夹在自然音阶中间的叫做变化音阶,例如#1,#2等。如果按照这个关系,
我们选择C作为1,那么我们发现刚好是有#的对应着#,没#的对应着没#的,即7个自然音阶刚好对应
着钢琴上的全部白键。而大调的曲子以1为主音,这就是为什么我们看到大部分曲子是C大调的原因。
另外如果是G大调的话,只有一个#F,这也是G大调比较常用的原因。


A6:曲子根据要表现的感**

使用特权

评论回复
板凳
zusen| | 2007-12-4 10:09 | 只看该作者

俺的事多着呢,不玩了

哈哈~~~~~~~

使用特权

评论回复
地板
hq_y| | 2007-12-4 10:13 | 只看该作者

哈哈好事啊~~~~~~~~~等着挖人了~~~~~~~

使用特权

评论回复
5
zusen| | 2007-12-4 10:14 | 只看该作者

有个 可中断的timer

一切都变得很容易了

使用特权

评论回复
6
ayb_ice| | 2007-12-4 10:15 | 只看该作者

其实就是利用定时器的问题

使用特权

评论回复
7
xwj|  楼主 | 2007-12-4 10:15 | 只看该作者

公用blog地址:

使用特权

评论回复
8
aweyfan| | 2007-12-4 10:21 | 只看该作者

蜂鸣器声音不能失真

这点有点难,人耳灵敏度太高了,稍许的延迟都可能造成失真

定时器必须支持可自动重载

cpu速度够快的话,其它也不难

使用特权

评论回复
9
xwj|  楼主 | 2007-12-4 10:25 | 只看该作者

呵呵,写了程序的发邮箱,到时再统一发出来评比:-)

三言两语的都不算数,真正动手的才是真!

很多事都是看起来容易做起来难哦,
而且细节上更能体现水平:-)

使用特权

评论回复
10
aweyfan| | 2007-12-4 10:27 | 只看该作者

加分:用的io口越少越好,成本越低越好

使用特权

评论回复
11
computer00| | 2007-12-4 10:28 | 只看该作者

还有些要求不够详细,

例如蜂鸣器的输出频率调节范围,步进量,时间范围,步进量。

步进电机的速度要求等等。

使用特权

评论回复
12
zusen| | 2007-12-4 10:28 | 只看该作者

小x 相信没多少人有时间陪你玩吧

其实没必要真的写程序出来,能用语言描述实现的方法就行了,写程序 最重要的是思路

使用特权

评论回复
13
aweyfan| | 2007-12-4 10:32 | 只看该作者

奖品:洗碗机一台

使用特权

评论回复
14
xwj|  楼主 | 2007-12-4 10:38 | 只看该作者

呵呵,能写出整个思路让人看不出漏洞、缺陷的也可以

但如4楼、5楼、7楼那样的泛泛而谈肯定是不能算数的:-)

蛋蛋在10楼的要求就没必要了,只是个虚拟的题,没注明的参数都可以自己定,定的合理就可以了(会自己定合理参数也可以视为加分表现的)

比如说蜂鸣器频率,你总不会定个1Hz或几十kHz吧?肯定是在正常的音乐范围啊

使用特权

评论回复
15
zusen| | 2007-12-4 10:40 | 只看该作者

哈哈,做出来 变了个 驱蚊器 ,哈哈哈哈

使用特权

评论回复
16
alice84| | 2007-12-4 10:47 | 只看该作者

xwj总在变着法子"玩".

使用特权

评论回复
17
救火车| | 2007-12-4 10:55 | 只看该作者

CPU足够快的话,全放中断里不就行了?

应该规定用什么CPU。

使用特权

评论回复
18
athlon64fx| | 2007-12-4 10:59 | 只看该作者

re:

定时器必须产生一个高频率的节拍(譬如50-100K),可以实现LZ要求的功能.
无源蜂鸣器可以变化音调,但是步长会比较大,秦乐可能不好实现.

使用特权

评论回复
19
wxj1952| | 2007-12-4 11:04 | 只看该作者

小意思。

要是没有裸奔者先做,我就用圈圈的OS做完后直接在此贴答案了。正好也看看裸奔者是不是光说不练呀。


最好还是像我一样,设立3000元奖金。否则只给未测试程序。

使用特权

评论回复
20
xwj|  楼主 | 2007-12-4 11:10 | 只看该作者

呵呵,你的题什么时候说了“设立3000元奖金”啊?

而且你的那个“运行期间不允许打断”中的打断”是怎么定义?

使用特权

评论回复
21
yewuyi| | 2007-12-4 11:25 | 只看该作者

除了红外对MCU速度提出要求外,

其它都没什么,但要做稳定了,至少要对前后台结构比较了解,属于考程序结构的题;

1:CPU不限,但只准用一个可中断的timer,其他中断、定时器不准用
2:驱动两位数码管(段驱动用164)
3:四个按键
4:驱动无源蜂鸣器,要求输出频率、时间可变,以实现多键音或音乐演奏
(音乐演奏可作为加分题,自由发挥)
5:驱动一个步进电机(四相八拍)
6:有红外遥控接收
总体要求:蜂鸣器响时,数码管不能闪,且蜂鸣器声音不能失真;红外接收要灵


因为只有一个可中断的定时器,所以,这个定时器基本不用想了,肯定是给系统做CLOCK了,数码管用不用164就无所谓了,他喜欢用IO直接驱动也可以,把KEY复用到数码管的IO上就是,如果他熟悉前后台或者更高级的程序结构的后,KEY的抖动处理和扫描也不应该出问题,至于驱动蜂鸣器产生音乐,那可能需要懂点频率对照音调什么的,呵呵,俺是不懂这个,谁懂的话,上来给大家仔细讲讲。
步进电机的速度基本由发来的脉冲速度决定,不考虑启动和停止的缓冲的话,基本上就考虑把脉冲发平均了就可以,这样,步进电机运行时才平稳,如果他熟悉前后台或者更高级的程序结构的话,这个也难不倒他。
红外反到是个麻烦,因为没有其他中断可用,那只能用查询的方式,如果不对载波解码的话,红外信号0和1的脉冲长度基本决定了CLOCK的时间大小,呵呵,俺感觉定在200US比较好,呵呵,但200US似乎能执行的代码又少了点,当然,如果要对载波解码这个时间另当别论,所以就要把MCU的速度弄快一点,哈哈,只要MCU速度够快,就不怕这点。

结论:只要熟悉前后台就应该能搞定。

使用特权

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

本版积分规则

xwj

288

主题

22797

帖子

35

粉丝