[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode
#include<STC12C20XX.H>
sbit led1=P1^5;
sbit led2=P1^3;
sbit led3=P1^2;
unsigned char count=0;
unsigned char INT_tag=0;
int count_T0 = 0; //记录T0的中断次数
void main(void)
{
EA=1; //开启总中断
IT1=1; //设置INT1下降沿中断
EX1=0; //关闭INT1外部中断
led3=0; //让LED3先亮
//以下是定时器操作
ET0 = 1; //开定时器0中断
//设置定时器0为50ms延时
AUXR &= 0x7F; //定时器始终12T分频模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时器初值
TH0 = 0x4C; //设置定时器初值
TF0 = 0; //清楚TF0标志
TR0 = 1; //定时器0开始计时
while(1)
{
}
}
void T0_interrupt(void) interrupt 1
{
TF0 = 0; //清楚TF0标志
//重装50mS的延时
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值
if(++count_T0 == 100) //==100表明延迟了5秒
{
count_T0 = 0;
if(INT_tag==0)
{
INT_tag=1;
led3=0; //点亮LED3
EX1=1; //开启INT1外部中断
}
else
{
INT_tag=0;
led3=1; //熄灭LED3
EX1=0; //关闭INT1外部中断
}
}
}
void INT1_interrupt(void) interrupt 2
{
if(count==0)
{
led1=~led1;
count++;
}
else
{
if(count==1)
{
led2=~led2;
count++;
}
}
if(count>1)
count=0;
IE1 =0; //中断在最后清0,这个很重要,理论上是硬件自动清除,但是在中断执行的时间当中,有可能再次被挂起
}