资源描述
. .
实 验 报 告
( 2016 / 2017 学年 第 二 学期)
课程名称
微机原理与接口技术
实验名称
音乐播放程序设计
实验时间
2017
年
6
月
13
日
学 院
电子信息学院
指导教师
严华
学生XX
学号
学院(系)
电子信息学院
专业
光电信息科学与工程
1、 实验目的
通过编写程序控制8253和8255A芯片,实现一个简单的音乐播放程序。
2、 实验原理
我们在这次课设选择了音乐程序设计,音乐程序设计可以实现至少两首歌的可选择播放。对于歌曲的播放我们采用的是计数器/定时器8253芯片,而对于选择哪首歌播放则是利用可编程并行接口8255A芯片来实现的。
基于8253定时计数接口芯片的工作原理,本次课设实现了音乐演奏系统程序设计。当运行程序时,扬声器便发出优美的音乐。首先要解决发声并发出相应音符声音的问题,由8253计数器0在初始化时用来产生一定频率的方波来使扬声器发声,再根据不同音符对应的频率写入计数初值发出相应的音符声。对8255芯片PA0和PA1口的置0和1来控制扬声器的开关。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。
3、 实验内容
A. 实验环境搭建
B. 编程
由于选取的乐曲音符音调幅度较大,故利用表格,算出其初值
计数初值 = 1193180 (8253输入频率)/ 音符频率
以下为程序代码
#include <dos.h>
#include <stdio.h>
#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(DO,400);
sing(DLA,2000);
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);
sing(GRUI,400);
sing(SO,400);
sing(GRUI,400);
sing(GRUI,400);
sing(GMI,400);
sing(GRUI,400);
sing(GDO,3200);
sing(0,400);
sing(GRUI,400);
sing(GRUI,400);
sing(GRUI,400);
sing(SO,400);
sing(LA,400);
sing(GDO,400);
sing(LA,3600);
sing(0,1600);
sing(LA,3200);
sing(0,400);
sing(GFA,400);
sing(GFA,400);
sing(GFA,400);
sing(GMI,400);
sing(GRUI,400);
sing(GDO,400);
sing(GMI,400);
sing(GRUI,1600);
sing(0,1600);
sing(0,400);
sing(GFA,400);
sing(GFA,400);
sing(GLA,400);
sing(GSO,400);
sing(GFA,400);
sing(GMI,400);
sing(GRUI,2000);
sing(0,2000);
sing(GRUI,400);
sing(GRUI,400);
sing(SO,400);
sing(GRUI,400);
sing(GRUI,400);
sing(GMI,400);
sing(GRUI,400);
sing(GDO,1600);
sing(0,2000);
sing(GRUI,400);
sing(GRUI,400);
sing(GRUI,400);
sing(SO,400);
sing(LA,400);
sing(GDO,400);
sing(LA,3600);
}
运行结果如下
4、实验中遇到的问题
一开始程序中的#define DDO 4554语句为#define 1DO 4554,程序运行时显示编译出错,我意识到1DO有可能不符合宏名定义要求,通过查阅有关资料后发现,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线,随后修改了程序。
5、总结体会
通过本实验的学习,我对8253和8255A芯片有了进一步的认识和理解,并能编写程序控制这两种芯片,实现简单的音乐播放程序。在这次实验中,发现了拥有扎实基础功的重要性,以及在实验过程中发现了自己的不足之处,深刻理解了实践与理论相结合的重要性。
附件(乐曲简谱)
. .word..
展开阅读全文