硬件应该是没什么问题,
使用可控硅调光,检测过零点进入中断。
TMOD|=0x01;
IT0=1;//INT0下降沿触发
EX0=1;//外部中断允许
ET0=1;
ET1=1;
EA=1;//开总中断
中断处理
void INT0s()interrupt INT0_VECTOR using 0//INT0外部中断,过零检测触发
{
TR0=0;
if(!key0)//降低亮度
{
inc+=50;
if(inc>=8000)inc=8000;
}
if(!key1)//增加亮度
{
inc-=50;
if(inc<=800)inc=800;
}
TH0=(65536-inc)/256;
TL0=(65536-inc)%256;
TR0=1;
}
void timer1()interrupt TIMER0_VECTOR using 1//可控硅触发中断
{
unsigned char i;
lamp_pwm1=0;//灯亮
for(i=0;i<2;i++);//延时2us
lamp_pwm1=1;//灯灭
}
这段程序也没有问题,我想再开启一个定时器1.
void Timer1_init(void)
{
TR1 = 0; //停止计数
#if (Timer1_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
#error "Timer1设置的中断过快!"
#elif ((Timer1_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
ET1 = 1; //允许中断
// PT1 = 1; //高优先级中断
TMOD &= ~0x30;
TMOD |= (0 << 4); //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
// TMOD |= 0x40; //对外计数或分频
TMOD &= ~0x40; //定时
// INT_CLKO |= 0x02; //输出时钟
INT_CLKO &= ~0x02; //不输出时钟
#if (Timer1_Reload < 65536UL)
AUXR |= 0x40; //1T mode
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
TL1 = (u8)((65536UL - Timer1_Reload) % 256);
#else
AUXR &= ~0x40; //12T mode
TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
#endif
TR1 = 1; //开始运行
#else
#error "Timer1设置的中断过慢!"
#endif
}
void time1_initS(void)
{
// init_timer();
TR1 = 0; //停止计数
AUXR &= ~0x40; //12T mode
TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
TR1 = 1; //开始运行
}
可是一直无法进入定时器1这个中断,我后来发现关闭定时器0,才可以进去。
现在好像是定时器0的优先级太高,一直再执行定时器0,无法退出。 |