| “叮咚”電子門(mén)鈴實(shí)驗(yàn)ASM源程序: | | “叮咚”電子門(mén)鈴C語(yǔ)言源程序: | ORG 0000H LJMP START ;跳轉(zhuǎn)到初始化程序
ORG 000BH LJMP PGT0 ;跳轉(zhuǎn)到T0中斷服務(wù)程序 START: OBUF1 EQU 30H ;初始化程序 OBUF2 EQU 31H OBUF3 EQU 32H OBUF4 EQU 33H FLAGB BIT 00H STOPB BIT 01H K1 BIT P3.2 ;定義按鈕K1,作為門(mén)鈴按鈕
MOV TMOD,#02H ;定時(shí)器初始化 MOV TH0,#06H MOV TL0,#06H SETB ET0 ;啟動(dòng)定時(shí)器T0 SETB EA ;啟動(dòng)總中斷
MAIN: ;主程序 JB K1,MAIN ;檢測(cè)K1按鈕 LCALL YS10M ;延時(shí)去抖動(dòng) JB K1,MAIN SETB TR0 ;按鈕有效 MOV P1,#00H ;點(diǎn)亮按鈕指示燈 MOV OBUF1,#00H MOV OBUF2,#00H MOV OBUF3,#00H MOV OBUF4,#00H CLR FLAGB CLR STOPB JNB STOPB,$ MOV P1,#0FFH LJMP MAIN ;發(fā)出“叮咚”完畢,返回重新檢測(cè)按鈕 YS10M: ;10ms延時(shí)子程序 MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET
PGT0: ;定時(shí)器T0中斷服務(wù)程序 INC OBUF3 ;中斷服務(wù)程序中發(fā)出一聲“叮咚”響聲 MOV A,OBUF3 CJNE A,#100,NEXT MOV OBUF3,#00H INC OBUF4 MOV A,OBUF4 CJNE A,#20,NEXT MOV OBUF4,#00H JB FLAGB,PGSTP CPL FLAGB AJMP NEXT PGSTP: SETB STOPB CLR TR0 LJMP INT0RET NEXT: JB FLAGB,SOU2 INC OBUF2 MOV A,OBUF2 CJNE A,#03H,INT0RET MOV OBUF2,#00H CPL P3.7 LJMP INT0RET SOU2: INC OBUF1 MOV A,OBUF1 CJNE A,#04H,INT0RET MOV OBUF1,#00H CPL P3.7 LJMP INT0RET INT0RET: RETI
END | | #include unsigned char obuf1; unsigned char obuf2; unsigned int obuf3; bit stopb; bit flagb; void main(void) { unsigned char i,j; TMOD=0x02; //定時(shí)器T0初始化 TH0=0x06; TL0=0x06; ET0=1; EA=1; //允許總中斷 while(1) { if(P3_2==0) //檢測(cè)K1按鍵 { P1=0x00; for(i=10;i>0;i--) for(j=248;j>0;j--); if(P3_2==0) { obuf1=0; obuf2=0; obuf3=0; flagb=0; stopb=0; TR0=1; //啟動(dòng)定時(shí)器T0,發(fā)出“叮咚”聲 while(stopb==0); P1=0xff; } } } } void t0(void) interrupt 1 using 0 { obuf3++; if(obuf3==2000) { obuf3=0; if(flagb==0) { flagb=~flagb; } else { stopb=1; TR0=0; } } if(flagb==0) { obuf2++; if(obuf2==3) { obuf2=0; P3_7=~P3_7; } } else { obuf1++; if(obuf1==4) { obuf1=0; P3_7=~P3_7; } } } | 單片機(jī)驅(qū)動(dòng)蜂鳴器原理的程序編寫(xiě) |