|
|
作為保存吧
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include "stc15f2k60s2.h" //調(diào)系統(tǒng)頭文件
- #define Display P0 //定義數(shù)碼管顯示端
- #define Speak P24 //定義蜂鳴器接口
- #define uint unsigned int
- #define uchar unsigned char
- unsigned char sth,stl; //定義全局變量 sth stl
- unsigned int i,j; //定義循環(huán)變量i j
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定義數(shù)碼管顯示 0-9,A-F
-
- unsigned char code Music_Code[]={ //八個(gè)音符 do re mi fa so la si 高音do
- 0xf8,0x8b,0xf9,0x5b,0xfa,0x14,0xfa,0x66,
- 0xfb,0x03,0xfb,0x8f,0xfc,0x0b,0xfd,0xee};
- void delay_ms(unsigned int time) //毫秒延時(shí)函數(shù)
- {
- uint z;
- uchar x,y;
- for(z=0;z<time;z++)
- for(x=5;x>0;x--)
- for(y=97;y>0;y--);
- }
- void Time0_Init() //定時(shí)器T0初始化函數(shù)
- {
- TMOD=0x01; //工作方式1
- TH0=sth; //定時(shí)器高八位賦初值
- TL0=stl; //定時(shí)器低八位賦初值
- ET0=1; //使能T0中斷
- EA=1; //打開(kāi)全局中斷
- TR0=0; //關(guān)閉定時(shí)器T0
- }
- void main() //主函數(shù)入口
- {
- Time0_Init(); //定時(shí)器T0初始化
- P2=0x00;
- Speak=1; //蜂鳴器端口置1 停止工作。
- while(1) //無(wú)限循環(huán)
- {
- switch(P1) //switch語(yǔ)句判斷檢測(cè) P1按鍵狀態(tài)
- {
- case 0xfe: //P1=0xfe "do"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xfe) //再判斷"do"按鍵是否按下
- {
- Display=table[1]; //數(shù)碼管顯示"1"
- i=0; //i置0
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "do"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "do"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xfe) continue; //"do"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1 停止工作。 TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xfe); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xfe) continue;
- else break; //確定松開(kāi),退出
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- }
- break; //返回
- case 0xfd: //P1=0xfd "re"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xfd) //再判斷"re"按鍵是否按下
- {
- Display=table[2]; //數(shù)碼管顯示"2"
- i=1; //i置1
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "re"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "re"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xfd) continue; //"re"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1停止工作。 TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xfd); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xfd) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
- case 0xfb: // "mi"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xef) //再判斷"mi"按鍵是否按下
- {
- Display=table[3]; //數(shù)碼管顯示"3"
- i=2; //i置2
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "mi"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "mi"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xef) continue; //"mi"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1,停止工作。
- TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xef); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xef) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
-
- case 0xf7: //"fa"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xf7) //再判斷"fa"按鍵是否按下
- {
- Display=table[4]; //數(shù)碼管顯示"4"
- i=3; //i置3
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "fa"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "fa"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xf7) continue; //"fa"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1停止工作。 TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xf7); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xf7) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
- case 0xef: //"so"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xef) //再判斷"so"按鍵是否按下
- {
- Display=table[5]; //數(shù)碼管顯示"5"
- i=4; //i置4
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "so"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "so"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xef) continue; //"so"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1 停止工作。 TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xef); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xef) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
- case 0xdf: //"la"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xdf) //再判斷"la"按鍵是否按下
- {
- Display=table[6]; //數(shù)碼管顯示"6"
- i=5; //i置5
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "la"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "la"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xdf) continue; //"la"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1停止工作。
- TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xdf); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xdf) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
- case 0xbf: //"si"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0xbf) //再判斷"si"按鍵是否按下
- {
- Display=table[7]; //數(shù)碼管顯示"7"
- i=6; //i置6
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "si"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "si"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- delay_ms(10); //延時(shí)一下
- if(P1==0xbf) continue; //"si"按鍵按下,跳出(繼續(xù)發(fā)音)
- else break; //松開(kāi)了,則返回
- }
- Display=0x00; //關(guān)閉數(shù)碼管顯示
- Speak=1; //蜂鳴器端口置1停止工作。 TR0=0; //關(guān)閉定時(shí)器T0
- for(;;)
- {
- while(P1==0xbf); //等待按鍵松開(kāi)
- delay_ms(10); //延時(shí)去抖
- if(P1==0xbf) continue;
- else break; //確定松開(kāi),退出
- }
- }
- TR0=0; //關(guān)閉定時(shí)器T0
- break; //返回
- case 0x7f: //"高音do"按鍵按下
- delay_ms(10); //延時(shí)去抖
- if(P1==0x7f) //再判斷"高音do"按鍵是否按下
- {
- Display=0x86; //數(shù)碼管顯示"1"帶小數(shù)點(diǎn)(1.)
- i=7; //i置7
- TR0=0; //關(guān)閉定時(shí)器T0
- sth=Music_Code[2*i]; //定時(shí)器高八位賦值 "高音do"
- stl=Music_Code[2*i+1]; //定時(shí)器低八位賦值 "高音do"
- TR0=1; //啟動(dòng)定時(shí)器T0
- for(j=0;j<=1000;j++) //軟件延時(shí),在一定時(shí)間里檢測(cè)
- {
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
111.rar
(71.71 KB, 下載次數(shù): 96)
2018-5-28 23:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|