|
電子琴仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (18.77 KB, 下載次數: 52)
下載附件
2018-7-11 18:14 上傳
單片機源碼:
- /*
- 名稱:簡易電子琴設計
- 說明:本程序運行時,按下矩陣鍵盤中的按鍵,數碼管會顯示當前的按鍵值,蜂鳴器會播放對應的音符
- */
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define KeyIO P1 //矩陣鍵盤的控制IO
- sbit BEEP = P3^4; //蜂鳴器對應的控制IO
- sbit L1=P1^0;
- sbit L2=P1^1 ;
- sbit L3=P1^2 ;
- sbit L4=P1^3 ;
- uchar code string[] = {0x01,0x03,
- 0x07,0x0f,0x1f,0x3f,0x7f,0xff};
- uchar code dis[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- //各音符對應的延時
- uint code Table_Tone[] = {
- 63628,63835,64021,64103,
- 64260,64400,64524,64580};
- uchar KeyNo; //按鍵序號
- /** 延時子函數 **/
- void DelayMS(uchar time)
- {
- uchar i;
- while(time--)
- {
- for(i=0; i<120; i++);
- }
- }
- /** 矩陣鍵盤的掃描子函數 **/
- void Key_Scan(void)
- {
- uchar temp,i;
- uchar Num;
- P1=0xfe;
- for(i=0;i<=3;i++)
- {
- if(L1==0)Num=dis[i*4+0];
- if(L2==0)Num=dis[i*4+1];
- if(L3==0)Num=dis[i*4+2];
- if(L4==0)Num=dis[i*4+3];
- DelayMS(5);
- temp=P1;
- temp=temp|0x0f;
- temp=temp<<1;
- temp=temp|0x0f;
- P1=temp;
- }
- // uchar Temp, Num;
- //
- // P1 = 0x0f; //高四位置 0 ,放入四列
- //
- // DelayMS(2);
- // //按鍵按下后 00001111 將變成 0000XXXX,X 中 1 個為 0,3個仍為 1
- // Temp = KeyIO ^ 0x0f; //異或操作會把 3 個 1 變成 0,唯一的 0 變成 1
- //
- // switch(Temp)
- // {
- // case 1 : Num = 0; break;
- // case 2 : Num = 1; break;
- // case 4 : Num = 2; break;
- // case 8 : Num = 3; break;
- // default : return;
- // }
- //
- // KeyIO = 0xf0; //低四位置 0 ,放入四列
- //
- // DelayMS(2);
- // //按鍵按下后 11110000 將變成 XXXX0000,X 中 1 個為 0,3個仍為 1
- // Temp = (KeyIO >> 4) ^ 0x0f; //將高四位移至低四位,并將其中唯一的 0 變為 1,其余為 0
- //
- // switch (Temp)
- // {
- // case 1 : Num += 0; break;
- // case 2 : Num += 4; break;
- // case 4 : Num += 8; break;
- // case 8 : Num += 12; break;
- // default : return;
- // }
- // KeyNo = Num;
- }
- void led_shi()
- {
- uchar n;
- for(n=0;n<40;n++)
- {
- P0=string[KeyNo];
- P2=0x00;
- }
- }
- /** 定時器 0 中斷服務程序,不同頻率的聲音由該中斷產生 **/
- void Play_Tone() interrupt 1
- {
- TH0 = Table_Tone[KeyNo] / 256;
- TL0 = Table_Tone[KeyNo] % 256;
- BEEP = ~BEEP;
- }
- /** 主函數 **/
- void main(void)
- {
- TMOD = 0x01;
- IE = 0x82;
- while(1)
- {
- KeyIO = 0xf0; //發送掃描碼
- if (KeyIO != 0xf0) //如果有按鍵按下
- {
- Key_Scan(); //矩陣鍵盤的掃描
- led_shi();
- TR0 = 1; //啟動定時器,并發出對應的聲音
- }
- else
- {
- TR0 = 0; //停止播放聲音
- }
- DelayMS(2);
- }
- }
復制代碼
|
-
-
110.zip
2018-7-11 15:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
132.07 KB, 下載次數: 102, 下載積分: 黑幣 -5
|