




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、子項目四:電子琴目標:通過完成音頻的輸出和電子琴的綜合設計, 使學生進一步掌握keilC編譯器的使用和proteus仿真軟件進行仿真的基本過程。進一步了解單片機C51程序設計基礎,了解單片機內部結構、存儲器地址分配、并行I/O口的結構與工作原理、循環程序的設計。任務:由易到難設計滴、滴報警聲的輸出,叮咚門鈴和電子琴掌握音符的輸出控制。 一、原理1、滴、滴報警聲用 AT89S51 單片機產生“嘀、嘀、”報警聲從 P1.0 端口輸出,產生頻率為 1KHz, 根據上面圖可知:1KHZ方波從 P1.0 輸出 0.2 秒,接著 0.2 秒從 P1.0輸出電平信號,如此循環下去,就形成我們所需的報警聲了。
2、2、叮咚門鈴當按下開關 SP1,AT89S51 單片機產生“叮咚”聲從 P1.0 端口輸出,經過放大之后送入喇叭。3、電子琴由 4X4 組成 16 個按鈕矩陣,設計成 16 個音,可隨意彈奏想要表達的音樂。二、原理圖繪制1、滴、滴報警聲2、叮咚門鈴3、電子琴三、程序設計(1)滴、滴報警聲1、生活中我們常常到各種各樣的報警聲,例如“嘀、嘀、”就是常見的一種聲音報警聲,但對于這種報警聲,嘀 0.2 秒鐘,然后斷 0.2 秒鐘,如此循環下去,假設嘀聲的頻率為 1KHz,則報警聲時序圖如下圖所示:上述波形信號如何用單片機來產生呢?由于要產生上面的信號,我們把上面的信號分成兩部分,一部分為 1KHZ 方
3、波,占用時間為 0.2 秒;另一部分為電平,也是占用0.2秒;因此,我們利用單片機的定時/計數器 T0 作為定時,可以定時 0.2 秒;同時,也要用單片機產生 1KHZ的方波,對于 1KHZ 的方波信號周期為 1ms,高電平占用 0.5ms,低電平占用 0.5ms,因此也采用定時器 T0 來完成 0.5ms 的定時;最后,可以選定定時/計數器 T0 的定時時間為 0.5ms, 而要定時 0.2 秒則是 0.5ms 的 400 倍, 也就是說以 0.5ms 定時 400次就達到 0.2秒的定時時間了。2、程序框圖主程序框圖中斷服務程序框圖3、匯編源程序 T02SA EQU 30H T02SB E
4、QU 31H FLAG BIT 00H ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV T02SA,#00H MOV T02SB,#00H CLR FLAG MOV TMOD,#01H MOV TH0,#(65536-500) / 256 MOV TL0,#(65536-500) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT_T0: MOV TH0,#(65536-500) / 256 MOV TL0,#(65536-500) MOD 256 INC T02SA MOV A,T02SA CJNE A
5、,#100,NEXT INC T02SB MOV A,T02SB CJNE A,#04H,NEXT MOV T02SA,#00H MOV T02SB,#00H CPL FLAG NEXT: JB FLAG,DONE CPL P1.0 DONE: RETI END4、 C 語言源程序 #include <AT89X51.H> unsigned int t02s; unsigned char t05ms; bit flag; void main(void) TMOD=0x01; TH0=(65536-500)/256; TL0=(65536-500)%256; TR0=1; ET0=1
6、; EA=1; while(1); void t0(void) interrupt 1 using 0 TH0=(65536-500)/256; TL0=(65536-500)%256; t02s+; if(t02s=400) t02s=0; flag=flag; if(flag=0) P1_0=P1_0; (2)叮咚門鈴1、我們用單片機實定時/計數器 T0 來產生 700HZ和 500HZ的頻率, 根據定時/計數器T0,我們取定時 250us,因此,700HZ的頻率要經過3 次 250us 的定時,而 500HZ的頻率要經過 4 次 250us 的定時。在設計過程,只有當按下 SP1 之后,
7、才啟動 T0 開始工作,當 T0 工作完畢,回到最初狀態。“叮”和“咚”聲音各占用 0.5 秒,因此定時/計數器 T0 要完成 0.5 秒的定時,對于以 250us 為基準定時2000 次才可以。2、程序框圖主程序框圖T0中斷服務程序框圖3、匯編源程序 T5HZ EQU 30H T7HZ EQU 31H T05SA EQU 32H T05SB EQU 33H FLAG BIT 00H STOP BIT 01H SP1 BIT P3.7 ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#02H MOV TH0,#06H MOV TL0
8、,#06H SETB ET0 SETB EA NSP: JB SP1,NSP LCALL DELY10MS JB SP1,NSP SETB TR0 MOV T5HZ,#00H MOV T7HZ,#00H MOV T05SA,#00H MOV T05SB,#00H CLR FLAG CLR STOP JNB STOP,$ LJMP NSP DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: INC T05SA MOV A,T05SA CJNE A,#100,NEXT MOV T05SA,#00H INC T0
9、5SBMOV A,T05SB CJNE A,#20,NEXT MOV T05SB,#00H JB FLAG,STP CPL FLAG LJMP NEXT STP: SETB STOP CLR TR0 LJMP DONE NEXT: JB FLAG,S5HZ INC T7HZ MOV A,T7HZ CJNE A,#03H,DONE MOV T7HZ,#00H CPL P1.0 LJMP DONE S5HZ: INC T5HZ MOV A,T5HZ CJNE A,#04H,DONE MOV T5HZ,#00H CPL P1.0 LJMP DONE DONE: RETI END4、 C 語言源程序#
10、include <AT89X51.H> unsigned char t5hz; unsigned char t7hz; unsigned int tcnt; bit stop; bit flag; void main(void) unsigned char i,j; TMOD=0x02; TH0=0x06; TL0=0x06; ET0=1; EA=1; while(1) if(P3_7=0) for(i=10;i>0;i-) for(j=248;j>0;j-); if(P3_7=0) t5hz=0; t7hz=0; tcnt=0; flag=0; stop=0; TR0
11、=1; while(stop=0); void t0(void) interrupt 1 using 0 tcnt+; if(tcnt=2000) tcnt=0; if(flag=0) flag=flag; else stop=1; TR0=0; if(flag=0) t7hz+; if(t7hz=3) t7hz=0; P1_0=P1_0; else t5hz+; if(t5hz=4) t5hz=0; P1_0=P1_0; (3)電子琴1、4×4 矩陣鍵盤識別處理 每個按鍵有它的行值和列值 ,行值和列值的組合就是識別這個按鍵的編碼。矩陣的行線和列線分別通過兩并行接口和 CPU 通信。
12、每個按鍵的狀態同樣需變成數字量“0”和“1” ,開關的一端(列線)通過電阻接 VCC,而接地是通過程序輸出數字“0”實現的。鍵盤處理程序的任務是:確定有無鍵按下,判斷哪一個鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開時的抖動。兩個并行口中,一個輸出掃描碼,使按鍵逐行動態接地,另一個并行口輸入按鍵狀態,由行掃描值和回饋信號共同形成鍵編碼而識別按鍵,通過軟件查表,查出該鍵的功能。2、音樂產生的方法; 一首音樂是許多不同的音階組成的,而每個音階對應著不同的頻率,這樣我們就可以利用不同的頻率的組合,即可構成我們所想要的音樂了,當然對于單片機來產生不同的頻率非常方便,我們可以利用單片機的定時/計數器
13、 T0來產生這樣方波頻率信號,因此,我們只要把一首歌曲的音階對應頻率關系弄正確即可。現在以單片機 12MHZ 晶振為例,列出高中低音符與單片機計數 T0 相關的計數值如下表所示音 符頻 率(Hz)音 符頻 率(Hz)低1 DO262#4 FA#740#1 DO#277中5 SO784低2 RE294#5 SO#831#2 RE#311中6 LA880低3 MI330#6932低4 FA349中7 SI988#4 FA#370高1 DO1046低5 SO392#1 DO#1109#5 SO#415高2 RE1175低6 LA440#2 RE#1245#6466高3 MI1318低7 SI494高
14、4 FA1397中1 DO523#4 FA#1480#1 DO#554高5 SO1568中2 RE587#5 SO#1661#2 RE#622高6 LA1760中3 MI659#61865中4 FA698高7 SI19673、程序框圖主程序框圖按鍵程序設計框圖中斷服務程序框圖3、匯編源程序 KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H SETB ET0 SETB EA WAIT: MOV P3,#0FFH CLR
15、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,NK2MOV 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
16、 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 MO
17、V 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,P3ANL 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: M
18、OV 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
19、ANL A,#0FH XRL A,#0FH JZ NOKEY3LCALL 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:
20、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 SETBTR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0 NOKEY3: MOV P3,#0FFHCLR P3.7 MOV A,P3 A
21、NL 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 D
22、K4: 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,#0FHXRL A,#0FH JNZ DK4A CLR TR0 NOKEY4: LJMP WAIT DELY10MS: MOV R6,
23、#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 END4、 C 語言源程序
24、#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,6
25、4777, 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
26、) 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=tablekey; STH0=tabkey/256; STL0=tabkey%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;
27、 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=tablekey; STH0=tabkey/256; STL0=tabkey%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-) fo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CECS 10217-2022制冷(熱泵)機組集中采購通用要求
- T/CECS 10136-2021空氣濾料對20 nm~500 nm球形顆粒物過濾效率試驗方法
- T/CECS 10126-2021氣凝膠絕熱厚型涂料系統
- T/CCSAS 049.2-2023石油化工企業安全泄放評估技術規范第2部分:氣液兩相流安全泄放技術要求
- T/CCS 061-2023智能化煤礦地質保障系統運維管理規范
- T/CCOA 60-2023中長鏈甘油三酯食用油
- T/CCOA 18-2020紅棕櫚油
- T/CCMA 0191-2024高原隧道純電動液壓挖掘機
- T/CCMA 0131-2022瀝青路面熱風微波復合加熱就地熱再生施工規程
- T/CCIAS 017-2023黑椒牛排醬
- (完整版)新概念英語第一冊單詞表(打印版)
- 露天煤礦智能集控員職業技能競賽理論考試題庫(含答案)
- 市政府綜合服務樓食堂及綜合服務托管投標方案(技術方案)【附圖】
- 北京市《配電室安全管理規范》(DB11T 527-2021)地方標準
- 工程物品采購清單-含公式
- 湖北武漢歷年中考語文現代文閱讀真題45篇(含答案)(2003-2023)
- 帶貨主播規章制度范本
- 數據真實性保證書
- 《內科胸腔鏡術》課件
- 2024年《體育基礎理論》考試題庫(含答案)
- 2024年黑龍江省綏化市中考化學真題試卷(含標準答案)
評論
0/150
提交評論