《《音樂程序編制》PPT課件.ppt》由會員分享,可在線閱讀,更多相關《《音樂程序編制》PPT課件.ppt(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 8255并 行 接 口 B口( 端 口 地 址 0 x61) 音 樂 程 序 設 計1.PC機 的 揚 聲 器 驅(qū) 動 系 統(tǒng) 與 門8254的 2號定 時 器7 6 5 4 3 2 1 0 1.193MHz輸 入 脈 沖11 18255并 行 接 口 B口 的 第 0 位 為 1時 , 定 時 器 開 始 工 作 , 產(chǎn) 生 音 頻 信 號 。8255并 行 接 口 B口 的 第 1 位 為 1時 , 與 門 打 開 , 音 頻 信 號 送 到 揚 聲 器 。 控 制 揚 聲 器 發(fā) 聲 8254是 可 編 程 的 定 時 器 , 有 0號 、 1號 、 2號 共 3個 可 獨立 編 程
2、的 16位 定 時 器 , 還 有 一 個 控 制 字 寄 存 器 。 2號 定 時 器 工 作 在 方 波 頻 率 發(fā) 生 器 方 式 , 即 輸 出 方 波 信 號 。輸 出 方 波 的 頻 率 為 : 1193180Hz / 計 數(shù) 初 值 。 向 2號 定 時 器 寫 入 不 同 的 計 數(shù) 初 值 , 可 控 制 輸 出 方 波 的 頻 率 ???制 字 寄 存 器 的 I/O端 口 地 址 是 0 x430號 定 時 器 的 I/O端 口 地 址 是 0 x401號 定 時 器 的 I/O端 口 地 址 是 0 x412號 定 時 器 的 I/O端 口 地 址 是 0 x42計 數(shù)
3、 初 值 是 16位 的 , 要 分 兩 次 寫 入 2號 定 時 器 , 先 寫 低 8位 , 再 寫 高 8位 。 8位端口輸入函數(shù) inportb( )函 數(shù) 原 型 :unsigned char inportb(int portid);功 能 : 從 地 址 為 portid 的 8位 端 口 輸 入 一 個 字 節(jié) ( 8位 ) , 所 讀 的 值 是 該 函 數(shù) 的 返 回 值 , 由 頭 文 件 dos.h 說 明 。用 法 : #include unsigned char b; b = inportb(端 口 地 址 ) ; 8位端口輸出函數(shù) outportb( )函數(shù)原型:v
4、oid outportb(int portid ,unsigned char value);功 能 : 向 地 址 為 portid 的 8位 端 口 輸 出 一 個 字 節(jié)( 8位 ) , 其 值 為 value, 由 頭 文 件 dos.h 說 明 。用 法 : #include outportb(端 口 地 址 ,無 符 號 字 符 型 數(shù) 據(jù) 或 變 量 ) ; 音 符 的 定 義 音 頻 信 號 的 頻 率 范 圍 是 202000Hz, 音 樂 中 使 用 的 頻 率 一般 為 1311976Hz , 包 括 中 央 C調(diào) 及 其 前 后 的 4個 八 度 的 音 程 。音 符 與
5、 頻 率 的 關 系 如 下 表 所 示 。音 符 頻 率 音 符 頻 率 音 符 頻 率 音 符 頻 率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 音 長 的 定 義音 長 即 一 個 音 符 持 續(xù) 的 時 間 。N1 表 示 全 音 符N2 表 示 半 音 符N4 表 示 4分 音 符N8 表 示
6、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第 一 小 節(jié) :D0,N4+N8 , E0,N16 , D0,N16 , C0,N4+N8 , A0,N8第 二 小 節(jié) :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 #defi
7、ne 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,
8、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,C
9、0,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
10、(0 x43,0 xb6); /*初 始 化 2號 定 時 器 */ fre=(unsigned)(1193180L/fre); /*計 算 計 數(shù) 初 值 */ outportb(0 x42,(char)fre); /*先 寫 計 數(shù) 初 值 的 低 8位 */ outportb(0 x42,(char)(fre8); /*再 寫 計 數(shù) 初 值 的 高 8位 */ control=inportb(0 x61); /*讀 0 x61的 狀 態(tài) */ outportb(0 x61,control|0 x03); /*將 第 0位 , 第 1位 置 1, 使 喇 叭 發(fā) 聲 */ goal=(clock_t)dur+clock( ); while(goalclock( ); if(dur) outportb(0 x61,control);note+=2; 思 考 題 : 1.clock()函 數(shù) 的 數(shù) 據(jù) 類 型 是 什 么 ? 有 無 返 回 值 ? 2.提 高 八 度 或 降 低 八 度 可 采 用 什 么 辦 法 ? 3.解 釋 下 面 語 句 的 語 法 和 作 用 ? typedef enum NOTES SONG ; 4. clock_t 是 什 么 ?