好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

单片机在儿童智能玩具中的应用--音乐玩具.doc

10页
  • 卖家[上传人]:飞***
  • 文档编号:32444204
  • 上传时间:2018-02-11
  • 文档格式:DOC
  • 文档大小:92KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • AVR 单片机在儿童智能玩具中的应用--音乐玩具利用单片机开发儿童智力玩具大有作为,尤其单片机扩展存贮器方便,而大容量存贮器价格也很低,64KB 的EPROM 可存放300 多首歌曲,8M 位EPROM 可存放5000多首歌曲,几个芯片就可组成一个音乐库,这是用其它方法难办的利用AVR 单片机产生乐曲音符,再把乐谱翻译成计算机音乐语言,由单片机进行信息处理,再经过信号放大,由耳机或喇叭放出乐曲声.由于音符和节拍是由计算机产生的,所以发音音符和节拍准确,可见音乐从娃娃开始抓起,音乐玩具是儿童笫一个好老师利用单片机的中断,I/O 口控制功能,可以做到电脑放音机有自动连续放音功能,乐曲全部放完自动从头开始连续放音,循环不断如何产生音乐频率:1.要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间,然后利用计时器计时此半周期时间,每当计时到后就将输出脉冲对I/O 口反相,然后重复计时此半周期时间再对I/O 口反相,如此就可在I/O 口引脚上得到此频率的脉冲(程序驱动I/O 口反相,即正负各半周期为一个周期,才能使喇叭”吸放” 发声);2. 利用AVR 单片机的内部计时器让其工作在计数模式MODE1(16 位定时计数器)下,改变计数值TCNT1H 及TCNT1L 以产生不同的频率;3. 例如以6MHZ 晶振为例:要产生频率为523HZ,其周期T=1/523=1912us, 其半周期为1912/2=956us,因此只要令计数器计时956us/1us=956(为半周期).所以在每计数956 次时将I/O反相,就可得到中音DO(523HZ).计数脉冲值与频率的关系公式如下:N=Fi(6MHz 晶振,CPU 产生的频率) 2(半周期) FrN:计数值Fi:以6MHZ 晶振为例,内部计时(数)一次需2us, 频率单位为1 周期/秒,即HZ1 周期/2us=1 周期/2X10-6 秒=500000 次/秒=500000HZ故其频率为500000HZFr:要产生的频率4. 其计数值的求法如下:T(16 位计数器计多少后溢出)=65536(16 位二进制计数器,计满数溢出时的计数值为2 的16次方)-N=65536-Fi/2/Fr例如:求低音DO(262HZ),中音DO(523HZ),高音DO(1046HZ) 的计数值?设K=65535 F=500000=Fi=0.5MHZT=65536-N=65536-Fi/2/Fr=65536-500000/2/Fr=65536-250000/Fr低音DO 的T=65535-1908=63627(十进制数)中音DO 的T=65535-0956=64579(十进制数)高音DO 的T=65535-0478=65057(十进制数)5. C 调各音符频率与计数值T 的对照表:音符频率HZ 半周期TCNT 值音符频率HZ 半周期TCNT 值低1DO 262 1908 S 63627 #4FA# 740 0676 S 64859#1DO# 277 1805 63730 中5SO 784 0638 64897低2RE 294 1700 63835 #5SO# 831 0602 64933#2RE# 311 1608 63927 中6LA 880 0568 64967低3M 330 1516 64020 #6LA# 932 0536 64999低4FA 349 1433 64012 中7SI 988 0506 65029#4FA# 370 1350 64185 高1DO 1046 0478 65057低5SO 392 1276 64259 #DO# 1109 0451 65084#5SO# 415 1205 64330 高2RE 1175 0426 65109低6LA 440 1136 64399 #2RE# 1245 0402 65133#6LA# 466 1072 64463 高3M 1318 0372 65156低7SI 494 1012 64523 高4FA 1397 0358 65177中1DO 523 0956 64579 #4FA# 1480 0338 65197#1DO# 554 0903 64632 高5SO 1568 0319 65216中2RE 578 0842 64683 #5S0# 1661 0292 65243#2RE# 622 0804 64731 高6LA 1760 0284 65251中3M 659 0759 64776 #6LA# 1865 0268 65267中4FA 698 0716 64819 高7SI 1976 0253 65282"#"表示半音,用于上升或下降半个音如何产生节拍:每个音符使用1 个字节, 每个节拍使用1 个字节,AVR 程序存储器可以设为16 位,即1 个字,或称双字节,所以一个字的高8 位存放音符码,低8 位存放节拍码如果1 拍节为0.4 秒则1/4 拍是0.1 秒,只要设定延迟时间就可求得节拍的时间,我们假设1/4 拍为1 DELY 单位,则1 拍应为4 个DELY,以此类推,只要求得1/4 拍的DELY单位时间,其余的节拍就是它的倍数.1/4 拍的延迟时间=187 亳秒节拍与节拍码对照表节拍码节拍数(拍) 节拍码节拍数(拍)1 1/4 1 1/82 2/4 2 1/43 3/4 3 3/84 1 4 1/25 1 又1/4 5 5/86 1 又1/2 6 3/48 2 8 110 2 又1/2 10 1 又1/412 3 12 1 又1/216 1 又3/4建立音乐的步骤:找出乐曲,然后对照音符表,翻译出乐曲码,用程序伪指令DB 输入曲码和节拍码;也可直接在调试窗口的程序存储器窗口$0100 地址输入曲码和节拍码(只适用于实时仿真器)例:音符表练习,1.把简谱翻译成曲码代码;以下音符均设为一拍, 代码为41 2 3 4 5 6 7(低八度音)1 2 3 4 5 6 7 (中音) 1(高音) 1(高音) 7 6 5 4 3 2 1(中音) 7 6 5 4 3 2 1(低八度音)曲码1 3 5 6 8 10 12 13 15 17 18 20 22 24 25简码1 2 3 4 5 6 7 1 2 3 4 5 6 7 1低八度音中音高音曲码36 34 32 30 29 27 25 24 22 20 18 17 15 13 12简码7 6 5 4 3 2 1 7 6 5 4 3 2 1 7高八度音中音低音最后翻译成乐曲加节拍代码为:01,04,03,04,05,04,06,04,08,04.10,04,12,04,13,04,13,04,15,04,17,04,18,04,20,04,22,04,24,04,25,04,25,04,36,04,34,04,32,04,30,04,30,04,29,04,27,04,25,04,24,04,22,04,20,04,18,04,17,04,15,04,13,04,12,04以上乐曲数据用伪指令DB 方式输入”乐曲.ASM”的$0100 地址,再汇编一次就可下载试听,注意: 音符节拍间用逗号隔开,不要不小心键入小数点,因为逗号键右边是小数点键,键入小数点,程序汇编时将造成计算机死机!00 00(4 个零为所有曲结束标志)1. 把乐曲代码输入计算机把SL-AVR 实验器与PC 机连机,U4 插上AT90S8515 芯片,插上音响器短路块,开机通电进入AVR 下载窗口,进行下载操作,下载结束应能听到乐曲声;************* 乐曲程序SLAVR732.ASM ************************;* 标题:AT90S8515 C 口输出乐曲声—电脑放音机;* 版本: 1.0;* 最后更新日期: 2000.08.08;* 支援E-mail: gzsl@;* 描述;* 用SL-AVR 万用下载开发实验器做样机,在AT90S8515 的C 口接喇叭发出乐曲声,;* 请你把最喜爰的乐曲送入单片机 ! 起始地址为$0100,也可把曲码节拍码在调试窗口中的;* 程序存储器窗口(Program Memory)内,从$0100 地址,;* 用键盘直接输入乐曲(仅适合ICE-200 实时仿真器);* 作者: SL.;*程序适用于所有单片机;***************************************************************************.include"8515def.inc" ;文件头AT90S8515 器件配置文件,不同的器件有不同的器件配置文件rjmp RESET ;AVR 重新定位.def TEMPDH =r2 ;寄存器定义.def TEMPDL =r3.def CNT =r10.def SCNN =r11.def KEYN =r12.def SCNK =r13.def SCNDP =r14.def KSNI =r15.def TEMP =r16 ;数据暂存器.def TEMP1 =r17.def TEMP2 =r18.def TEMP3 =r19.def SCNTT =r26 ;.def MUSN =r22 ;输出乐曲声暂存器.def TONL =r21 ;节拍码低位.def TONH =r20 ;节拍码高位.def PLYTON =r25 ;存乐曲码.def TONSET =r24.def TONLNG =r23 ;存节拍码.cseg.org 0x06 ;TIM1__OVF 定时器1 溢出中断处理入口地址intt1: RJMP OUTPM ;转定时器1 溢出中断处理,发音周期到 ,则跳转到发音输出态.cseg.org 0x010 ; 定时器1 溢出中断处理程序,发音起始地址;发音周期到重新装入计时值并将输出到PORTC 口OUTPM: OUT TCNT1H,TONH ;重新将TONH 新计时值载入TCNT1H 内OUT TCNT1L,TONL ; 重新将TONL 新计时值载入TCNT1L 内SBIS PORTC,00 ;先检测PORTC 口是否为1 而跳转RJMP SETOP1 ;若是PORTC 口为0 则跳到SETOP1 令PORTC 口转为1SETOP0: CBI PORTC,00 ;若PORTC 为1 则令PORTC 转为0LDI MUSN,$00 ;同时令MUSN 为00 值RETI ;回中断前主程序并令可再次中断返回SETOP1: SBI PORTC,00 ;若PORTC 为0 则令PORTC 转为1LDI MUSN,$01 ;同时令MUSN 为01 值RETI ; 回中断前主程序并令可再次中断返回.cseg.org 0x020 ;主程序起始地址,必须跳过中断区RESET:ldi temp,low(RAMEND) ;RAMEND 为8515def.inc 内建值为025FHout SPL,temp ;启始堆栈指针低位将TEMP=02H 放入SP=3DH;若硬件堆栈或者片AVR 片内含SRAM 小于256B 时,下列二行程序可省略,ldi temp,high(RAMEND) ;以TEMP=R1611110111 移位以进行下一行按键扫描NOSK: SEC ;令进位标志CF=1ROR SCNDP ;将扫描显示码SCNDP 左移作下一位扫描DEC CNT ;共需作6 位数扫描显示故CNT 减1BRNE COL1 ;CNT 减1 不为0 则跳回COL1 再作扫描显示及读取键盘输入LDI TEMP,$FF ;若已完成全部扫描显示和读取按键则令TEMP=0ffOUT DDRC,TEMP ;TEMP 输出到DDRC 设定PORTC 为输出驱动LEDOUT PORTC,TEMPPOP TEMP ;出栈POP TEMP1POP TEMP2POP TEMP3POP XLPOP XHRET ;子程序返回。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.