1. 實驗任務 當按下開關SP1,AT89S51單片機產生“叮咚”聲從P1.0埠輸出到LM386,經過放大之後送入喇叭。 2. 電路原理圖 ͼ4.19.1 3. 系統板上硬體連線 (1. 把“單片機系統”區域中的P1.0埠用導線連接到“音頻放大模塊”區域中的SPK IN埠上; (2. 在“音頻放大模塊”區域中的SPK OUT埠上接上一個8歐或者是16歐的喇叭; (3. 把“單片機系統”區域中的P3.7/RD埠用導線連接到“獨立式鍵盤”區域中的SP1埠上; 4. 程序設計方法 (1. 我們用單片機實定時/計數器T0來產生700HZ和500HZ的頻率,根據定時/計數器T0,我們取定時250us,因此,700HZ的頻率要經過3次250us的定時,而500HZ的頻率要經過4次250us的定時。 (2. 在設計過程,只有當按下SP1之後,才啟動T0開始工作,當T0工作完畢,回到最初狀態。 (3. “叮”和“咚”聲音各佔用0.5秒,因此定時/計數器T0要完成0.5秒的定時,對於以250us為基準定時2000次才可以。 5. 程序框圖 主程序框圖 T0中斷服務程序框圖 ͼ4.19.2 6. 彙編源程序 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,#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 T05SB MOV 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 END 7. C語言源程序 #include 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=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; } } } |