簡易電子琴的設計
發布時間:2007/8/20 0:00:00 訪問次數:653
一、設計題目:
設計一簡易電子琴,要求能夠發出1、2、3、4、5、6、7等七個音符。
使用元件:AT89C51、LM324,喇叭,按鍵等
二、設計目的
(1)能夠對電子電路、電子元器件、印制電路板等方面的知識有進一步的認識,獨立對其進行測試與檢查。
(2)熟悉8051單片機的內部結構和功能,合理使用其內部寄存器,能夠完成相關軟件編程設計工作。
(3)為實現預期功能,能夠對系統進行快速的調試,并能夠對出現的功能故障進行分析,及時修改相關軟硬件。
(4)對軟件編程、排錯調試、焊接技術、相關儀器設備的使用技能等方面得到較全面的鍛煉和提高。
三、系統硬件圖
流程圖:
原理:
(一)音樂產生原理及硬件設計
由于一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。
本次設計中單片機晶振為12MHZ,那么定時器的計數周期為1MHZ,假如選擇工作方式1,那T值便為T=216--5﹡105/相應的頻率,那么根據不同的頻率計算出應該賦給定時器的計數值,列出不同音符與單片機計數T0相關的計數值如下表所示:
采用查表程序進行查表時,可以為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據:
TABLEDW64580,64684,64777,64820,64898,64968,65030
源程序:
方案一:產生按鍵音符
ORG0000H
LJMPMAIN
ORG000BH
LJMPBREAK
MAIN:MOVTMOD,#01H;設置定時器0的工作方式
SETBEA
SETBET0;設置定時器0中斷
SETBTR0;啟動定時器0
WAIT1:LCALLKEY;調用KEY子程序,判斷有鍵按下否?第幾個鍵?
CLREA;屏蔽中斷
CJNER3,#00H,WAIT1;如果R3=0,表示有鍵按下
MOVA,22H;將22H里存放的按鍵號送給A
RLA;因為查表里都是字,所以得乘2查得數據
MOVDPTR,#TABLE;指向表頭
MOVCA,@A+DPTR;查表
MOVTH0,A;將數據高位送TH0
MOV21H,A;將高位備份
MOVA,22H;將22H里存放的按鍵號送給A
RLA;因為查表里都是字,所以得乘2查得數據
INCA;取低位數據
MOVCA,@A+DPTR
MOVTL0,A
MOV20H,A
WAIT2:LCALLKEY
SETBEA
CJNER3,#00H,WAIT1
JMPWAIT2
KEY:MOVR3,#00H;KEY子程序,判斷有鍵按下否?第幾個鍵?
MOVR1,#0FFH
MOVR0,#00H
MOVA,R1
MOVP2,A
MOVA,P2
CLRC
CPLC;利用標志位CY來判斷是哪個鍵按下
MOVR2,#08H
WAIT3:RLCA;移位判斷
JNCSTORE
INCR0
DJNZR2,WAIT3
STORE:MOV22H,R0;將按鍵號存22H,R3=0有鍵按下
MOVR3,#00H
RET
BREAK:PUSHACC;中斷產生方波,從P1.0口輸出
PUSHPSW
MOVTL0,20H
MOVTH0,21H
CPLP1.0
POPPSW
POPACC
RETI
TABLE:DW65030,64968,64898,64820,64777,64684,64580;7,6,5,4,3,2,1
END
方案二:產生按鍵音符
ORG0000H
SJMPSTART
ORG000BH
AJMPINT_0
ORG0030H
START:MOVP1,#00H
SETBEA
SETBET0;計數器0
MOVTMOD,#02H
MOVTH1,#09CH
MOVTL1,#09CH;定時器初植
CLRTR0;定時器不允許
SCAN:;鍵盤掃描
MOVA,P2;判斷鍵盤按下,跳到SCAN_1,若未按,繼續掃描
CJNEA,#0FFH,SCAN_1
NOP
SJMPSCAN
SCAN_1:ACALLDELAY;是不是真的要按下?如果是,則跳轉SU_KEY查詢是哪個按下?
MOVA,P2
CJNEA,#0FFH,SU_KEY
NOP
SJMPSCAN
SU_KEY:JNBP2.1,MU_1;判斷是哪個鍵按下?
JNBP2.2,MU_2
JNBP2.3,MU_3
JNBP2.4,MU_4
JNBP2.5,MU_5
JNBP2.6,MU_6
JNBP2.7,MU_7
SJMPSCAN
;R1信號周期
MU_1:MOVR1,#19;如果第一個按鍵按下,則R1=19,同時程序轉NEXT
SJMPNEXT
MU_2:MOVR1,#17
SJMPNEXT
MU_3:MOVR1,#15
SJMPNEXT
MU_4:MOVR1,#14
SJMPNEXT
MU_5:MOVR1,#13
SJMPNEXT
MU_6:MOVR1,#11
SJMPNEXT
MU_7:MOVR1,#10
SJMPNEXT
NEXT:MOVA,R1
MOVR0,A
SETBTR0;啟動定時器0
NEXT_1:MOVA,P2;沒鍵按下繼續執行,有鍵按下,返回讀引腳
CJNEA,#0FFH,NEXT_1
ACALLDELAY
MOVA,P2;真的沒鍵按下?
CJNEA,#0FFH,NEXT_1
CLRTR0;不響
AJMPSCAN;掃描鍵盤去
INT_0:;中斷程序
DJNZR0,RE;R0不等于0時,返回
CPLP1.0
MOVA,R1
MOVR0,A
RE:RETI
DELAY:MOVR7,#100;延長時間等待,鍵盤消抖<
一、設計題目:
設計一簡易電子琴,要求能夠發出1、2、3、4、5、6、7等七個音符。
使用元件:AT89C51、LM324,喇叭,按鍵等
二、設計目的
(1)能夠對電子電路、電子元器件、印制電路板等方面的知識有進一步的認識,獨立對其進行測試與檢查。
(2)熟悉8051單片機的內部結構和功能,合理使用其內部寄存器,能夠完成相關軟件編程設計工作。
(3)為實現預期功能,能夠對系統進行快速的調試,并能夠對出現的功能故障進行分析,及時修改相關軟硬件。
(4)對軟件編程、排錯調試、焊接技術、相關儀器設備的使用技能等方面得到較全面的鍛煉和提高。
三、系統硬件圖
流程圖:
原理:
(一)音樂產生原理及硬件設計
由于一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。
本次設計中單片機晶振為12MHZ,那么定時器的計數周期為1MHZ,假如選擇工作方式1,那T值便為T=216--5﹡105/相應的頻率,那么根據不同的頻率計算出應該賦給定時器的計數值,列出不同音符與單片機計數T0相關的計數值如下表所示:
采用查表程序進行查表時,可以為這個音符建立一個表格,有助于單片機通過查表的方式來獲得相應的數據:
TABLEDW64580,64684,64777,64820,64898,64968,65030
源程序:
方案一:產生按鍵音符
ORG0000H
LJMPMAIN
ORG000BH
LJMPBREAK
MAIN:MOVTMOD,#01H;設置定時器0的工作方式
SETBEA
SETBET0;設置定時器0中斷
SETBTR0;啟動定時器0
WAIT1:LCALLKEY;調用KEY子程序,判斷有鍵按下否?第幾個鍵?
CLREA;屏蔽中斷
CJNER3,#00H,WAIT1;如果R3=0,表示有鍵按下
MOVA,22H;將22H里存放的按鍵號送給A
RLA;因為查表里都是字,所以得乘2查得數據
MOVDPTR,#TABLE;指向表頭
MOVCA,@A+DPTR;查表
MOVTH0,A;將數據高位送TH0
MOV21H,A;將高位備份
MOVA,22H;將22H里存放的按鍵號送給A
RLA;因為查表里都是字,所以得乘2查得數據
INCA;取低位數據
MOVCA,@A+DPTR
MOVTL0,A
MOV20H,A
WAIT2:LCALLKEY
SETBEA
CJNER3,#00H,WAIT1
JMPWAIT2
KEY:MOVR3,#00H;KEY子程序,判斷有鍵按下否?第幾個鍵?
MOVR1,#0FFH
MOVR0,#00H
MOVA,R1
MOVP2,A
MOVA,P2
CLRC
CPLC;利用標志位CY來判斷是哪個鍵按下
MOVR2,#08H
WAIT3:RLCA;移位判斷
JNCSTORE
INCR0
DJNZR2,WAIT3
STORE:MOV22H,R0;將按鍵號存22H,R3=0有鍵按下
MOVR3,#00H
RET
BREAK:PUSHACC;中斷產生方波,從P1.0口輸出
PUSHPSW
MOVTL0,20H
MOVTH0,21H
CPLP1.0
POPPSW
POPACC
RETI
TABLE:DW65030,64968,64898,64820,64777,64684,64580;7,6,5,4,3,2,1
END
方案二:產生按鍵音符
ORG0000H
SJMPSTART
ORG000BH
AJMPINT_0
ORG0030H
START:MOVP1,#00H
SETBEA
SETBET0;計數器0
MOVTMOD,#02H
MOVTH1,#09CH
MOVTL1,#09CH;定時器初植
CLRTR0;定時器不允許
SCAN:;鍵盤掃描
MOVA,P2;判斷鍵盤按下,跳到SCAN_1,若未按,繼續掃描
CJNEA,#0FFH,SCAN_1
NOP
SJMPSCAN
SCAN_1:ACALLDELAY;是不是真的要按下?如果是,則跳轉SU_KEY查詢是哪個按下?
MOVA,P2
CJNEA,#0FFH,SU_KEY
NOP
SJMPSCAN
SU_KEY:JNBP2.1,MU_1;判斷是哪個鍵按下?
JNBP2.2,MU_2
JNBP2.3,MU_3
JNBP2.4,MU_4
JNBP2.5,MU_5
JNBP2.6,MU_6
JNBP2.7,MU_7
SJMPSCAN
;R1信號周期
MU_1:MOVR1,#19;如果第一個按鍵按下,則R1=19,同時程序轉NEXT
SJMPNEXT
MU_2:MOVR1,#17
SJMPNEXT
MU_3:MOVR1,#15
SJMPNEXT
MU_4:MOVR1,#14
SJMPNEXT
MU_5:MOVR1,#13
SJMPNEXT
MU_6:MOVR1,#11
SJMPNEXT
MU_7:MOVR1,#10
SJMPNEXT
NEXT:MOVA,R1
MOVR0,A
SETBTR0;啟動定時器0
NEXT_1:MOVA,P2;沒鍵按下繼續執行,有鍵按下,返回讀引腳
CJNEA,#0FFH,NEXT_1
ACALLDELAY
MOVA,P2;真的沒鍵按下?
CJNEA,#0FFH,NEXT_1
CLRTR0;不響
AJMPSCAN;掃描鍵盤去
INT_0:;中斷程序
DJNZR0,RE;R0不等于0時,返回
CPLP1.0
MOVA,R1
MOVR0,A
RE:RETI
DELAY:MOVR7,#100;延長時間等待,鍵盤消抖<
上一篇:聲反饋及消除方法
上一篇:彩電伴音解調系統電路