ORG 0000H LJMP MAIN ORG 0003H LJMP PINT0 ORG 0200HMAIN: MOV IE,#81H ;CPU开放中断,/INT0允许中断 SETB IT0 ;外部中断为边沿触发方式 MOV SP,#30H ;指针入口地址 MOV R0,#00H SETB P3.0 CLR P3.1 MOV P1,#0FFH ;使P1口全部置1 MOV P2,#00H ;P2口清零 CLR P1.2 LP: JNB P1.0,LA ;监测输入信号,是否有输入信号 LA: ACALL DELAY ;延时消抖 JNB P1.0,ALARM ;再次监测输入信号,若有输入信号转入报警子程序 AJMPLPDELAY:MOV R1,0AAH LD2:MOV R2,0BBH LD1:NOP DJNZ R2,LD1 DJNZ R1,LD2 RETALARM:SETB P1.2 ;开始报警使运行正常绿指示灯熄灭,红灯和声报警启动 MOVA,#00H INC R0 ;报警次数加一 CJNER0,#0AH,LP1 MOVR0,#00HLP1:MOV A,R0 ;显示报警次数 MOVDPTR,#TAB MOVCA,@A+DPTR MOVP2,A TAB: DB 3FH,06H,5BH,4FH DB66H,6DH,7DH,07H DB7FH,6FH;10S钟定时: MOV 50H,#14H ; 1S循环次数20 MOV 51H,#0AH ; 10S循环次数 MOV TMOD,#01H ; 定时器T0定时方式1 MOV TL0,#0B0H ;置50ms定时初值 MOV TH0,#3CH SETB TR0 ;启动T0 L2:JBC TF0,L1 ;查询记数溢出 SJMP L2 L1:CPL P3.0 CPL P3.1 MOV TL0,#0B0H ;重新赋值 MOV TH0,#3CH DJNZ 50H,L2 ;未到1S继续循环 CPL P3.0 CPL P3.1 MOV 50H,#14H DJNZ 51H,L2 ;未到10S继续循环 SETB P3.0 ;10s到关闭报警 CLR P3.1 CLR P1.2 ;报警结束,正常运行绿指示灯亮 LJMP LP ;循环,继续工作 END 其中,10秒钟的定时采用定时器T0定时工作在方式1 ,单片机晶振Fosc=12MHz,所以机器周期T=12×t0=12×(1/12MHz)=1us设定时器T0初始值为X,则:(2∧16-X)×1us=50ms 从而可知定时器T0初始值X= 65536-50000=15536=3CB0H,在此用50H、51H单元分别进行1秒和10秒的计数,它们内的赋值分别为14H、0AH,T0的初值置为TL0=0B0H、TH0=3CH。2. 外部中断INTO服务程序: PINT0:CLR EX0 ;外部中断0服务程序开始,屏蔽外部中断 PUSH PSW PUSH ACC JNB P3.2,LN ;监测是否有中断输入 LN: LCALL DELAY ;延时消抖 JNB P3.2,LN1 AJMP LN2 ; 无中断输入,中断返回 LN1: SETB P3.0 CLR P3.1 CLR P1.2 ;使报警结束,绿指示灯亮 POP ACC POP PSW SETB EX0 ;开放外部中断0 LCALL LP ;在中断继续检测是否有输入信号 LN2:REti
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>