//若系统时钟频率为60MHZ,编写软件实现:按一下按键,产生一次外部中断0中断信号,启动T1计时,使P1.0输出周期为1ms的方波。
1、汇编查询
ORG 0000H //汇编查询
LJMP MAIN
MAIN: MOV SP, #60H
MOV TMOD, #20H //工作方式选择为
MOV TL1, #06H //设置定时器1初值
MOV TH1, #06H
CLR TR1
SETB ET1 //中断初始化
SETB EX0
CLR IT0
SETB EA
EXINT0:JB P3.2, EXINT0
SETB TR1
TIMER1:JNB TF1,TIMER1
CLR TF1
CPL P1.0
SJMP TIMER1
END
2、汇编终端
ORG 0000H //汇编中断方式
LJMP MAIN
ORG 0003H
SETB TR1
RETI
ORG 001BH
CPL P1.0
RETI
MAIN:MOV SP, #60H
MOV TMOD, #20H //选择工作方式
MOV TL1, #06H //设置定时器1初值
MOV TH1, #06H
CLR TR1 //中断初始化
SETB ET1
SETB EX0
SETB IT0
SETB EA
HERE: AJMP HERE
END
ORG 0000H //汇编中断方式
LJMP MAIN
ORG 0003H
LJMP EX0INT
ORG 001BH
LJMP T1INT
MAIN:MOV SP, #60H
MOV TMOD, #20H//选择工作方式
MOV TL1, #06H//设置定时器1初值
MOV TH1, #06H
CLR TR1 //中断初始化
SETB ET1
SETB EX0
SETB IT0
SETB EA
EX0IN:SETB TR1 //开启定时器
RETI //中断返回
T1INT:CPL P1.0 //P1.0取反
RETI
END
3、C51查询
#include <reg52.h> //中断查询
sbit P10 = P1^0;
sbit P32 = P3^2;
void main()
{
SP=0x60;
TMOD = 0x20; //选择工作模式2
TH1 = 0x06; //设置T1定时器初值
TL1 = 0x06;
TR1 = 0; // 初始化
ET1 = 1; //定时器溢出允许控制位
IT0 = 1; //中断触发控制方式
EX0 = 1; //外部中断0允许控制位
EA = 1; //开总中断
while(!IE0); //循环查询
TR1 = 1; //启动T1
while(1)
{
if(TF1)
{
P10 = !P10; //当TF1=1时,P1.0求反
TF1 = 0; //TF1定时器溢出中断请求标志位清零
}
}
}
4、C51中断
#include <reg52.h> //C中断方式
sbit P10 = P1^0;
void main()
{ SP=0x60;
TMOD = 0x20; //选择工作模式2
TH1 = 0x06; //设置T1定时器初值
TL1=0x06;
TR1 = 0; // 初始化
ET1 = 1; //定时器溢出允许控制位
EX0 = 1; //外部中断0允许控制位
IT0 = 1; //中断触发控制方式,下降沿触发
EA = 1; //开总中断
while(1);
}
void exint0() interrupt 0 //外部中断0
{ TR1 = 1; //开定时器
}
void timer1() interrupt 3 //定时器中断
{
P10 = !P10; }