ORG 0000H LJMP START ;跳转到初始化程序
ORG 000BH LJMP PGT0 ;跳转到T0中断服务程序
START: OBUF1 EQU 30H ;初始化程序 OBUF2 EQU 31H OBUF3 EQU 32H OBUF4 EQU 33H FLAGB BIT 00H STOPB BIT 01H K1 BIT P3.2 ;定义按钮K1,作为门铃按钮
MOV TMOD,#02H ;定时器初始化 MOV TH0,#06H MOV TL0,#06H SETB ET0 ;启动定时器T0 SETB EA ;启动总中断
MAIN: ;主程序 JB K1,MAIN ;检测K1按钮 LCALL YS10M ;延时去抖动 JB K1,MAIN SETB TR0 ;按钮有效 MOV P1,#00H ;点亮按钮指示灯 MOV OBUF1,#00H MOV OBUF2,#00H MOV OBUF3,#00H MOV OBUF4,#00H CLR FLAGB CLR STOPB JNB STOPB,$ MOV P1,#0FFH LJMP MAIN ;发出“叮咚”完毕,返回重新检测按钮
YS10M: ;10ms延时子程序 MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET
PGT0: ;定时器T0中断服务程序 INC OBUF3 ;中断服务程序中发出一声“叮咚”响声 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; //定时器T0初始化 TH0=0x06; TL0=0x06; ET0=1; EA=1; //允许总中断
while(1) { if(P3_2==0) //检测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; //启动定时器T0,发出“叮咚”声 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; } } } |