Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (28.93 KB, 下載次數(shù): 72)
下載附件
2021-9-10 20:08 上傳
51hei.png (50.07 KB, 下載次數(shù): 66)
下載附件
2021-9-10 20:09 上傳
制作出來的實(shí)物圖如下:
1.jpg (431.32 KB, 下載次數(shù): 56)
下載附件
2021-9-10 11:08 上傳
ea7a626146ac2f4a18c6f00e8522def.jpg (151.99 KB, 下載次數(shù): 58)
下載附件
2021-9-10 11:08 上傳
b3c87686666eff537e3400b76d6664a.jpg (118.17 KB, 下載次數(shù): 71)
下載附件
2021-9-10 11:07 上傳
2.jpg (352.77 KB, 下載次數(shù): 75)
下載附件
2021-9-10 11:07 上傳
單片機(jī)源程序如下:
- /************************************************************************
- *硬件連接:二十二個微動開關(guān),一個蜂鳴器,二十一個彈奏鍵,一個功能切換。 *
- *功 能:電子琴彈奏,按鍵切換播放。 *
- 彈奏模式切換,添加歌曲。 *
- *添加LED燈模式。 *
- *LED燈狀態(tài)調(diào)試。 *
- ************************************************************************/
- #include<reg51.h>
- sbit QH=P2^7; //P2^7口定義為切換功能
- sbit BUZZ=P1^7; //P1^7口定義為蜂鳴器
- unsigned int H,L; //定時器0緩沖變量
- unsigned char k=0x00; //按鍵標(biāo)志位
- void init(void) //初始化程序
- {
- P0=P1=P2=P3=0xff; //初始化P0,P1,P2,P3口將他們的初值全為1
- BUZZ=1; //初始化蜂鳴器鳴器
- QH=1; //初始按鍵為1關(guān)閉狀態(tài)
- ET0=1; //初始化開定時計(jì)數(shù)器0中斷
- EA=1; //初始化開總中斷
- TMOD=0x01; //設(shè)計(jì)定時計(jì)數(shù)器timer 0工作方式為1
- }
- void delayms(unsigned int i) //延時1ms程序 用來按鍵消抖
- {
- unsigned int j;
- while(i--)
- for(j=600;j>0;j--);
- }
- void delay(unsigned int i) //按鍵延時程序 用來掃描按鍵 算音長值
- {
- unsigned int j;
- while(i--)
- {
- for(j=600;j>0;j--);
- if(!QH) //判斷在唱歌模式是否摁下模式轉(zhuǎn)換按鈕
- delayms(10);
- if(!QH)
- {
- k=~k; //如果按下改變標(biāo)志位的值。
- }
- while(!QH);
- }
- }
- void tanzou(void) //彈奏模式
- {
- unsigned int tone[]={262,294,330,349,392,440,494}; //低音
- unsigned int tone1[]={523,587,659,698,784,880,988}; //中音
- unsigned int tone2[]={1046,1175,1318,1397,1568,1760,1976};//高音
- unsigned int a=0,b=0,c=0; //定義a,b,c三個變量。
- switch(~P1) //高音7鍵判斷鍵值符合符合鍵值跳出判斷
- { case 0x00:a=0;break;
- case 0x01:a=1;P0=~0x01;break; //按下按鈕對應(yīng)的燈亮
- case 0x02:a=2;P0=~0x02;break; //因?yàn)椴还苁侵懈叩鸵舳加型瑯拥囊簦晕覀儼严嗤囊舴旁谝粋燈上。
- case 0x04:a=3;P0=~0x04;break;
- case 0x08:a=4;P0=~0x08;break;
- case 0x10:a=5;P0=~0x10;break;
- case 0x20:a=6;P0=~0x20;break;
- case 0x40:a=7;P0=~0x40;break;
- }
- if(a!=0) // 判斷鍵值
- {
- H=(65536-1000000/tone[a-1]/2)/256; // 取值,取對應(yīng)數(shù)組中的音值。
- L=(65536-1000000/tone[a-1]/2)%256;
- TH0=H;
- TL0=L; //定時計(jì)數(shù)器0賦值
- TR0=1; //開定時計(jì)數(shù)器0
- while(P1!=0xff); //判斷按鍵是否彈起
- TR0=0; //關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- else
- {
- TR0=0; //沒有任何按鍵按下關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7) //如果沒有按鍵按下那么P0口為全1
- {
- P0=0xff;
- }
- switch(~P2) //中音7鍵
- { case 0x00:b=0;break;
- case 0x01:b=1;P0=~0x01;break;
- case 0x02:b=2;P0=~0x02;break;
- case 0x04:b=3;P0=~0x04;break;
- case 0x08:b=4;P0=~0x08;break;
- case 0x10:b=5;P0=~0x10;break;
- case 0x20:b=6;P0=~0x20;break;
- case 0x40:b=7;P0=~0x40;break;
- }
- if(b!=0) // 中音7鍵判斷鍵值符合符合鍵值跳出判斷
- {
- H=(65536-1000000/tone1[b-1]/2)/256; // 取值,取對應(yīng)數(shù)組中的音值。
- L=(65536-1000000/tone1[b-1]/2)%256;
- TH0=H;
- TL0=L; //定時計(jì)數(shù)器0賦值
- TR0=1; //開定時計(jì)數(shù)器0
- while(P2!=0xff); //判斷按鍵是否彈起 出入不等于全一那么持續(xù)響按下的音
- TR0=0; //沒有任何鍵按下關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- else
- {
- TR0=0; //關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7)
- {
- P0=0xff;
- }
- switch(~P3) //低音7鍵判斷鍵值符合符合鍵值跳出判斷
- {
- case 0x00:c=0;break;
- case 0x01:c=1;P0=~0x01;break;
- case 0x02:c=2;P0=~0x02;break;
- case 0x04:c=3;P0=~0x04;break;
- case 0x08:c=4;P0=~0x08;break;
- case 0x10:c=5;P0=~0x10;break;
- case 0x20:c=6;P0=~0x20;break;
- case 0x40:c=7;P0=~0x40;break;
- }
- if(c!=0)
- {
- H=(65536-1000000/tone2[c-1]/2)/256; // 取值,取對應(yīng)數(shù)組中的音值
- L=(65536-1000000/tone2[c-1]/2)%256;
- TH0=H;
- TL0=L;
- TR0=1;
- while(P3!=0xff); //判斷按鍵是否彈起
- TR0=0; //關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- else
- {
- TR0=0; //沒有任何按鍵按下關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- }
- if(a!=1||a!=2||a!=3||a!=4||a!=5||a!=6||a!=7)
- {
- P0=0xff;
- }
- }
- void bofang(void) //播放模式
- {
- unsigned int i=0; //定義i=0
- //播放的音調(diào)
- unsigned int code tone[]={ 523,587,659,698,784,880,988, //中音7調(diào)
- 1046,1175,1318,1397,1568,1760,1976, //高音7調(diào)
- 262,294,330,349,392,440,494,99 //低音7調(diào)
- };
- //1.茉莉花
- unsigned int code yd[]={3,3,5,6,8,8,6,5,5,6,5,3,3,5,6,8,8,6,5,5,6,5,5,5,5,3,5,6,6,5,
- 3,2,3,5,3,2,1,1,2,1,3,2,1,3,2,3,5,6,8,5,2,3,5,2,3,1,20,19,
- 20,1,2,3,1,2,1,20,19,0,99};
- float code yc[]={ 1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,2,1,0.5,0.5,0.5,0.5,0.5,0.5,1,0.5,0.5,2,
- 1,1,1,0.5,0.5,1,1,2,1,0.5,0.5,1,0.5,0.5,1,0.5,0.5,2,0.5,0.5,0.5,0.5,1.5,0.5,1,0.5,0.5,2,
- 1,0.5,0.5,0.5,0.5,0.5,0.5,2,1,1,1.5,0.5,0.5,0.5,0.5,0.5,3,1};
- P0=0XFF;
- while(yd[i]!=99)
- {
- H=(65536-1000000/tone[yd[i]-1]/2)/256; // 取值,取對應(yīng)數(shù)組中的音值
- L=(65536-1000000/tone[yd[i]-1]/2)%256;
- TH0=H;
- TL0=L;
- TR0=1;
- delay(400*yc[i]);
- if(k==0x00)break; //如果標(biāo)志位等于0x00那么跳出播放模式
- TR0=0; //關(guān)定時計(jì)數(shù)器0
- BUZZ=1; //關(guān)蜂鳴器
- i++; //i的值每次加1
- if(i==99) break; //當(dāng)i等于99的時候跳出循環(huán)
- }
- }
- void main(void) //主函數(shù)
- {
- init(); //調(diào)用初始化程序
- while(1)
- {
- if(!QH)
- {
- delayms(10);
- if(!QH)
- { //判斷QH是否按下
- k=~k; //兩種模式切換
- }
- while(!QH);
- delayms(10);
- }
- switch(k) //判斷按鍵
- {
- case 0x00:tanzou();break; //調(diào)用子函數(shù)
- case 0xff:bofang();break;
- }
- }
- }
- void timer0(void) interrupt 1 //定時計(jì)數(shù)器0
- {
- TR0=0; //關(guān)定時計(jì)數(shù)器0
- TH0=H; //接收賦值
- TL0=L; //接收賦值
- BUZZ=~BUZZ; //蜂鳴器發(fā)聲
- TR0=1; //開定時計(jì)數(shù)器0
- }
復(fù)制代碼
原理圖Altium Designer PCB文件和代碼下載:
電子琴.7z
(11.93 MB, 下載次數(shù): 29)
2021-9-10 20:10 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|