當前位置:首頁 » 編程語言 » 電子琴c語言程序工作原理
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

電子琴c語言程序工作原理

發布時間: 2023-01-23 16:54:45

『壹』 畢業設計我想用單片機做一個電子琴,程序最好是c語言編寫的,那個好心人可以幫我提供點資料,要錢的免進!

www.doyoung.net

上有好多,要的話我還有流程圖

/*********************************************************************************************

程序名:DoToy系列作品MidTouch21電子琴程序

編寫人:杜洋

編寫時間:2009年6月3日

硬體支持:STC11L60XE外部12MHZ晶振電源3V

介面說明:詳見《DoToy_MidTouch21電路原理圖》

修改日誌:

NO.1-20090603_17.54完成電子琴21鍵的測試(20090603_1備)

NO.2-20090604_01.29改為第二次新板的硬體電路(20090604_2備)

/*********************************************************************************************

說明:

用STC11Fxx單片機I/O介面的高阻態輸入功能,掃描I/O介面電平。

手指將VCC線和I/O介面線半連接,產生高電平信號。

/*********************************************************************************************/

voidINIT(void);

#include<STC11Fxx.H>

/*********************************************************************************************/

sbitSPEAKER=P1^0;//揚聲器,低使能

sbitLED=P3^0;//LED正極,強推

sbitLED2=P3^1;//LED負極

sbitKEY11=P2^0;

sbitKEY12=P2^1;

sbitKEY13=P2^2;

sbitKEY14=P2^3;

sbitKEY15=P2^4;

sbitKEY16=P2^5;

sbitKEY17=P2^6;

sbitKEY21=P2^7;

sbitKEY22=P4^4;

sbitKEY23=P4^5;

sbitKEY24=P4^6;

sbitKEY25=P0^7;

sbitKEY26=P0^6;

sbitKEY27=P0^5;

sbitKEY31=P0^4;

sbitKEY32=P0^3;

sbitKEY33=P0^2;

sbitKEY34=P0^1;

sbitKEY35=P0^0;

sbitKEY36=P3^3;

sbitKEY37=P3^2;

/*********************************************************************************************/

unsignedcharMUSIC;

unsignedcharSTH0,STL0;

unsignedintcodetab[]={//音階表

63628,63835,64021,64103,64260,64400,64524,//低音1-7

64580,64684,64777,64820,64898,64968,65030,//中音1-7

65058,65110,65157,65178,65217,65252,65283//高音1-7

};

/*********************************************************************************************/

voiddelay1ms(unsignedinta){//1ms延時程序(12MHz10倍於51單片機速度時)

unsignedinti;

while(--a!=0){

for(i=0;i<600;i++);

}

}/***************************************************************************************/

voidINIT(void){//初始化程序

TMOD=0x11;

ET0=1;

ET1=1;

EA=1;

P0M1=0xff;//I/O介面工作方式

P0M0=0x00;//P0全為高阻輸入

P1M1=0xfe;//P1.0為准雙向,其他為高阻輸入

P1M0=0x00;

P2M1=0xff;//P2全為高阻輸入

P2M0=0x00;

P3M1=0xfc;//P3.0為強推,其他為標准雙向

P3M0=0x01;

P4M1=0xff;//P4全為高阻輸入

P4M0=0x00;

P4SW=0xff;

LED=1;

LED2=0;

SPEAKER=0;

}

/***************************************************************************************/

