为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

播放生日快乐歌曲

2017-09-02 4页 doc 16KB 45阅读

用户头像

is_014457

暂无简介

举报
播放生日快乐歌曲安徽冶金科技职业学院 课题名称 播放生日快乐歌 系 部 班 级 学生姓名 指导教师 年 月 日 一、 播放生日快乐歌的原理: 通过80C51乐曲播放电路中,P1.7接发声器SOND,P1.0接启动键,按一次K0就播放一遍生日快乐歌;控制输出方波形频率用定时/计数器比延时程序更加准确,根据C音调、半周期和fosc=12MHz条件下选T0定时器方式0计算出来的;播放乐曲,除了控制频率,还有控制时间的问题,用T0方式0控制音频频率,T1方式1控制音符节拍,编制生日快乐歌曲音符序号数组s[26]和生日快乐歌曲音符节拍长...
播放生日快乐歌曲
安徽冶金科技职业学院 课题名称 播放生日快乐歌 系 部 班 级 学生姓名 指导教师 年 月 日 一、 播放生日快乐歌的原理: 通过80C51乐曲播放电路中,P1.7接发声器SOND,P1.0接启动键,按一次K0就播放一遍生日快乐歌;控制输出方波形频率用定时/计数器比延时程序更加准确,根据C音调、半周期和fosc=12MHz条件下选T0定时器方式0计算出来的;播放乐曲,除了控制频率,还有控制时间的问题,用T0方式0控制音频频率,T1方式1控制音符节拍,编制生日快乐歌曲音符序号数组s[26]和生日快乐歌曲音符节拍长度数组L[26],两数组序号具有对应关系。 例如:播放生日快乐歌第一个音符“5”,1/8拍,取4*50ms=200ms;遇休止符0;停止发音频,但仍当做一个音符,按其节拍长短控制定时时间。当一个音符播放结束,T1停,转入下一个音符,中间间隔延时10ms。 设T1定时时间:50ms 计算T1定时初值:T1(初值)=3CB0H 因此:TH1=0x3c,TL1=0xb0 三、 生日快乐歌曲编程: #include //包含访问sfr库函数reg51.h sbit K0=P1^0; //定义启动键K0为P1.0 sbit SOND=P1^7; //定义发声器SOND为P1.7 unsigned char i,j; //定义字符型循环变量i(音符序数)、j(50ms整倍数) ) unsigned char code th[22]={ //定义音符频率定时数组高8位(12MHz,定时方式00,196,202,208,211,216,220,224,226,229,232,233,236,238,240,241,242,244,244,246,2 67,248}; unsigned char code tl[22]={ //定义音符频率定时数组低8位(12MHz,定时方式0) 0,12,27,21,7,4,16,12,4,12,9,20,2,8,6,2,22,5,26,1,4,3}; unsigned char s[26]={ //定义生日快乐歌曲音符序数数组 12,12,13,12,15,14,12,12,13,12,16,15,12,12,19,17,15,14,13,0,18,18,17,15,16,15}; unsigned char L[26]={ //定义生日快乐歌曲音符节拍长度数组(50ms整倍数) 4,4,8,8,8,16,4,4,8,8,8,16,4,4,8,8,8,8,16,8,4,4,8,8,8,16}; void main(){ //主函数 //定义循环变量tunsigned int t;(用于音符发声后间隙延时) TMOD=0x10; //T0定时器方式0,T1定时器方式1 TH1=0x3c;TL1=0xb0; //置T1初值50ms IP=0x02;IE=0x8a; //置T0为高优先级中断,T0、T1开中断 while(1){ //无限循环 while(K0==1); //等待按K0按下 while(K0==0); //等待按K0释放 for(i=0;i<26;i++){ //歌曲音符节拍循环 if(s[i]==0) {SOND=0; //若歌曲音符序数为0,停止发声 TR0=0;} //T0停止运行 else {TH0=th[s[i]]; //否则,置T0初值高8位 (音符方波半周期) TL0=tl[s[i]]; //置T0初值低8位(音符方波半周期) TR0=1;} //T0运行 j=L[i];TR1=1; //置50ms计数器初值,T1运行 while(TR1==1); //等待T1停止运行 TR0=0;SOND=0; //T0停止运行,停止发声 for(t=0;t<2000;t++);}}} //音符间隔延时为10ms void t0() interrupt 1 { //T0中断函数 SOND=~SOND; //输出取反(产音频方波) TH0=th[s[i]]; TL0=tl[s[i]];} //重置T0初值 void t1() interrupt 3 { //T1中断函数 TH1=0x3c;TL1=0xb0; //重置T1初值50ms if((j--)==0) TR1=0;} //若50ms计数器减1为0,T1停止 四、 播放生日快乐歌的步骤和调试: A. 创建keil项目: 1) 双击桌面keil软件 2) 打开keil的集成开发环境 3) 点击菜单栏项目project选新建new project 4) 选择保存路径,建立项目文件夹,给项目命名并保存。 5) 选择CPU厂家和型号并确定。 6) 选择否,点击工具栏的新建文本图标。 7) 输入和编辑项目程序。 8) 完成程序编辑后点工具栏中的保存图标,给程序命名(c51程序 后缀为.C;汇编程序后缀为.ASM),选择保存路径后保存。 9) 添加程序到项目中。 10) 选择程序添加到项目中(程序图标变色即为添加成功). B. 设置工程选项: 1) 点击工具栏中设置图标,修改晶振频率为12MHZ。 2) 点击output,在输出执行文件选项(create)上打钩。 3) 点击debug,选择右边为硬件仿真,确定 4) 点击工具栏编译并下载图标,在输出窗口生成**.hex. C. 调试并观察运行结果: 1) 点击工具栏调试图标,弹出调试窗口。 2) 硬件仿真可直接观察运行结果;软件仿真可点击菜单栏外围设备 peripherals图标,选I/O-ports或T/C监控. 3) 分别点击工具栏中的运行.停止.复位.等图标进行调试,并观察运 行结果. 4) 调试完毕后点击调试图标关闭调试窗口。 五、 实验体会: 通过本次的单片机实训,刚开始我觉得很简单,其实并不是这样的,实验比我们想象的要难,因为这项实验需要我们的细心,特别是在编程的过程中,我们需要仔细的编辑好每一个程序,错了一步就运行不了程序。我在实训的过程中就遇到这种情况,在快要编辑完程序的时候手抖打错了一个符号,以至于我在后面的仿真与调试的过程中一直找不出错误的原因,差点就放弃了,后来在吴老师的指引下细心的又细心的找了一遍,这才找到了错误的根源,加以修正,才让蜂鸣器唱出了生日快乐的歌曲。实验虽然已经结束了,但是带给我的影响是深刻的,让我明白了从事我们这个行业的,必须要有严谨的工作态度,不然会造成不可估量的后果的,正所谓失之毫厘,差之千里。 最后我还特别感谢吴老师带领我们做完了这个实验项目,多谢吴老师的耐心教导和细心指导。
/
本文档为【播放生日快乐歌曲】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索