完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.乐谱
2.音符转频率(音符频率对照表) 简谱中是中音和低音,我提升范围使用高音和中音频率(听起来比较明显) 3. 频率转定时器计数次数 要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。 知道音符频率Fr,晶振频率或CPU内部频率Fi,用N = Fi ÷ 2 ÷ Fr计算计数次数N,从而计算定时器计数初值 (N)补 = 2n - N,其中n为定时器位数(比如工作方式1为16位定时器)。 程序 /***** 程序功能:蜂鸣器演奏《两只老虎》 编 写 人:XXX 时 间:2018年12月20日 硬 件:STC12C32S2 12M晶振 30pF电容×2 蜂鸣器 ******/ #include #define uint unsigned int #define uchar unsigned char #define HALFF 6000000 //12M晶振半频 #define MAX 65536 //16位计数器最大计数次数 ***it sound = P1^0; uint C; uchar STH0; uchar STL0; //C调音频 //#define soo 392 //低音'5' //#define dao 523 //宏定义中音‘1’频率为523Hz //#define re 587 //#define mi 659 //#define fa 698 //#define so 784 //#define la 880 //#define xi 987 #define soo 784 //中音'5' #define dao 1047 //宏定义高音‘1’频率为1047Hz #define re 1175 #define mi 1319 #define fa 1397 #define so 1568 #define la 1760 #define xi 1967 /****** 1个延时单位,1000ms 歌曲为C调4/4拍,简谱中一个音符(最小拍)为1/4拍,现以1/4拍为1个延时单位 关于for执行时间: 当i定义为int(或unsign int)时,为8个时钟周期; 当i定义为char或unsign char时,为3个时钟周期。 */ void delay() { uint i,j; for(i=0; i<1000; i++) for(j=0; j<120; j++); //1ms } void main() { uchar i,j; //《两只老虎》编曲 uint code song[] = {dao,re,mi,dao, dao,re,mi,dao, mi,fa,so, mi,fa,so, so,la,so,fa,mi,dao, so,la,so,fa,mi,dao, re,soo,dao, re,soo,dao, 0xff}; //以0xff为音符结束标志 //以下为每个音符节拍,4个延时单位为1拍 //'4'对应4个延时单位,'2'对应2个延时单位,'1'对应1个 uchar code JP[] = {4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8, 3,1,3,1,4,4, 3,1,3,1,4,4, 4,4,8, 4,4,8}; EA = 1; //开总中断 ET0 = 1; //开定时器T0中断 TMOD = 0x01; //定时器T0用工作方式1(16位计数器) while(1) { i = 0; while(song != 0xff) { C = HALFF/song; STH0 = (MAX - C) / 256; // 高8位 STL0 = (MAX - C) % 256; // 低8位 TR0 = 1; //启动定时器 for(j=0; j delay(); //延时1个延时单位 TR0 = 0; //关闭定时器 i++; //播放下一个音符 } } } /************ 定时器T0的中断服务子程序,使P1.0输出音频所要的方波 */ /********** 要产生音频脉冲,只要算出某一音频的周期(1/频率), 然后将此周期除以2,即为半周期的时间。 利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相, 然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲 ********/ void t0() interrupt 1 using 1 { TH0 = STH0; TL0 = STL0; sound = ~sound; } 小结 延时函数时间可根据效果进行调整,个人对音乐不太了解,弄出个样子就行哈哈 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4084 浏览 18 评论
1168浏览 3评论
601浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
592浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2329浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1892浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 14:26 , Processed in 1.274345 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号