voidmain(void){

INIT();//初始化

while(1){

if(KEY37==1){delay1ms(20);if(KEY37==1){MUSIC=20;}}//高音B(37)

if(KEY36==1){delay1ms(20);if(KEY36==1){MUSIC=19;}}

if(KEY35==1){delay1ms(20);if(KEY35==1){MUSIC=18;}}

if(KEY34==1){delay1ms(20);if(KEY34==1){MUSIC=17;}}

if(KEY33==1){delay1ms(20);if(KEY33==1){MUSIC=16;}}

if(KEY32==1){delay1ms(20);if(KEY32==1){MUSIC=15;}}

if(KEY31==1){delay1ms(20);if(KEY31==1){MUSIC=14;}}

//3

if(KEY27==1){delay1ms(20);if(KEY27==1){MUSIC=13;}}

if(KEY26==1){delay1ms(20);if(KEY26==1){MUSIC=12;}}

if(KEY25==1){delay1ms(20);if(KEY25==1){MUSIC=11;}}

if(KEY24==1){delay1ms(20);if(KEY24==1){MUSIC=10;}}

if(KEY23==1){delay1ms(20);if(KEY23==1){MUSIC=9;}}

if(KEY22==1){delay1ms(20);if(KEY22==1){MUSIC=8;}}

if(KEY21==1){delay1ms(20);if(KEY21==1){MUSIC=7;}}

//2

if(KEY17==1){delay1ms(20);if(KEY17==1){MUSIC=6;}}

if(KEY16==1){delay1ms(20);if(KEY16==1){MUSIC=5;}}

if(KEY15==1){delay1ms(20);if(KEY15==1){MUSIC=4;}}

if(KEY14==1){delay1ms(20);if(KEY14==1){MUSIC=3;}}

if(KEY13==1){delay1ms(20);if(KEY13==1){MUSIC=2;}}

if(KEY12==1){delay1ms(20);if(KEY12==1){MUSIC=1;}}

if(KEY11==1){delay1ms(20);if(KEY11==1){MUSIC=0;}}

//1

if(MUSIC!=0xff){//如果有音階數值(非0XFF時)

STH0=tab[MUSIC]/256;//將音階的頻率值裝入定時器T0

STL0=tab[MUSIC]%256;

TR0=1;//啟動定時器

MUSIC=0xff;//清除寄存器

}else{//否則

SPEAKER=1;//關揚聲器

LED=1;

TR0=0;//關定時器

}

}

}

/***************************************************************************************/

voidt0(void)interrupt1using0{//定時器0產生音頻

TH0=STH0;

TL0=STL0;

SPEAKER=~SPEAKER;//取反頻率產生音調

LED=SPEAKER;//LED同頻閃爍

}

/***************************************************************************************/

/*************************************************************

*杜洋工作室www.DoYoung.net

/*************************************************************/

『貳』 單片機簡單的電子琴程序(C語言的),需要用4*4按鍵控制,簡單點就行,不需要有音樂

#include<AT89X51.H>

unsignedchartemp;

unsignedcharkey;

unsignedchari,j;

unsignedcharSTH0;

unsignedcharSTL0;

unsignedintcodetab[]={64021,64103,64260,64400,

64524,64580,64684,64777,

64820,64898,64968,65030,

65058,65110,65157,65178};

voidmain(void)

{

TMOD=0x01;

ET0=1;

EA=1;

while(1)

{

P3=0xff;//將P3口取出

P3_4=0;//使P3_4為低電平,這樣可以判斷第一豎排有沒有鍵按下

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)//判斷是哪個鍵按下

{

case0x0e:

key=0;

break;

case0x0d:

key=1;

break;

case0x0b:

key=2;

break;

case0x07:

key=3;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

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)

{

case0x0e:

key=4;

break;

case0x0d:

key=5;

break;

case0x0b:

key=6;

break;

case0x07:

key=7;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

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)

{

case0x0e:

key=8;

break;

case0x0d:

key=9;

break;

case0x0b:

key=10;

break;

case0x07:

key=11;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

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)

{

case0x0e:

key=12;

break;

case0x0d:

key=13;

break;

case0x0b:

key=14;

break;

case0x07:

key=15;

break;

}

temp=P3;

P1_0=~P1_0;

P0=table[key];

STH0=tab[key]/256;

STL0=tab[key]%256;

TR0=1;

temp=temp&0x0f;

while(temp!=0x0f)

{

temp=P3;

temp=temp&0x0f;

}

TR0=0;

}

}

}

}

voidt0(void)interrupt1using0

{

TH0=STH0;

TL0=STL0;

P1_0=~P1_0;

}

電路圖和原理我都有,剛好我也在做這個。你自己看下程序吧,我也不願意注釋。

