51单片机-播放天空之城
生活随笔
收集整理的這篇文章主要介紹了
51单片机-播放天空之城
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include ? //包含51單片機寄存器定義的頭文件 sbit sound=P3^7; ? ?//將sound位定義為P3.7 unsigned int C; ? ? //儲存定時器的定時常數 //以下是C調低音的音頻宏定義 #define L1 ?262 ? ?//將"L1"宏定義為低音"1"的頻率262Hz 時間是1/262=3826/2 us ?取半周期 #define L2 ?286 ? ?//將"L2"宏定義為低音"2"的頻率286Hz #define L3 ?311 ? ?//將"L3"宏定義為低音"3"的頻率311Hz #define L4 ?349 ? ?//將"L4"宏定義為低音"4"的頻率349Hz #define L5 ?392 ? ?//將"L5"宏定義為低音"5"的頻率392Hz #define L6 ?440 ? ?//將"l_a"宏定義為低音"6"的頻率440Hz #define L7 ?494 ? ?//將"L7"宏定義為低音"7"的頻率494Hz //以下是C調中音的音頻宏定義 #define Z1 ? ?523 ? ? //將"Z1"宏定義為中音"1"的頻率523Hz #define Z2 ? ?587 ? ? //將"Z2"宏定義為中音"2"的頻率587Hz #define Z3 ?659 ? ? //將"Z3"宏定義為中音"3"的頻率659Hz #define Z4 ? ?698 ? ? //將"Z4"宏定義為中音"4"的頻率698Hz #define Z5 ? ?784 ? ? //將"Z5"宏定義為中音"5"的頻率784Hz #define Z6 ? ?880 ? ? //將"Z6"宏定義為中音"6"的頻率880Hz #define Z7 ? ?987 ? ? //將"Z7"宏定義為中音"7"的頻率523H ? ? ? //以下是C調高音的音頻宏定義 #define H1 ?1046 ? ?//將"H1"宏定義為高音"1"的頻率1046Hz #define H2 ?1174 ? ?//將"H2"宏定義為高音"2"的頻率1174Hz #define H3 ?1318 ? ?//將"H3"宏定義為高音"3"的頻率1318Hz #define H4 ?1396 ? ?//將"H4"宏定義為高音"4"的頻率1396Hz #define H5 ?1567 ? ?//將"H5"宏定義為高音"5"的頻率1567Hz #define H6 ?1760 ? ?//將"H6"宏定義為高音"6"的頻率1760Hz #define H7 ?1975 ? ?//將"H7"宏定義為高音"7"的頻率1975Hz void delay() ? ? ? ? ? ? ?? ?{ ? ?unsigned char i,j; for(i=0;i<100;i++) ?for(j=0;j<250;j++) ? ; ?} void main(void) { unsigned char i,j; ? ? //以下是《天空之城》簡譜 //每行對應一小節音符 ?unsigned ?int code f[]={ ? ? ?Z6,Z7,H1,Z7,H1,H3,Z7,Z3,Z3, ? Z6,Z5,Z6,H1,Z5,Z3,Z3, ? Z4,Z3,Z4,H1,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Z3,H1,H1,H1,Z7,Z4,Z4,Z7,Z7,Z6,Z7, ? H1,Z7,H1,H3,Z7,Z3,Z3, ? Z6,Z5,Z6,H1, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Z5, ? ? ?Z3,Z4,H1,Z7,H1,H2,H2,H2,H1,H1,Z6,Z7,Z5,Z6,H1,H2, ? H3,H2,H3,H5, ? ? ? ? ?H2,Z5,Z5, ? H1,Z7,H1,H3,H3, ? ? ? ? Z6,H1,Z7,H2,H1,Z5,Z5, ? H4,H3,H2,H1, ? ? ? ? ?H3, ? ? ? ? Z3,H3, ? ? ?H6,H5,H5, ? H3,H2,H1,H1,H2,H1,H2,H5,H3,H3, ? ? ? ? ?H6,H5, ? ? ?H3,H2,H1,H1,H2,H1,H2,Z7,Z6,Z6,Z7, ? Z6, ? ? ?? 0xff}; //以0xff作為音符的結束標志 //以下是簡譜中每個音符的節拍 //"4"對應4個延時單位,"2"對應2個延時單位,"1"對應1個延時單位? unsigned char code JP[ ]={ ? ? ? ? ? ?4,4, ?12,4,8,8, ? 20,4,4, ? ? 12,4,8,8, ? 20,4,4, ? ? 12,4,4,12, 20,4,4,4, ? 12,4,8,8, ? 20,4,4, ? ? 12,4,8,8, ? 20,4,4, ? ? 12,4,8,8, 32, ? ? ?4, 8,4,6,8, ? ?4,4,4,16, ? 8,4,6,8, ? ?24,4,4, ? ? 12,4,8,8, 24,4,4, ? ? 4,4,8,8, ? ?32, 4,8,8,6, ? ?12,4,16, ? ?8,8,8,8, 30, ? ? ? ? 20,8, ? ? ? 16,8,8, ? ? 4,4,16,8, ? 8,4,4,8, ? ?20,8, 16,16, ? ? ?4,20,8, ? ? 8,4,4,8, ? ?20,4,4, ? ? 32, }; EA=1; ? ? ? ? //開總中斷 ET0=1; ? ? ? ?//定時器T0中斷允許 ? ? ?TMOD=0x00; ? ?// 使用定時器T0的模式1(13位計數器) while(1) ? ? ? //無限循環 { i=0; ? //從第1個音符f[0]開始播放 ? ?while(f[i]!=0xff) ? ? ? ? ? ?//只要沒有讀到結束標志就繼續播放 { ? ? ? ? ? ? C=460830/f[i]; ? // ? ? ? ? ? ? TH0=(8192-C)/32; ? //可證明這是13位計數器TH0高8位的賦初值方法 ? 5 ? ? ? ? ? ? TL0=(8192-C)2; ? //可證明這是13位計數器TL0低5位的賦初值方法 ? ? ? ? ? ? TR0=1; ? ? ? ? ? ? //啟動定時器T0 for(j=0;j ? ? ? ? ? ? ? ? delay(); ? ? ? ? ?//延時1個節拍單位 TR0=0; ? ? ? ? ? ? ? //關閉定時器T0 ? i++; ? ? ? ? ? ? ? ? //播放下一個音符 } ?? sound=0; } }? void Time0(void ) interrupt 1 using 1 ? { ? sound=!sound; ? ? ?//將P3.7引腳輸出電平取反,形成方波 ? ? TH0=(8192-C)/32; ? //可證明這是13位計數器TH0高8位的賦初值方法 ? TL0=(8192-C)2; ? //可證明這是13位計數器TL0低5位的賦初值方法? }
總結
以上是生活随笔為你收集整理的51单片机-播放天空之城的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速改变文件hash值的方法
- 下一篇: python编程豆瓣自动回复_微信还不会