资源描述
8255并 行 接 口 B口( 端 口 地 址 0 x61) 音 乐 程 序 设 计1.PC机 的 扬 声 器 驱 动 系 统 与 门8254的 2号定 时 器7 6 5 4 3 2 1 0 1.193MHz输 入 脉 冲11 18255并 行 接 口 B口 的 第 0 位 为 1时 , 定 时 器 开 始 工 作 , 产 生 音 频 信 号 。8255并 行 接 口 B口 的 第 1 位 为 1时 , 与 门 打 开 , 音 频 信 号 送 到 扬 声 器 。 控 制 扬 声 器 发 声 8254是 可 编 程 的 定 时 器 , 有 0号 、 1号 、 2号 共 3个 可 独立 编 程 的 16位 定 时 器 , 还 有 一 个 控 制 字 寄 存 器 。 2号 定 时 器 工 作 在 方 波 频 率 发 生 器 方 式 , 即 输 出 方 波 信 号 。输 出 方 波 的 频 率 为 : 1193180Hz / 计 数 初 值 。 向 2号 定 时 器 写 入 不 同 的 计 数 初 值 , 可 控 制 输 出 方 波 的 频 率 。控 制 字 寄 存 器 的 I/O端 口 地 址 是 0 x430号 定 时 器 的 I/O端 口 地 址 是 0 x401号 定 时 器 的 I/O端 口 地 址 是 0 x412号 定 时 器 的 I/O端 口 地 址 是 0 x42计 数 初 值 是 16位 的 , 要 分 两 次 写 入 2号 定 时 器 , 先 写 低 8位 , 再 写 高 8位 。 8位端口输入函数 inportb( )函 数 原 型 :unsigned char inportb(int portid);功 能 : 从 地 址 为 portid 的 8位 端 口 输 入 一 个 字 节 ( 8位 ) , 所 读 的 值 是 该 函 数 的 返 回 值 , 由 头 文 件 dos.h 说 明 。用 法 : #include unsigned char b; b = inportb(端 口 地 址 ) ; 8位端口输出函数 outportb( )函数原型:void outportb(int portid ,unsigned char value);功 能 : 向 地 址 为 portid 的 8位 端 口 输 出 一 个 字 节( 8位 ) , 其 值 为 value, 由 头 文 件 dos.h 说 明 。用 法 : #include outportb(端 口 地 址 ,无 符 号 字 符 型 数 据 或 变 量 ) ; 音 符 的 定 义 音 频 信 号 的 频 率 范 围 是 202000Hz, 音 乐 中 使 用 的 频 率 一般 为 1311976Hz , 包 括 中 央 C调 及 其 前 后 的 4个 八 度 的 音 程 。音 符 与 频 率 的 关 系 如 下 表 所 示 。音 符 频 率 音 符 频 率 音 符 频 率 音 符 频 率C 131 C 262 C 523 C 1047D 147 D 294 D 587 D 1175E 165 E 330 E 659 E 1319F 175 F 349 F 698 F 1397G 196 G 392 G 784 G 1568A 220 A 440 A 880 A 1760B 247 B 494 B 988 B 1976 音 长 的 定 义音 长 即 一 个 音 符 持 续 的 时 间 。N1 表 示 全 音 符N2 表 示 半 音 符N4 表 示 4分 音 符N8 表 示 8分 音 符N16 表 示 16分 音 符 用 C语 言 定 义 音 乐2. 32 1 . 6 |5 35 6 .1|1 2 3 4 5 6 7 C0 D0 E0 F0 G0 A0 B0第 一 小 节 :D0,N4+N8 , E0,N16 , D0,N16 , C0,N4+N8 , A0,N8第 二 小 节 :G0,N4 , E0,N8 , G0,N8, A0,N4+N8 , C0,N8 源 程 序#include #include #include #include #include #include #define N1 64#define N2 32#define N4 16 #define N8 8#define N16 4#define END 0 enum NOTESC10=131,D10=147,E10=165,F10=175,G10=196,A10=220,B10=247,C0=262,D0=296,E0=330,F0=349,G0=392,A0=440,B0=494,C1=523,D1=587,E1=659,F1=698,G1=784,A1=880,B1=988,C2=1047,D2=1175,E2=1319,F2=1397,G2=1568,A2=1760,B2=1976;typedef enum NOTES SONG;SONG song=D0,N4,E0,N8,D0,N8,C0,N4,A10,N4,G10,N8,E10,N8, G10,N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,G10,N8,A0,N8, E0,N8,G0,N8,D0,N2,E0,N4,D0,N8,E0,N8,G0,N4,E0,N4,G0,N8, E10,N8,G10,N8,A10,N8,C0,N2,A10,N4,A10,N8,C0,N8,A10,N8, A10,N8,D10,N8,E10,N8,G10,N2,D0,N4,D0,N4,G0,N4,A0,N8, G0,N8,F0,N2,G0,N2,A0,N4,G0,N8,E0,N8,D0,N8,E0,N8,C0,N8, A10,N8,D0,N2,E0,N4,G0,N8,E0,N8,G0,N4,E0,N4,G10,N8,E10,N8, G10,N8,A10,N8,C0,N4,A10,N4,A10,N8,C0,N8,D0,N8,A10,N8, C0,N8,E0,N8,D0,N1,END,END; main()int note=0, fre , dur , control;clock_t goal;while(songnote!=END) fre=songnote; dur=songnote+1; if(kbhit() break; if(fre) /*若 频 率 值 fre非 0*/ outportb(0 x43,0 xb6); /*初 始 化 2号 定 时 器 */ fre=(unsigned)(1193180L/fre); /*计 算 计 数 初 值 */ outportb(0 x42,(char)fre); /*先 写 计 数 初 值 的 低 8位 */ outportb(0 x42,(char)(fre8); /*再 写 计 数 初 值 的 高 8位 */ control=inportb(0 x61); /*读 0 x61的 状 态 */ outportb(0 x61,control|0 x03); /*将 第 0位 , 第 1位 置 1, 使 喇 叭 发 声 */ goal=(clock_t)dur+clock( ); while(goalclock( ); if(dur) outportb(0 x61,control);note+=2; 思 考 题 : 1.clock()函 数 的 数 据 类 型 是 什 么 ? 有 无 返 回 值 ? 2.提 高 八 度 或 降 低 八 度 可 采 用 什 么 办 法 ? 3.解 释 下 面 语 句 的 语 法 和 作 用 ? typedef enum NOTES SONG ; 4. clock_t 是 什 么 ?
展开阅读全文