1. 外部中断
1.1统计 INT0 的脉冲触发的个数,满10个,则停止统计将P1.0清0
ORG 0000H
LJMP START
ORG 0003H
LJMP EXINT0
ORG 0100H
START:
SETB IT0; set TCON
SETB EA; set IE
SETB EX0;
MOV R0,#10
SETB P1.0
HERE:SJMP HERE
EXINT0:
DJNZ R0,QUIT
CLR P1.0
CLR EX0 ;关闭INT0中断
QUIT:RETI
END
ORG 0000H
LJMP START
ORG 0003H
LJMP EXINT0
ORG 0100H
START:
MOV A,#0
SETB IT0; set TCON
SETB EA; set IE
SETB EX0;
SETB P1.0
SJMP $
EXINT0:
INC A
CJNE A,#10,QUIT
CLR P1.0
CLR EX0 ;关闭INT0中断
QUIT:RETI
END
1.2 某大楼内设置了4个监测点,2个监测点安装了2个烟雾检测器,另2个监测点安装了2个煤气检测器,监控室由4个指示灯分别显示每个检测点的状态。当有意外发生时,相应的指示灯亮,发出报警。设计一个以89C51单片机为核心的检测系统实现上述检测功能。
ORG 0000H
LJMP START
ORG 0003H
LJMP EXINT0
ORG 0013H
LJMP EXINT1
ORG 0100H
START:
SETB EA
SETB ET0
SETB ET1
SETB EX0
SETB EX1
MOV P1,#0FFH
SJMP $
EXINT0:
JB P1.0,NEXT1
CLR P1.4
NEXT1:JB P1.1,QUIT
CLR P1.5
LJMP QUIT
EXINT1:
JB P1.2,NEXT2
CLR P1.6
NEXT2:JB P1.3,QUIT
CLR P1.7
LJMP QUIT
QUIT:RETI
END
2.定时/计数功能
对机器周期进行计数,每个机器周期计数器+1,直到计数器溢出
写入控制字的次序:
- 把工作方式控制字写入TMOD寄存器;TMOD 不能位选
- 把定时/计数初值装入TL0、TH0(或TL1、TH1);
- 置位ET0(或ET1),允许定时器/计数器中断;
- 置位EA开放总中断;
- 置位TR0(或TR1)以启动计数
2.0 工作方式0
2.1 工作方式1
2.1.0 设单片机的晶振频率为11.0592MHz,使用T1以方式1产生频率为131Hz的方波型音频信号(低音的Do),并由P1.0输出给与其相连的喇叭。
ORG 0000H
LJMP START
ORG 001BH
LJMP INTT1
ORG 0100H
START:
MOV TMOD,#00010000B
SETB EA
SETB ET1
MOV TH1,#0F2H
MOV TL1,#42H
SETB TR1
SJMP $
INTT1:
CPL P1.0
MOV TH1,#0F2H
MOV TL1,#42H
RETI
END
2.2 工作方式2 p160
2.2.1 设系统时钟频率为12MHz,用定时器/计数器T0编程实现从P1.0输出周期为500μs的方波。
解:由于时钟频率为12MHZ,机器周期为1µs。 P1.0输出周期为500μs的方波,只需P1.0每250μs取反1次即可。定时/计数器T0选择工作方式2。首先求出定时器T0初值。
因为:t =(2^8-T0初值)× 机器周期
所以,当t = 250μs时,
则:(2^8-T0初值)× 1 × 10^(-6) = 2.5 × 10^(-4)
解得:T0初值 = 6,TH0 = TL0 = 6。
ORG 0000H
LJMP START
ORG 000BH
LJMP INTT0
ORG 0100H
START:
MOV TMOD,#00000010B
MOV TH0,#06H
MOV TL0,#06H
SETB ET0
SETB EA
SETB TR0
SJMP $
INTT0:
CPL P1.0
MOV TH0,#06H
MOV TL0,#06H
RETI
END
2.2.2 有一自动罐装药粒系统,每瓶罐装药粒50片,每片药粒灌装时产生一个负脉冲送T0计数;每满一瓶,累加器A加1,若满100瓶,则由与P1.0口相连的LED给出一个装箱信号,然后停止计数。要求用T0以工作方式2计数。
解:(1)计算计数初值
设待求的计数初值为X,则:
X =2^8-50
得: X=206
则: TH0=206,TL0=206。
(2)TMOD寄存器初始化
ORG 0000H
LJMP START
ORG 000BH
LJMP INTT0
ORG 0100H
START:
MOV TMOD,#00000110B
SETB EA
SETB ET0
MOV TH0,#206
MOV TL0,#206
MOV R0,#100
SETB TR0
SJMP $
INTT0:
DJNZ R0,QUIT
CLR P1.0
CLR TR0
QUIT:RETI
END
ORG 0000H ;主程序
LJMP START
ORG 000BH
LJMP T0INT
ORG 0100H ;初始化
START:MOV TMOD,#6H
MOV TH0,#206H
MOV TL0,#206H
SETB P1.0
SETB EA
SETB ET0
MOV A,#0
SETB TR0
;循环判断
LOOP: CJNE A, #100, NEXT
CLR P1.0 ;亮灯
CLR TR0 ; 停止计数
NEXT:SJMP LOOP
;中断程序
T0INT: INC A ;计数+1
RETI
END