要求INT0中断后, tiME0才开始计数外部脉冲,两次脉冲溢出中断,P1亮灯,如果INT0没有中断,TIME0是不会中断的. 实现的效果是外部中断INT0对外部电平的检测,等待电平下降沿中断,低电平触发后,等待TIM0的下降沿脉冲,两次脉冲后中断,此时P0口输出高电平控制继电器开关,控制外部直流电动机的动作。一次动作完成后,重复等待外部INT0的中断,循环往复。 本人对51程序不是很会,按自己的思想写了一些程序,但是仿真出来是INT0中断P0就动作,反而计数时不动作 why?、求解 #include // 包含51单片机寄存器定义的头文件
void Delay(unsigned int i) { unsigned int j; for(;i>0;i--) for(j=0;j<125;j++) {;} }
/************************************************************** 函数功能:主函数 **************************************************************/ void main(void) { EA=1; //开总中断
TMOD=0x0B; //使用计数器的T0的模式2 TH0=(65536-65534)/256; //计数两次溢出 TL0=(65536-65534)%256;
EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断 P1=0x00;
while(1);//无限循环等待中断
}
/************************************************************** 函数功能:外部低电平中断服务程序 **************************************************************/
void int0(void) interrupt 0 //外中断0的中断编号为0 { IE0=0; //清INT中断标志位 EX0=0; //清INT中断使能位 ET0=1; //定时中断使能位 TR0=1; //启动定时器T0
} /************************************************************** 函数功能:定时器T0的中断服务程序 **************************************************************/ void Time0(void) interrupt 1 //"interrupt"声明函数为中断服务函数 //其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器 { TF0=0; //清定时中断标志位 ET0=0; //定时中断使能位 EX0=1; //INT中断使能位
TH0=(65536-65534)/256; //计数两次溢出 TL0=(65536-65534
)%256;
P1=0x01; //溢出中断则灯亮0.1秒就熄灭。 Delay(100); P1=0x00; }
|