基于51單片機的電子琴課設
0.png (32.89 KB, 下載次數: 70)
下載附件
2017-3-3 21:49 上傳
0.png (62.05 KB, 下載次數: 50)
下載附件
2017-3-3 21:48 上傳
下載:
電子琴.zip
(16.84 KB, 下載次數: 41)
2017-3-3 15:41 上傳
點擊文件名下載附件
電子琴課設 下載積分: 黑幣 -5
- #include <AT89X51.H>
- unsigned char temp;
- unsigned char key;
- unsigned char i,j;
- unsigned char STH0;
- unsigned char STL0;
- unsigned int code tab[]= //音符表
- {64021,64103,64260,64400,
- 64524,64580,64684,64777,
- 64820,64898,64968,65030,
- 65058,65110,65157,65178};
- void main(void){ //主程序
- TMOD=0x01;
- ET0=1;
- EA=1;
- while(1){
- P3=0xff;
- P3_4=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f) { //從第一行開始掃描鍵盤
- for(i=50;i>0;i--) //延時,反彈跳
- for(j=200;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- switch(temp){ //讀取按鍵值
- case 0x0e:
- key=0;
- break;
- case 0x0d:
- key=1;
- break;
- case 0x0b:
- key=2;
- break;
- case 0x07:
- key=3;
- break;
- }
- temp=P3;
- P1_0=~P1_0;
- STH0=tab[key]/256; //計算音符對應的定時器計數值
- STL0=tab[key]%256;
- TR0=1;
- temp=temp & 0x0f;
- while(temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- }
- TR0=0;
- }
- }
- P3=0xff;
- P3_5=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){ //掃描鍵盤第二行
- for(i=50;i>0;i--)
- for(j=200;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- switch(temp){
- case 0x0e:
- key=4;
- break;
- case 0x0d:
- key=5;
- break;
- case 0x0b:
- key=6;
- break;
- case 0x07:
- key=7;
- break;
- }
- temp=P3;
- P1_0=~P1_0;
- STH0=tab[key]/256;
- STL0=tab[key]%256;
- TR0=1;
- temp=temp & 0x0f;
- while(temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- }
- TR0=0;
- }
- }
- P3=0xff;
- P3_6=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){ //掃描鍵盤第三行
- for(i=50;i>0;i--)
- for(j=200;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- switch(temp){
- case 0x0e:
- key=8;
- break;
- case 0x0d:
- key=9;
- break;
- case 0x0b:
- key=10;
- break;
- case 0x07:
- key=11;
- break;
- }
- temp=P3;
- P1_0=~P1_0;
- STH0=tab[key]/256;
- STL0=tab[key]%256;
- TR0=1;
- temp=temp & 0x0f;
- while(temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- }
- TR0=0;
- }
- }
- P3=0xff;
- P3_7=0;
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){ //掃描鍵盤第四行
- for(i=50;i>0;i--)
- for(j=200;j>0;j--);
- temp=P3;
- temp=temp & 0x0f;
- if (temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- switch(temp){
- case 0x0e:
- key=12;
- break;
- case 0x0d:
- key=13;
- break;
- case 0x0b:
- key=14;
- break;
- case 0x07:
- key=15;
- break;
- }
- temp=P3;
- P1_0=~P1_0;
- STH0=tab[key]/256;
- STL0=tab[key]%256;
- TR0=1;
- temp=temp & 0x0f;
- while(temp!=0x0f){
- temp=P3;
- temp=temp & 0x0f;
- }
- TR0=0;
- }
- }
- }
- }
- void t0(void) interrupt 1 using 0 { //定時器T0中斷服務函數
- TH0=STH0;
- TL0=STL0;
- P1_0=~P1_0; //產生方波
- }
復制代碼
|