51中断的问题,要求INT0中断和TIM0计数中断
要求INT0中断后, TIME0才开始计数外部脉冲,两次脉冲溢出中断,P1亮灯,如果INT0没有中断,TIME0是不会中断的.
实现的效果是外部中断INT0对外部电平的检测,等待电平下降沿中断,低电平触发后,等待TIM0的下降沿脉冲,两次脉冲后中断,此时P0口输出高电平控制继电器开关,控制外部直流电动机的动作。一次动作完成后,重复等待外部INT0的中断,循环往复。
本人对51程序不是很会,按自己的思想写了一些程序,但是仿真出来是INT0中断P0就动作,反而计数时不动作 why?、求解
#include<reg51.h> // 包含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;
}