硬件应该是没什么问题,
使用可控硅调光,检测过零点进入中断。
- 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,无法退出。
|