任务一:
1、五个中断要求:2个定时器中断、2个外部中断、1个串行端口中断
2、中断控制寄存器
(1)IE(中断使能寄存器)
EA |
- |
- |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
EX0:使能外部/INT0的中断;
ET0:使能TIMER0的中断;
EX1: 使能外部/INT1的中断;
ET1: 使能TIMER1的中断;
ES:使能串行口的中断。
EA:如果EA=0时,屏蔽所有中断;如果EA=1,则各中断由各中断为加以设定;
(2)IP(中断优先权控制寄存器)
- |
- |
- |
PS |
PT1 |
PX1 |
PT0 |
PX0 |
PX0:定义外部/INT0的优先权;
PT0:定义外部TIMER0的优先权;
PX1:定义外部/INT1的优先权;
PT1:定义外部TIMER1的优先权;
PS:定义串行端口的优先权;
3、定时器0和定时器1和外部中断
定时器或计数器的功能是由特殊功能寄存器内TMOD的C/T位所决定的。这两个定时器有4种工作方式,它是由TMOD内的两个位M1和M0加以选择。
(1)TMOD(定时器模式控制寄存器)说明如下:
TIMER1 |
TIMER0 | ||||||
GATE |
C/T |
M1 |
M0 |
GATE |
C/T |
M1 |
M0 |
定时器模式控制器各位名称
M1 M0:工作方式,如下表所示:
M1 |
M0 |
工作方式 |
功 能 |
0 |
0 |
MODE0 |
13位定时器/计数器 |
0 |
1 |
MODE1 |
16位定时器/计数器 |
1 |
0 |
MODE2 |
8位定时器/计数 自动载入 |
1 |
1 |
MODE3 |
(TIMER0)TL0为8位定时器/计数器,由T0控制;TH0为另一个8位定时器,由T1控制 |
1 |
1 |
MODE3 |
(TIMER1) 定时器/计数器1停止定时计数 |
GATE:当TRX=1且GATE=1时,定时器只在/INTX引脚为高电平时才会计时;当GATE=0时,则定时器只在TRX=1时会计时;
C/T:C/T=0时为定时器,C/T=1时为计数器。
(2)TCON(定时器控制寄存器)
TF1 |
TR1 |
TF0 |
TR0 |
IE1 |
IT1 |
IE0 |
IT0 |
TCON定时器控制寄存器各位名称
IT0:/INT0的中断电位控制,IT0=1时为下降沿触发,IT0=0时为低电平触发;
IE0:/INT0的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。
IT1:/INT0的中断电位控制,IT1=1时为下降沿触发,IT1=0时为低电平触发;
IE1:/INT0的中断标志位,当中断发生时,硬件会设定此位;当中断被处理时,硬件会清除此位。
TR0:TIMER0的启动位,TR0=1时为启动,0时为停止;
TF0:TIMER0的溢出标志位,当TIMER0溢出时,会设定为1;当执行中断子程序时会清除为0。
TR1:TIMER1的启动位,TR1=1时为启动,0时为停止;
TF1:TIMER1的溢出标志位,当TIMER1溢出时,会设定为1;当执行中断子程序时会清除为0。
任务二:
1、打开WAVE软件,新建一个文件,输入以下程序:
#include<reg52.h>
sbit a0=P3^5;
sbit a1=P3^4;
char date[3];
int C100us;
int m=0,n=0,o=0;
void T0Int(void) interrupt 1 using 0 //T0中断服务函数
{
C100us--;
if(C100us==0) //100us计数器为0,重置计数器
{C100us=20000;
m++;
date[0]=date[0]+1;
if(m==10)
{n++;
m=0;
date[0]=0x00;
date[1]=date[1]+1;
}
if(n==6)
{o++;
n=0;
date[1]=0x10;
date[2]=date[2]+1;
}
if(n==10){n=0; date[1]=0x20;}
}
}
void main(void) //主函数
{unsigned int i,j=0;
TMOD=0X02; //设置T0工作方式与初值
TH0=0xd2;
TL0=0x00;
IE=0X82; //开中断
date[0]=0x00;
date[1]=0x10;
date[2]=0x20;
C100us=20000;
while(1)
{TR0=0;
P0=date[0];
for(i=0;i<100;i++);
P0=date[1];
for(i=0;i<100;i++);
P0=date[2];
for(i=0;i<100;i++);
if(a0==0)
{j=1;
TR0=1; //启动定时器0
while(j)
{P0=date[0];
for(i=0;i<100;i++);
P0=date[1];
for(i=0;i<100;i++);
P0=date[2];
for(i=0;i<100;i++);
if(a1==0){j=0;TR0=0;}
}
}
if(a1==0)
{if(a0==0)
{
date[0]=0x00;
date[1]=0x10;
date[2]=0x20;
}
}
}
}