电子小制作:有声倒计时装置
功能是:用一个按钮来设定,一个开关来控制总电源。用2节普通5号电池,3V工作。按钮功能是在10分钟以内每按一次加30秒,在10分钟以上每按一次加1分钟。长按加5分钟。如果当前正在播放声音就中断声音。按后发出BEEP的声音。停止按后5秒开始倒计时,每到整分钟时发声播报分钟数,每到半分钟时发出提示BEEP和发出半分钟。计时到0时播放钢琴曲。
声音数据保存在SD卡中。不采用文件系统,全都直接采用扇区读写法。采用Stc12LE5A60S2,它有1280字节内存。基本设计是这样的:开2个数组,每个都是512字节,作为播音缓冲区。其它的内存作为一般运行时用途。运行时一个状态机负责产生pwm驱动喇叭进行播放,另一个状态机负责从SD卡中取数据。2者一个是消费者,一个是生产者。在消费者播放完一个数组后,消费者就开始播放第2个数组,而此时生产者就同时负责填充第1个数组,这样循环往复,形成连续连贯播放的效果。
整个程序只利用了1个中断。用timer0设定到8K的速度来播放,但每秒的倒计时就需要一个状态机来模拟一个软定时器来完成。
另外还需要一个状态机来下发发音任务。内部的SD卡中只记录了0至9每个字的发音,倒计时到了需要发音时,需要根据这个数字来组合多个发音文件顺序播放,也就是说,一次发音事件对应多个发音任务。所以这个发音任务状态机是双驱动的,一方面在main中驱动,让它能完成所有的发音任务,另一方面在倒计时事件中驱动,让它能启动首个发音任务。