一、設(shè)計(jì)題目:設(shè)計(jì)一簡易電子琴,要求能夠發(fā)出1、2、3、4、5、6、7等七個(gè)音符。使用元件:AT89C51、LM324,喇叭,按鍵等 二、 設(shè)計(jì)目的 (1)能夠?qū)﹄娮?a target="_blank" class="wordstyle">電路、電子元器件、印制電路板等方面的知識(shí)有進(jìn)一步的認(rèn)識(shí),獨(dú)立對(duì)其進(jìn)行測(cè)試與檢查。(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)對(duì)軟件編程、排錯(cuò)調(diào)試、焊接技術(shù)、相關(guān)儀器設(shè)備的使用技能等方面得到較全面的鍛煉和提高。 三、系統(tǒng)硬件圖 流程圖: 原理:(一) 音樂產(chǎn)生原理及硬件設(shè)計(jì)由于一首音樂是許多不同的音階組成的,而每個(gè)音階對(duì)應(yīng)著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構(gòu)成我們所想要的音樂了,當(dāng)然對(duì)于單片機(jī)來產(chǎn)生不同的頻率非常方便,我們可以利用單片機(jī)的定時(shí)/計(jì)數(shù)器T0來產(chǎn)生這樣方波頻率信號(hào),因此,我們只要把一首歌曲的音階對(duì)應(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ù)值如下表所示:
| | 音符 | 頻率(HZ) | 簡譜碼(T值) | | 中 1 DO | 523 | 64580 | | 中 2 RE | 587 | 64684 | | 中 3 M | 659 | 64777 | | 中 4 FA | 698 | 64820 | | 中 5 SO | 784 | 64898 | | 中 6 LA | 880 | 64968 | | 中 7 SI | 988 | 65030 | 采用查表程序進(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 BREAKMAIN: MOV TMOD,#01H ;設(shè)置定時(shí)器0的工作方式 SETB EA SETB ET0 ; 設(shè)置定時(shí)器0中斷 SETB TR0 ; 啟動(dòng)定時(shí)器0WAIT1: LCALL KEY ; 調(diào)用KEY子程序,判斷有鍵按下否?第幾個(gè)鍵? CLR EA ;屏蔽中斷 CJNE R3,#00H,WAIT1 ;如果R3=0,表示有鍵按下 MOV A,22H ;將22H里存放的按鍵號(hào)送給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里存放的按鍵號(hào)送給A RL A ;因?yàn)椴楸砝锒际亲,所以得?查得數(shù)據(jù) INC A ;取低位數(shù)據(jù) MOVC A,@A+DPTR MOV TL0,A MOV 20H,AWAIT2: LCALL KEY SETB EA CJNE R3,#00H,WAIT1 JMP WAIT2KEY: 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,#08HWAIT3: RLC A ;移位判斷 JNC STORE INC R0 DJNZ R2,WAIT3STORE: MOV 22H,R0 ; 將按鍵號(hào)存22H,R3=0有鍵按下 MOV R3,#00H RETBREAK: PUSH ACC ; 中斷產(chǎn)生方波,從P1.0口輸出 PUSH PSW MOV TL0,20H MOV TH0,21H CPL P1.0 POP PSW POP ACC RETITABLE: 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 0030HSTART: 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 SCANSCAN_1:ACALL DELAY ;是不是真的要按下?如果是,則跳轉(zhuǎn)SU_KEY查詢是哪個(gè)按下? MOV A,P2 CJNE A,#0FFH,SU_KEY NOP SJMP SCANSU_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信號(hào)周期MU_1: MOV R1,#19 ;如果第一個(gè)按鍵按下,則R1=19,同時(shí)程序轉(zhuǎn)NEXT SJMP NEXTMU_2: MOV R1,#17 SJMP NEXTMU_3: MOV R1,#15 SJMP NEXTMU_4: MOV R1,#14 SJMP NEXTMU_5: MOV R1,#13 SJMP NEXTMU_6: MOV R1,#11 SJMP NEXTMU_7: MOV R1,#10 SJMP NEXTNEXT: 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,ARE: RETIDELAY:MOV R7,#100 ;延長時(shí)間等待,鍵盤消抖D1: MOV R6,#10D2: DJNZ R6,D2 DJNZ R7,D1 RET END 生日快樂歌:(擴(kuò)展功能部分程序) ORG 0000H JMP MAIN ORG 000BH JMP TT0MAIN: MOV TMOD,#01H ;設(shè)置定時(shí)器0工作方式 MOV IE,#82H ;設(shè)置中斷MAIN0:MOV 30H,#00HNEXT: 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 W1SING: 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 TR0W1: CALL DELAY INC 30H JMP NEXTSTOP: CLR TR0 JMP MAIN0TT0: PUSH ACC ;中斷服務(wù)程序 PUSH PSW MOV TL0,20H MOV TH0,21H CPL P1.0 POP PSW POP ACC RETIDELAY:MOV R7,#2 ;延時(shí)187ms W2: MOV R4,#187 W3: MOV R3,#248 DJNZ R3,$ DJNZ R4,W3 DJNZ R7,W2 DJNZ R5,DELAY RETTABLE1:DW 64260,64400,64524,64580 ;音符計(jì)數(shù)植 DW 64684,64777,64820,64898 DW 64968,65030,65058,65110DW 65157,65178,65217 TABLE:DB 82H,01H,81H,94H,84H ;節(jié)拍表 DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4HDB 0C4H,0B4H,04H DB 82H,01H,81H,94H,84H DB 0B4H,0A4H,04H DB 82H,01H,81H,94H,84HDB 0C4H,0B4H,04H DB 82H,01H,81H,0F4H,0D4H DB 0B4H,0A4H,94H DB 0E2H,01H,0E1H,0D4H,0B4H DB 0C4H,0B4H,04H DB 00HEND
|