单片机音频驱动实验C语言,单片机实验:音乐改编

《单片机实验:音乐改编》由会员分享,可在线阅读,更多相关《单片机实验:音乐改编(7页珍藏版)》请在人人文库网上搜索。

1、实验1将歌曲播放程序两只老虎改变为另一首歌曲(如Happy new year to yoi)、编程指导:产生任意音频f/*文网络及个人整理,勿用作商业用途音频播放:单片机用一根10 口线,向喇叭送出各种音符的频率-交替变化 的高、低电平,即可让喇叭获得音频方波-播放音乐。欲产生某音符的频率f,只需在f的半周期C对I0 口线取反一次即可!如,喇叭接在I/O 口线P3.7 上:sbit sound=P3八7;/位定义:将 sound为 P3.7sound=!sound; /将P3.7引脚输出电平取反,形成方波一个“沿”【定时常数C】即定时器的“纯”定时时间=计数次数*机器周期【12*( 1/CLK。

2、 )】 定时常数C计算:【定时常数C=音符频率f的半周期C=(1/2f)s=(1000000/2f)us】 以定时/计数器的输入脉冲(机器周期)为单位时:【C=(1000000/2f)us/机器周期 us】【机器周期=12个主频时钟周期】单片机晶振主频时钟常为11.0592MHZ【机器周期=12*( 1/11.0592)us=1.085us以机器周期为单位的定时常数 C=(1000000/2f)us/1.085us=460830/f 即:产生任意频率定时常数C计算公式:【定时常数C=460830/f】f为某音符频率【定时初值N计算】定时初值写入定时计数器,即会产生期望的定时常数C,即定时宽度或。

3、输出频率f。【定时初值”=模M -定时常数C】模M=最大计数值=2A位数,即2的二进 制位数次方例:【若T0为工作方式0,13位计数,其模=最大计数值=2八13=8佃2】【方式0,13位计数 定时初值计算式】【N=8192-C】【定时初值N设置编程】TL0=(8192-C)%32;/TL0 每计数32次向TH0进位1次【13位计数器的低 5位=TL0的低5位,TL0高3位未用】 文档来源网络及个人整理,勿用作商业用途TH0=(8192-C)/32;/TH0 右移5位(2八5=32)【13位计数器的高8位】*/文档来源网络及个人整理,勿用作商业用途二、如下为歌曲两只老虎的不完整C语言程序,请补充。

4、完整。/1、将头文件改为reg51.h #include / 包含头文件:【文件包含】51单片机寄存器定义/2、将驱动喇叭的I/O 口改为P1.0【数据定义】sbit sound=P3A7;位定义:将sound定义为P3.7【驱动喇叭】unsigned int C;/ 变量定义:储存定时器的定时常数3、C调的简谱-频率表:【低音L,中音Z,高音H】 /简谱 频率 说明#define L1 262/ L仁低音1=262Hz【周期=1/262=3826us取半周期】 文档来源网络及个人整理 ,勿用作商业用途L2286/ L2-低音2=286HzL3311/ L3-低音3=311HzL4349/ L。

5、4=低音4=349HzL5392/ L5=低音5=392HzL6440/ L6-低音6=440HzL7494/ L7-低音7=494HzZ1523/ Z1=中音1=523Hz/CZ2587/ Z2=中音2=587HzZ3659/ Z3=中音3=659HzZ4698/ Z4=中音4=698HzZ5784/ Z5=中音5=784HzZ6880/ Z6=中音6=880HzZ7987/ Z7=中音7=523HH11046/ H仁高音1=1046HzH21174/ H2=高音2=1174HzH31318/ H3=高音3=1318HzH41396/ H4=高音4=1396HzH51567/ H5=高音5=。

6、1567HzH61760/ H6=高音6=仃60HzH71975/ H7=高音7=佃75Hz/用宏替换,将各频率替换为音符名称,如:#define L1262/ L1 =低音1=262H文档来源网络及个人整理 ,勿用作商业用途调中音宏定义调高音宏定义【周期=1/262=3826us取半周期】/4、改错 【子函数】 /* 延时函数:延时 200ms【 1/4 拍时间】 */ void delay()unsigned char m,n; for(i=0;i100;i+)/ms级延时,2 重循环for(j=0;j250;j+);/*函数功能:主函数*/void main(void)【主函数】unsi。

