一、設(shè)計(jì)題目: 設(shè)計(jì)一簡易電子琴,要求能夠發(fā)出1、2、3、4、5、6、7等七個(gè)音符。 使用元件:AT89C51、LM324,喇叭,按鍵等
二、設(shè)計(jì)目的 (1)能夠?qū)﹄娮与娐贰㈦娮釉骷、印制電路板等方面的知識有進(jìn)一步的認(rèn)識,獨(dú)立對其進(jìn)行測試與檢查。 (2)熟悉8051單片機(jī)的內(nèi)部結(jié)構(gòu)和功能,合理使用其內(nèi)部寄存器,能夠完成相關(guān)軟件編程設(shè)計(jì)工作。 (3)為實(shí)現(xiàn)預(yù)期功能,能夠?qū)ο到y(tǒng)進(jìn)行快速的調(diào)試,并能夠?qū)Τ霈F(xiàn)的功能故障進(jìn)行分析,及時(shí)修改相關(guān)軟硬件。 (4)對軟件編程、排錯(cuò)調(diào)試、焊接技術(shù)、相關(guān)儀器設(shè)備的使用技能等方面得到較全面的鍛煉和提高。
三、系統(tǒng)硬件圖
流程圖:
原理: (一) 音樂產(chǎn)生原理及硬件設(shè)計(jì) 由于一首音樂是許多不同的音階組成的,而每個(gè)音階對應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應(yīng)頻率關(guān)系弄正確即可。 本次設(shè)計(jì)中單片機(jī)晶振為12MHZ,那么定時(shí)器的計(jì)數(shù)周期為1MHZ,假如選擇工作方式1,那T值便為T= 216--5﹡105/相應(yīng)的頻率 ,那么根據(jù)不同的頻率計(jì)算出應(yīng)該賦給定時(shí)器的計(jì)數(shù)值,列出不同音符與單片機(jī)計(jì)數(shù)T0相關(guān)的計(jì)數(shù)值如下表所示: 采用查表程序進(jìn)行查表時(shí),可以為這個(gè)音符建立一個(gè)表格,有助于單片機(jī)通過查表的方式來獲得相應(yīng)的數(shù)據(jù): TABLE DW 64580,64684,64777,64820,64898,64968,65030
源程序: 方案一:產(chǎn)生按鍵音符 ORG 0000H LJMP MAIN ORG 000BH LJMP BREAK MAIN: MOV TMOD,#01H ;設(shè)置定時(shí)器0的工作方式 SETB EA SETB ET0 ; 設(shè)置定時(shí)器0中斷 SETB TR0 ; 啟動(dòng)定時(shí)器0 WAIT1: LCALL KEY ; 調(diào)用KEY子程序,判斷有鍵按下否?第幾個(gè)鍵? CLR EA ;屏蔽中斷 CJNE R3,#00H,WAIT1 ;如果R3=0,表示有鍵按下 MOV A,22H ;將22H里存放的按鍵號送給A RL A ; 因?yàn)椴楸砝锒际亲郑缘贸?查得數(shù)據(jù) MOV DPTR,#TABLE ;指向表頭 MOVC A,@A+DPTR ; 查表 MOV TH0,A ;將數(shù)據(jù)高位送TH0 MOV 21H,A ; 將高位備份 MOV A,22H ;將22H里存放的按鍵號送給A RL A ;因?yàn)椴楸砝锒际亲,所以得?查得數(shù)據(jù) INC A ;取低位數(shù)據(jù) MOVC A,@A+DPTR MOV TL0,A MOV 20H,A WAIT2: LCALL KEY SETB EA CJNE R3,#00H,WAIT1 JMP WAIT2 KEY: MOV R3,#00H ; KEY子程序,判斷有鍵按下否?第幾個(gè)鍵? MOV R1,#0FFH MOV R0,#00H MOV A,R1 MOV P2,A MOV A,P2 CLR C CPL C ;利用標(biāo)志位CY來判斷是哪個(gè)鍵按下 MOV R2,#08H WAIT3: RLC A ;移位判斷 JNC STORE INC R0 DJNZ R2,WAIT3 STORE: MOV 22H,R0 ; 將按鍵號存22H,R3=0有鍵按下 MOV R3,#00H RET BREAK: PUSH ACC ; 中斷產(chǎn)生方波,從P1.0口輸出 PUSH PSW MOV TL0,20H MOV TH0,21H CPL P1.0 POP PSW POP ACC RETI TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1 END 方案二:產(chǎn)生按鍵音符 ORG 0000H SJMP START ORG 000BH AJMP INT_0 ORG 0030H START: MOV P1,#00H SETB EA SETB ET0 ;計(jì)數(shù)器0 MOV TMOD,#02H MOV TH1,#09CH MOV TL1,#09CH ;定時(shí)器初植 CLR TR0 ;定時(shí)器不允許 SCAN: ;鍵盤掃描 MOV A,P2 ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續(xù)掃描 CJNE A,#0FFH,SCAN_1 NOP SJMP SCAN SCAN_1:ACALL DELAY ;是不是真的要按下?如果是,則跳轉(zhuǎn)SU_KEY查詢是哪個(gè)按下? MOV A,P2 CJNE A,#0FFH,SU_KEY NOP SJMP SCAN SU_KEY:JNB P2.1,MU_1 ;判斷是哪個(gè)鍵按下? JNB P2.2,MU_2 JNB P2.3,MU_3 JNB P2.4,MU_4 JNB P2.5,MU_5 JNB P2.6,MU_6 JNB P2.7,MU_7 SJMP SCAN ;R1信號周期 MU_1: MOV R1,#19 ;如果第一個(gè)按鍵按下,則R1=19,同時(shí)程序轉(zhuǎn)NEXT SJMP NEXT MU_2: MOV R1,#17 SJMP NEXT MU_3: MOV R1,#15 SJMP NEXT MU_4: MOV R1,#14 SJMP NEXT MU_5: MOV R1,#13 SJMP NEXT MU_6: MOV R1,#11 SJMP NEXT MU_7: MOV R1,#10 SJMP NEXT NEXT: MOV A,R1 MOV R0,A SETB TR0 ;啟動(dòng)定時(shí)器0 NEXT_1:MOV A,P2 ; 沒鍵按下繼續(xù)執(zhí)行,有鍵按下,返回讀引腳 CJNE A,#0FFH,NEXT_1 ACALL DELAY MOV A,P2 ;真的沒鍵按下? CJNE A,#0FFH,NEXT_1 CLR TR0 ;不響 AJMP SCAN ;掃描鍵盤去 INT_0: ;中斷程序 DJNZ R0,RE ;R0不等于0時(shí),返回 CPL P1.0 MOV A,R1 MOV R0,A RE: RETI DELAY:MOV R7,#100 ;延長時(shí)間等待,鍵盤消抖 D1: MOV R6,#10 D2: DJNZ R6,D2 DJNZ R7,D1 RET END
生日快樂歌:(擴(kuò)展功能部分程序)
ORG 0000H JMP MAIN ORG 000BH JMP TT0 MAIN: MOV TMOD,#01H ;設(shè)置定時(shí)器0工作方式 MOV IE,#82H ;設(shè)置中斷 MAIN0:MOV 30H,#00H NEXT: MOV A,30H MOV DPTR,#TABLE ;查表 MOVC A,@A+DPTR MOV R2,A JZ STOP ANL A,0FH MOV R5,A MOV A,R2 SWAP A ANL A,#0FH JNZ SING CLR TR0 JMP W1 SING: DEC A MOV 22H,A RL A MOV DPTR,#TABLE1 ;查表 MOVC A,@A+DPTR MOV TH0,A MOV 21H,A MOV A,22H RL A INC A MOVC A,@A+DPTR MOV TL0,A MOV 20H,A SETB TR0 W1: CALL DELAY INC 30H JMP NEXT STOP: CLR TR0 JMP MAIN0 TT0: PUSH ACC ;中斷服務(wù)程序 PUSH PSW MOV TL0,20H MOV TH0,21H CPL P1.0 POP PSW POP ACC RETI DELAY:MOV R7,#2 ;延時(shí)187ms W2: MOV R4,#187 W3: MOV R3,#248 DJNZ R3,$ DJNZ R4,W3 DJNZ R7,W2 DJNZ R5,DELAY RET TABLE1:DW 64260,64400,64524,64580 ;音符計(jì)數(shù)植 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110 DW 65157,65178,65217
TABLE:DB 82H,01H,81H,94H,84H ;節(jié)拍表 DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84H DB 0C4H,0B4H,04H
DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H
DB 82H,01H,81H,94H,84H DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84H DB 0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H DB 00H END |