這個是能發出16個音符聲音的,你寫的AD89S52,應該是AT89S52吧

『叄』 C語言電子琴程序

聯機調試的程序,先一步一步的來。

『肆』 C語言,電子琴程序

這是什麼鬼東西,看不懂。得去問博士後級別的人物了

『伍』 C語言工作原理

作為一種編程語言,本身是談不上工作原理的,實際上C語言所有的語法,正是C語言編譯器的工作原理或者工作機制的具體實現。要細致的討論起來是不可能,但是作為C語言程序員,必須了解這個大致的流程。一個程序,從C語言源碼,到系統可執行的文件,一般經歷四個過程。
1、預處理階斷,這個階斷是文本處理階斷,有預處理器來完成,會將源碼中的帶"#"開頭的預處理命令進行相應的處理,在Linux上C語言的預處理器程序是cp命令。
2、編譯階斷,這個階斷是有C語言編譯階斷,在Linux上C語言的編譯器是cc命令,它將C語言源碼轉換成匯編指令。
3、匯編階斷,這個階斷是匯編編譯階斷,在Linux上C語言的匯編器是as命令,這個階斷會將匯編指令編譯成二進制機器碼。
4、鏈接階斷,這個階斷是會將匯編階斷生成的機器碼目標文件,裝載成一個系統可執行的文件,在Linux平台以ELF格式進行組裝,在Windows平台上以PE格式進行組裝。在Linux平台上的鏈接器命令為ld,在windows平台上的鏈接器命令為linker。

『陸』 求簡易電子琴程序(c51編寫)

軟體是keil2.0的#include"reg51.h"unsigned char i,j,tempsbit p3_3=p3^3void d0();void ra();void mi();void fa();void so();void la();void xi();void hd0();void music();main(){ie=0;tmod=0x10;tr1=1;while(1){do{p1=0xff;temp=p1;temp=~temp}:while(temp==0x00)switch(temp){case 0x01:d0();break;case 0x02:ra();breakcase 0x04:mi();break;case 0x08:fa();breakcase 0x10:so();breakcase 0x20:la();breakcase 0x40:xi();breakdefault:hd0();break}music()}}void d0(){i=0x21;j=0xf9}void ra(){i=0xe0;j=0xf9}void mi(){i=0x8bj=0xfa;}void fa(){i=0xd7j=0xfa;}void so(){i=0x67;j=0xfb}void la(){i=0xe8;j=0xfb}void xi(){i=0x5bj=0xfc}void hd0(){j=0x8e;j=0xfc}void music(){tl1=ith1=j;do{while(tf1!=1)tf1=0tl1=i;th1=jp3_3=~p3_3temp=~p1}while(temp!=0x00)p3_3=1}

『柒』 求關於單片機的電子琴C程序