7、gned char i,j;5改编程序,播放另一首歌曲【暂不做,下题再做(四、)】。/两只老虎频率【frequency】/ unsigned int code f=Z1,Z2,Z3,Z1,Z1,Z2,Z3,Z1,文档来源网络及个人整理,勿用作商 业用途unsigned int code f=L5,L5,L6,L5,Z1,L7,此句已改为祝你生日快乐文档来源网络及个人整理,勿用作商业用途Z3,Z4,Z5,Z3,Z4,Z5, Z5,Z6,Z5,Z4,Z3,Z1,Z5,Z6,Z5,Z4,Z3,Z1, Z2,L5,Z1,Z2,L5,Z1,0xff;/0xff为结束标志/两只老虎节拍【4=1拍,2=1/。

8、2拍,8=2拍】歌曲时间节拍【time/ unsigned char code JP =4,4,4,4,4,4,4,4, unsigned char code JP =2,2,4,4,4,4,4,/此句已改为祝你生日快乐文档来源网络及个人整理,勿用作商业用途4,4,8,4,4,8,2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8 ;6、填空改错=1;开总中断【5个中断】=1;定时器T0开中断(允许)=0x00;方式字:高 4 位 T1 : GATE C/-TM1M0=0000= /软启 定时 方式0(13位计数=8位TH1+低5位TH0)/ 【低4位T0 (同)】whil。

9、e(1)无限循环(唱不停:加电即工作)i=0;/从第1个音符f0开始播放while(fi!=.)若未读到结束标志,则继续 /定时常数C公式:晶振主频时钟常为11.0592MHZ=460830/fi;/【定时常数C=46083/f f为某音符频率/首次装入初值:=(8佃2-C)%32; /整除32取余:TL0每计数32次向TH0进位1次 /【TL0=13位计数器的低5位=TL0的低5位,TL0高3位未用】II【TL0高3位未用】【2八5=整除32,每计数32次向TH0进位1次】文档来源网络及个人整理,勿用作商业用途=(8192-C)/32; IITH0右移5位:2八5=32【TH0=13位计数器。

10、的高 8 位】=1;II启动定时器T0【到定时常数C时,溢出中断发生】for(j=0;jv;j+)II控制节拍数【循环延时i次:节拍】delay(); 延时函数【1I4拍时间】=0;II关闭定时器T0【不响了】;播放下一个音符sound=0;可略I*文档来源网络及个人整理,勿用作商业用途函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波*I文档来源网络及个人整理,勿用作商业用途*中断服务函数编程指导*中断服务函数格式:程序名()interrupt x using y interrupt x中断号 using y所用工作寄存器组 0外部中断01定时器02外部中断13定时器14串行。

11、中断c在编译时把函数入口地址放到对应中断的跳转地址。using y中断函数使用4个寄存器组的哪一个*/void TimeO(void) interrupt using 1【中断 1=T0,工作寄存器 1 组】 文档来源网络及个人整理,勿用作商业用途sound=; II【响了!】将P3.7引脚输出电平取反,形成方波一个“沿”II再次装入初值:【首次之后】TH0=(8佃2-C); II TH0右移5位:2八5=32【13位计数器的高8位】TL0=(8192-C); II整除32取余:TL0每计数32次向TH0进位1次、设计播放该歌曲的硬件电路图,并仿真运行,调试成功四、改编程序,播放另一首歌曲。五。

12、、将delay()函数的外循环的循环变量终值 100改为250,仿真运行,体验播 放速度有何变化?附:几个歌谱a:歌谱祝你生日快乐7 / 6祝你生日快乐HAPPY birthday TO YOU(圾乐谱网站制谓)ity to生 日 快 岛祝怵 生 日 快55651-55H&p -V1birthsdtyto艸1恤V祝你生Bft祝你b:歌谱三个和尚陈小奇词曲甘苹唱X 嘿嘿嘿 X嘿嚥嘿 53-喝多多5水6-挑越ft5么5呀來得5一挑越挑1 - C一 个呀和 为 什么和 大和尚说挑15* 找1尚尚水的 尚尚来5 5 5 6 5 3 5 X X |5556535 -355635LL一 4一 I T -V r = I 1 卅 L,挑呀么挑 水喝,柬咦 挑吋么桃水喝. 二 个呀和 越来越 多,咦咦越来越为什么那和挑得最 多,咦咦戢 多,二和尚说新么 呀来该 抬越应SK-嘤嘿MrUT EK関妙 喝惰活 水懒干 抬越多 么呀来该 抬越应拾 水喝魂昭 抬呀么抬 水喝” 越懒tii咦咦越来越懒惰. 多干活咦咦应该多干活*6 1 235535 63 3 5 3 2 1 2 1 6a S 个和尚没水 为 什么那长 小和尚说年一呀来体 没不身 -呀也P喝老幼没水喝说一说太单薄呀“呀.3呀来体没不身生没说太呀来体没不身瞩说薄 水一单 k投说太 5 =e-呀呀呀。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值