微机原理 音乐播放程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
( 2016 / 2017 学年第二学期)
课程名称微机原理与接口技术
实验名称音乐播放程序设计
实验时间2017 年 6 月13 日
学院电子信息学院
指导教师严华
学生姓名学号
学院(系) 电子信息学院专业光电信息科学与工程
1、实验目的
通过编写程序控制8253和8255A芯片,实现一个简单的音乐播放程序。
2、实验原理
我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。对于歌曲的播放我们采用的是计数器/定时器8253芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。当运行程序时,扬声器便发出优美的音乐。首先要解决发声并发出相应音符声音的问题,由8253计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
3、实验内容
A.实验环境搭建
B. 编程
由于选取的乐曲音符音调幅度较大,故利用表格,算出其初值计数初值= 1193180 (8253输入频率)/ 音符频率
以下为程序代码
#include
#include
#define INIT_T2 0xb6
#define PORT_T2 0x42
#define CTRL_T 0x43
#define PORT_PB 0x61
#define DDO 4554
#define DRUI 4058
#define DMI 3616
#define DFA 3419
#define DSO 3044
#define DLA 2712
#define DXI 2415
#define DO 2281
#define RUI 2033
#define MI 1811
#define FA 1709
#define SO 1522
#define LA 1356
#define XI 1208
#define GDO 1140
#define GRUI 1015
#define GMI 905
#define GFA 854
#define GSO 761
#define GLA 678
#define GXI 604
void sing(unsigned int frq,unsigned int ms) {
unsigned char value;
union
{
unsigned int divisor;
unsigned char d[2];
}tone;
if (frq!=0)
{
tone.divisor=frq;
outportb(CTRL_T,INIT_T2);
outportb(PORT_T2,tone.d[0]);
outportb(PORT_T2,tone.d[1]);
value=inportb(PORT_PB);
outportb(PORT_PB,(value|0x03));
}
delay(ms);
outportb(PORT_PB,(value|0xfc));
}
void main()
{
sing(DSO,400);
sing(DLA,400);
sing(DO,400);
sing(RUI,400);
sing(MI,600);
sing(RUI,200);
sing(RUI,400);
sing(DO,400);
sing(DLA,1600);
sing(0,1600);
sing(DSO,400);
sing(DLA,400);
sing(DO,400);
sing(RUI,400);
sing(MI,400);
sing(SO,800);
sing(RUI,2000);
sing(0,2000);
sing(RUI,800);
sing(DSO,400);
sing(RUI,400);
sing(RUI,400);
sing(MI,400);
sing(RUI,400);
sing(DO,1600);
sing(0,2000);
sing(RUI,400);
sing(RUI,400);
sing(RUI,400);
sing(DSO,400);
sing(DLA,400);
sing(0,2000); sing(FA,800); sing(FA,400); sing(MI,400); sing(RUI,400); sing(DO,400); sing(RUI,2000); sing(0,2000); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(RUI,400); sing(DSO,400); sing(DLA,400); sing(DO,400); sing(DLA,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,2000); sing(0,2000); sing(LA,400); sing(LA,400); sing(LA,400); sing(GDO,400); sing(LA,400); sing(LA,400); sing(SO,2000); sing(0,2000); sing(SO,400); sing(SO,400); sing(SO,400); sing(SO,400); sing(LA,400); sing(GDO,400); sing(LA,2000); sing(0,800);
sing(SO,400); sing(LA,400); sing(GRUI,400); sing(GMI,2800); sing(GRUI,3200); sing(0,1600); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GRUI,200); sing(GRUI,400); sing(GDO,400); sing(LA,3200); sing(SO,400); sing(LA,400); sing(GDO,400); sing(GRUI,400); sing(GMI,600); sing(GSO,600); sing(GRUI,3600); sing(0,400);
sing(GRUI,400);