|
51 電子琴程序代碼 姬家寨電子科技實驗室 程序編程:姬學瑞 版權所有,侵權必究!
- #include <REGX51.H>
- #define FOSC 12000000
- //=================================================================================================
- //--- 音階頻率表 ---
- unsigned int code JINJIEFREQ[] =
- {
- 262,294,330,349,392,440,494,
- 523,587,659,699,784,880,988,
- 1046,1175,1319,1391,1568,1760,1976,
- };
- //sfr P4 = 0xC0;
- //sfr P5 = 0xC8;
- //sbit P5_5 = P5^5;
- #define SPK P3_7//P5_5
- bit RunFlag = 0;
- unsigned char STH0,STL0;
- //sfr AUXR = 0x8E;
- #define T0FENPING 12
- //=================================================================================================
- //--- 定時器T0溢出中斷服務程序 ---
- void T0_ISR(void) interrupt 1
- {
- if(1 == RunFlag) //--- 在音階播放標志為1情況下 ---
- {
- TH0 = STH0; //--- 重新裝初值 ---
- TL0 = STL0;
- SPK = ~SPK; //--- P5.5引腳上的電平翻轉 ---
- }
- }
- //=================================================================================================
- //--- main()主程序 ---
- void main(void)
- {
- unsigned int i;
- unsigned char j;
-
- // AUXR |= 0x80; //--- 使能T0的計數器時鐘分頻值為1 ---
- TMOD = 0x01; //--- 配置T0為定時模式,工作于方式2 ---
- ET0 = 1; //--- 使能T0中斷 ---
- TR0 = 1;
- EA = 1; //--- CPU開中斷 ---
- while(1)
- {
- for(j=0;j<7;j++)
- {
- if(0 == (P1 & (1 << j))) //--- 判斷低音部分是否有鍵按下 ---
- {
- for(i=0;i<2000;i++); //--- 去按鍵抖動 ---
- if(0 == (P1 & (1 << j))) //--- 再判斷低音部分是否真得有鍵按下 ---
- { //--- 根據表計算低音音階頻率的定時器T0的初值 ---
- STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) / 256;
- STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j]) % 256;
- TH0 = STH0; //--- 裝入TH0,TL0的計數寄存器 ---
- TL0 = STL0;
- RunFlag = 1; //--- 置音階播放標志為1 ---
- }
- while(0 == (P1 & (1 << j))); //--- 等待按鍵釋放 ---
- RunFlag = 0; //--- 清音階播放標志 ---
- SPK = 1;
- }
- if(0 == (P3 & (1 << j))) //--- 判斷中音部分是否有鍵按下 ---
- {
- for(i=0;i<2000;i++); //--- 去按鍵抖動 ---
- if(0 == (P3 & (1 << j))) //--- 再判斷中音部分是否真得有鍵按下 ---
- { //--- 根據表計算中音音階頻率的定時器T0的初值 ---
- STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) / 256;
- STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 7]) % 256;
- TH0 = STH0; //--- 裝入TH0,TL0的計數寄存器 ---
- TL0 = STL0;
- RunFlag = 1; //--- 置音階播放標志為1 ---
- }
- while(0 == (P3 & (1 << j))); //--- 等待按鍵釋放 ---
- RunFlag = 0; //--- 清音階播放標志 ---
- SPK = 1;
- }
- if(0 == (P2 & (1 << j))) //--- 判斷高音部分是否有鍵按下 ---
- {
- for(i=0;i<2000;i++); //--- 去按鍵抖動 ---
- if(0 == (P2 & (1 << j))) //--- 再判斷高音部分是否真得有鍵按下 ---
- { //--- 根據表計算高音音階頻率的定時器T0的初值 ---
- STH0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) / 256;
- STL0 = (65536 - FOSC / T0FENPING / 2 / JINJIEFREQ[j + 14]) % 256;
- TH0 = STH0; //--- 裝入TH0,TL0的計數寄存器 ---
- TL0 = STL0;
- RunFlag = 1; //--- 置音階播放標志為1 ---
- }
- while(0 == (P2 & (1 << j))); //--- 等待按鍵釋放 ---
- RunFlag = 0; //--- 清音階播放標志 ---
- SPK = 1;
- }
- }
- }
- }
復制代碼
|
|