1. 實驗任務
(1. 由4X4 組成16 個按鈕矩陣,設計成16 個音。
(2. 可隨意彈奏想要表達的音樂。
2. 電路原理圖
圖4.22.1
3. 系統板硬體連線
(1. 把「單片機系統」區域中的P1.0 埠用導線連接到「音頻放大模塊」區
域中的SPK IN 埠上;
102
(2. 把「單片機系統「區域中的P3.0-P3.7 埠用8 芯排線連接到「4X4 行
列式鍵盤」區域中的C1-C4 R1-R4 埠上;
4. 相關程序內容
(1. 4X4 行列式鍵盤識別;
(2. 音樂產生的方法;
一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我
們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對於單片
機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0 來產生這
樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。
現在以單片機12MHZ 晶振為例,例出高中低音符與單片機計數T0 相關的計數值
如下表所示
下面我們要為這個音符建立一個表格,有助於單片機通過查表的方式來獲得相應
的數據
低音0-19 之間,中音在20-39 之間,高音在40-59 之間
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
音符頻率(HZ) 簡譜碼( T 值) 音符頻率(HZ) 簡譜碼( T 值)
低1 DO 262 63628 # 4 FA# 740 64860
#1 DO# 277 63731 中5 SO 784 64898
低2 RE 294 63835 # 5 SO# 831 64934
#2 RE# 311 63928 中6 LA 880 64968
低3 M 330 64021 # 6 932 64994
低4 FA 349 64103 中7 SI 988 65030
# 4 FA# 370 64185 高1 DO 1046 65058
低5 SO 392 64260 # 1 DO# 1109 65085
# 5 SO# 415 64331 高2 RE 1175 65110
低6 LA 440 64400 # 2 RE# 1245 65134
# 6 466 64463 高3 M 1318 65157
低7 SI 494 64524 高4 FA 1397 65178
中1 DO 523 64580 # 4 FA# 1480 65198
# 1 DO# 554 64633 高5 SO 1568 65217
中2 RE 587 64684 # 5 SO# 1661 65235
# 2 RE# 622 64732 高6 LA 1760 65252
中3 M 659 64777 # 6 1865 65268
中4 FA 698 64820 高7 SI 1967 65283
103
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
2、音樂的音拍,一個節拍為單位(C 調)
對於不同的曲調我們也可以用單片機的另外一個定時/計數器來完成。
下面就用AT89S51 單片機產生一首「生日快樂」歌曲來說明單片機如何產生的。
在這個程序中用到了兩個定時/計數器來完成的。其中T0 用來產生音符頻率,T1
用來產生音拍。
5. 程序框圖
圖4.22.2
6. 匯編源程序
KEYBUF EQU 30H
STH0 EQU 31H
STL0 EQU 32H
TEMP EQU 33H
曲調值DELAY 曲調值DELAY
調4/4 125ms 調4/4 62ms
調3/4 187ms 調3/4 94ms
調2/4 250ms 調2/4 125ms
104
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0
START: MOV TMOD,#01H
SETB ET0
SETB EA
WAIT:
MOV P3,#0FFH
CLR P3.4
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
105
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
CLR TR0
NOKEY1:
MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
106
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
107
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0
NOKEY3:
MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
108
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0
DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
109
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1.0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
7. C 語言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
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;
110
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;
P0=table[key];
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;
111
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;
P0=table[key];
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;
112
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;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
113
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;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp & 0x0f;
while(temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
}
TR0=0;
}
}
114
}
}
void t0(void) interrupt 1 using 0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}

『捌』 電子琴的設計原理

22. 電子琴
1. 實驗任務
(1. 由4X4組成16個按鈕矩陣,設計成16個音。
(2. 可隨意彈奏想要表達的音樂。
2. 電路原理圖

圖4.22.1
3. 系統板硬體連線
(1. 把「單片機系統」區域中的P1.0埠用導線連接到「音頻放大模塊」區域中的SPK IN埠上;
(2. 把「單片機系統「區域中的P3.0-P3.7埠用8芯排線連接到「4X4行列式鍵盤」區域中的C1-C4 R1-R4埠上;
4. 相關程序內容
(1. 4X4行列式鍵盤識別;
(2. 音樂產生的方法;
一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對於單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。現在以單片機12MHZ晶振為例,例出高中低音符與單片機計數T0相關的計數值如下表所示
音符 頻率(HZ) 簡譜碼(T值) 音符 頻率(HZ) 簡譜碼(T值)
低1 DO 262 63628 # 4 FA# 740 64860
#1 DO# 277 63731 中 5 SO 784 64898
低2 RE 294 63835 # 5 SO# 831 64934
#2 RE# 311 63928 中 6 LA 880 64968
低 3 M 330 64021 # 6 932 64994
低 4 FA 349 64103 中 7 SI 988 65030
# 4 FA# 370 64185 高 1 DO 1046 65058
低 5 SO 392 64260 # 1 DO# 1109 65085
# 5 SO# 415 64331 高 2 RE 1175 65110
低 6 LA 440 64400 # 2 RE# 1245 65134
# 6 466 64463 高 3 M 1318 65157
低 7 SI 494 64524 高 4 FA 1397 65178
中 1 DO 523 64580 # 4 FA# 1480 65198
# 1 DO# 554 64633 高 5 SO 1568 65217
中 2 RE 587 64684 # 5 SO# 1661 65235
# 2 RE# 622 64732 高 6 LA 1760 65252
中 3 M 659 64777 # 6 1865 65268
中 4 FA 698 64820 高 7 SI 1967 65283
下面我們要為這個音符建立一個表格,有助於單片機通過查表的方式來獲得相應的數據
低音0-19之間,中音在20-39之間,高音在40-59之間
TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0
DW 0,63731,63928,0,64185,64331,64463,0,0,0
DW 0,64580,64684,64777,64820,64898,64968,65030,0,0
DW 0,64633,64732,0,64860,64934,64994,0,0,0
DW 0,65058,65110,65157,65178,65217,65252,65283,0,0
DW 0,65085,65134,0,65198,65235,65268,0,0,0
DW 0
2、音樂的音拍,一個節拍為單位(C調)
曲調值 DELAY 曲調值 DELAY
調4/4 125ms 調4/4 62ms
調3/4 187ms 調3/4 94ms
調2/4 250ms 調2/4 125ms
對於不同的曲調我們也可以用單片機的另外一個定時/計數器來完成。
下面就用AT89S51單片機產生一首「生日快樂」歌曲來說明單片機如何產生的。
在這個程序中用到了兩個定時/計數器來完成的。其中T0用來產生音符頻率,T1用來產生音拍。
5. 程序框圖

圖4.22.2
6. 匯編源程序
KEYBUF EQU 30H
STH0 EQU 31H
STL0 EQU 32H
TEMP EQU 33H
ORG 00H
LJMP START
ORG 0BH
LJMP INT_T0 ;T0中斷入口
START: MOV TMOD,#01H ;T0工作方式1
SETB ET0
SETB EA
WAIT:
MOV P3,#0FFH ;輸入口置1准備工作
CLR P3.4
MOV A,P3 ;讀鍵盤
ANL A,#0FH ;保持低四位
XRL A,#0FH ;
JZ NOKEY1
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY1
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK1
MOV KEYBUF,#0
LJMP DK1
NK1: CJNE A,#0DH,NK2
MOV KEYBUF,#1
LJMP DK1
NK2: CJNE A,#0BH,NK3
MOV KEYBUF,#2
LJMP DK1
NK3: CJNE A,#07H,NK4
MOV KEYBUF,#3
LJMP DK1
NK4: NOP
DK1:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK1A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK1A
CLR TR0
NOKEY1:
MOV P3,#0FFH
CLR P3.5
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY2
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK5
MOV KEYBUF,#4
LJMP DK2
NK5: CJNE A,#0DH,NK6
MOV KEYBUF,#5
LJMP DK2
NK6: CJNE A,#0BH,NK7
MOV KEYBUF,#6
LJMP DK2
NK7: CJNE A,#07H,NK8
MOV KEYBUF,#7
LJMP DK2
NK8: NOP
DK2:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK2A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK2A
CLR TR0
NOKEY2:
MOV P3,#0FFH
CLR P3.6
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY3
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK9
MOV KEYBUF,#8
LJMP DK3
NK9: CJNE A,#0DH,NK10
MOV KEYBUF,#9
LJMP DK3
NK10: CJNE A,#0BH,NK11
MOV KEYBUF,#10
LJMP DK3
NK11: CJNE A,#07H,NK12
MOV KEYBUF,#11
LJMP DK3
NK12: NOP
DK3:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK3A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK3A
CLR TR0
NOKEY3:
MOV P3,#0FFH
CLR P3.7
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
LCALL DELY10MS
MOV A,P3
ANL A,#0FH
XRL A,#0FH
JZ NOKEY4
MOV A,P3
ANL A,#0FH
CJNE A,#0EH,NK13
MOV KEYBUF,#12
LJMP DK4
NK13: CJNE A,#0DH,NK14
MOV KEYBUF,#13
LJMP DK4
NK14: CJNE A,#0BH,NK15
MOV KEYBUF,#14
LJMP DK4
NK15: CJNE A,#07H,NK16
MOV KEYBUF,#15
LJMP DK4
NK16: NOP
DK4:
MOV A,KEYBUF
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,KEYBUF
MOV B,#2
MUL AB
MOV TEMP,A
MOV DPTR,#TABLE1
MOVC A,@A+DPTR
MOV STH0,A
MOV TH0,A
INC TEMP
MOV A,TEMP
MOVC A,@A+DPTR
MOV STL0,A
MOV TL0,A
SETB TR0

DK4A: MOV A,P3
ANL A,#0FH
XRL A,#0FH
JNZ DK4A
CLR TR0
NOKEY4:
LJMP WAIT
DELY10MS:
MOV R6,#10
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
RET
INT_T0:
MOV TH0,STH0
MOV TL0,STL0
CPL P1.0
RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

TABLE1: DW 64021,64103,64260,64400
DW 64524,64580,64684,64777
DW 64820,64898,64968,65030
DW 65058,65110,65157,65178
END
7. C語言源程序
#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
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;
P0=table[key];
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;
P0=table[key];
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;
P0=table[key];
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;
P0=table[key];
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
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}

『玖』 在51單片機上用C語言實現電子琴功能,但同時數碼管可以顯示簡譜,怎麼編程序

1,數據管顯示就沒什麼了,找幾個簡單的數碼管驅動程序改改就可以了,一般都是先選中數碼管,然後設置值,就可以顯示了,不過需要注意刷新,10ms刷新一個應該就可以了,刷新頻率比較低的話會閃閃的,這個你應該明白。

2,蜂鳴器發do音,這個硬體實現我就不知道了,也許有硬體可以 編碼控制自動生成對應頻率的值。我想如果通過軟體實現的話,不妨考慮一下定時器。假設do音是1000Hz的頻率(沒有查,不清楚,假設的),那麼你可以控制定時器的觸發頻率為1000hz,觸發一次,對應的輸出到蜂鳴器的口的電平跳變一下,如果定時器的頻率為1000hz的話,那麼應該有500hz的頻率,一個周期需要一高一低嘛!中斷讀取按鍵信號,分析按鍵,然後設定定時器的頻率,啟動定時器,設置一個響的時間,然後到時間關閉定時器,這樣你按下k1就會發出一聲do的聲音,然後停了。

3,按鍵讀取程序,中斷或者查詢方式,自己選擇吧,別忘了延遲5ms左右再次讀取按鍵,這個是消抖的。

4,建議模塊化編程,先搞定按鍵的,然後搞定數碼管的,然後搞定定時器的,然後再考慮如何把它們組合起來。好了不說了,說得有點多了,再說會我都回到大學時代了,哈哈。總之自己一點一點的做,應該不難,51熟練,c語言熟練,板子焊接的結構比較清晰的話,很快就可以搞定的。

5,還是建議你自己寫一份各個模塊的驅動的代碼,例如按鍵的,數碼管的,led的,溫度感測器的,光敏的,蜂鳴器的,遙控器的,定時器的,中斷的,等等等等模塊(可以借鑒別人寫的,自己一定要會),然後需要的時候,過來,改改就行,快而且bug少。建議keil c語言編程,用匯編編碼太耗時了。

『拾』 實驗六 簡易電子琴實驗 一. 實驗目的: 1. 了解8253/4的工作原理。 2. 用鍵盤實現彈奏規定音符的要求。

這個同學把實驗指導書直接上傳上來了,呵呵,指導書其中有錯,「不能把其頻率值直接送入42號埠
」,這里的42H是錯的,應該是4AH,,,
寫這個程序,要對「微機原理介面技術」知識有比較好的了解,並且初步掌握了可編程鍵盤顯示介面晶元8279、可編程並行介面晶元8255的使用,還要對你的運行環境(實驗設備)有較好的了解,那麼用介面晶元8253來完成一個簡易電子琴實驗就很簡單了,程序中關於8253晶元的初始化,頻率因子的計算,8255來控制揚聲器的發聲程序都在實驗指導中列出了,我建議同學還是試著自己編寫程序,調試程序,這個過程是樂在其中的。