สร้างเสียงดนตรีด้วย Microcontroller MCS-51

โปรเจคนี้ผมทำขึ้นตอนที่เรียนอยู่ลาดกระบังครับ โดย อ. ให้คิดโปรเจคง่ายๆ ใช้ไมโครคอนโทรลเลอร์เขีียนโปรแกรม เลยมาเป็นโปรเจคนี้ ผมคิดว่าทุกท่านคงรู้จัก Mini organ คือมันก็คล้ายๆกับ Electone หรือ Keyboard นั่นแหล่ะเพียงแต่มันมีตัวโน๊ตไม่เยอะ ตอนที่เรียนนั้นเถียงกับ อ.แทบตาย โดยทาง อ.บอกว่าผมไม่สามารถ Generate ความถี่ออกมาที่ลำโพงได้เพราะ MCU ต้องไป Scan Key ด้วย ผมก็เถียงว่ามันทำได้

หลักการทำงาน

89C52 จะ Scan Key ไปทีละ row และ Column เมื่อเจอ Key ไหนกดก็จะสร้างสัญญาณ Logic”0″ และ Logic”1″ จากขา P3.5 เป็นสัญญาณ Square wave โดยค่า Time delay ในแต่ละปุ่มจะไม่เท่ากัน ทำให้ความถี่ของแต่ปุ่มมีเสียงเทียบได้กับตัวโน๊ตดนตรี โด เร มี ฟา ซอล ลา ที โด เมื่อสร้าง Square wave มาครบ 1 ลูกแล้ว 89C52 จะเช็คอีกว่ามีการปล่อย Key ยังถ้ายังไม่ปล่อยก็ generate เสียงต่อไป ถ้ามีการกด Key ใหม่ก็จะ Generate โทนเสียงใหม่วน loop ไปเรื่อยๆ

?

?;*********************************
;Microcontroller mini organ
;Pragrammer:Pratchaya Tongthong????
;*********************************
;P3.5 —-> SPEAKER????
MSEC??EQU??7FH
S_CODE??EQU??7DH
KEY???EQU??7CH??
S_CODE??EQU??7DH
NOTE1??EQU??7BH
NOTE2??EQU??7AH
KEYBUF??EQU??79H
PNTERHI??EQU??78H
PNTERLO??EQU??77H
DURATION?EQU??76H
;***********************************************
;Start? Scan key
;***********************************************INIT:??ACALL?SCAN?
???CJNE?A,#00,SONG
???SJMP??INIT
???
SCAN:??MOV??S_CODE,#00H???????
???MOV??P1,#0FFH???????
???SETB?P3.0
???SETB?P3.1
???SETB?P3.2??
???
???CLR ?P3.0????? ;Scan first column
???MOV??A,P1
???CJNE?A,#0FFH,CONVERT
???SETB?P3.0
???MOV??A,S_CODE?????
???ADD??A,#08
???MOV??S_CODE,A??
??????????????????????????????????????????????????
???CLR??P3.1????? ;Scan second column
???MOV??A,P1
???CJNE??? A,#0FFH,CONVERT
???SETB?P3.1????
???MOV??A,S_CODE?????
???ADD??A,#08
???MOV??S_CODE,A??
???
???CLR??P3.2????? ;Scan third column
???MOV??A,P1????
???SETB?P3.2?
???CJNE?A,#0FFH,CONVERT
???MOV??S_CODE,#00H
???SJMP??END
CONVERT:?INC??S_CODE???
???JNB??ACC.0,END
???RR??A
???SJMP?CONVERT
END:??MOV??KEY,S_CODE????
???MOV??A,KEY
???CJNE?A,#00,END1
???RET?
END1:??MOV??DPTR,#NOTE_1??
???MOV??A,KEY
???MOVC?A,@A+DPTR
???MOV??NOTE1,A? ????
???MOV??DPTR,#NOTE_2??
???MOV??A,KEY
???MOVC?A,@A+DPTR
???MOV??NOTE2,A
???RET
???
;***********************************************
;Generate Tone
;***********************************************
SONG:??CLR??P3.5
???ACALL?PERIOD
???SETB?P3.5
???ACALL?PERIOD
???MOV??P1,#0FFH
???MOV??A,P1
???CJNE?A,#0FFH,SONG
???SJMP?INIT
PERIOD:??MOV??R0,NOTE1
L1:???MOV??R1,#48
???DJNZ?R1,$
???NOP
???DJNZ?R0,L1
???MOV??R0,NOTE2
???DJNZ?R0,$
???RET
;***********************************************
;Note1 and Note2
;***********************************************??
NOTE_1:??DB??0,23,20,18,17,16,15,14,13,13,12,11,10,10,9,9,8,8,7,7,6
NOTE_2:??DB??0,20,42,27,24,23,28,33,42,08,17,32,48,18,38,11,34,9,36,14,43?

ทดสอบ

ผมลองเล่นเพลง Happy Birthday ครับ เสียงที่ออกมาก็ OK เลยไม่ผิดเพี้ยน

Download Assembly Code

บทความอื่นๆที่เกี่ยวข้อง

3 thoughts on “สร้างเสียงดนตรีด้วย Microcontroller MCS-51

  1. พอดีตอนนี้ทำ mini keybord อยู่พอดีเลยค่ะ
    ขอโค้ดเ็ป็นภาษาซีได้มั้ยค่ะ

  2. Code ภาษา C ไมไ่ด้ทำไว้ครับ งานแบบนี้ assembly คุม Machine cycle ได้ดีกว่า ถ้าจะใช้กับไมโครคอนโทรลเลอร์ตัวใหม่ๆ ใช้เป็น PWM ก็ง่ายดีครับ

Leave a Reply