- void init_tmr0()
- {
- T0CS=0; //TMR0工作于定时器方式
- T0IE=1;//Timer0中断允许
- GIE=1;
- TMR0=0xFF;
- T0IF=0; //清除TMR0的中断标志
- }
- void interrupt compare()
- {
- if(T0IF && T0IE)
- {
- TMR0=0xFF; //对TMR0写入一个调整值。因为写入TMR0后接着的
- //两个周期不能增量,中断需要3个周期的响应时间,
- //以及C语言自动进行现场保护要消耗周期
- T0IF=0; //清除中断标志
- if(++ms==25)
- {
- ms=0;
- if(++s==1000)
- {
- s=0;
- RB3=!RB3;
- }
- }
- }
- }
复制代码
为什么我改变TMR0的值,定时中断并没有改变呢?这个计算公式是什么
此帖出自
小平头技术问答
- /TMR0初始化子程序
- void tmint()
- {
- T0CS=0; //TMR0工作于定时器方式
- PSA=1; //TMR0不用分频
- T0IF=0; //清除TMR0的中断标志
- T0IE=1; //TMR0中断允许
- }
复制代码- //中断服务程序
- void interrupt clkint(void)
- {
- TMR0=0X13; //对TMR0写入一个调整值。因为写入TMR0后接着的
- //两个周期不能增量,中断需要3个周期的响应时间,
- //以及C语言自动进行现场保护要消耗周期
- T0IF=0; //清除中断标志
- CLRWDT();
- sreg=sreg+1; //中断计数器加1
- if(sreg==40) //中断次数为40后,才对S0,S1,S2,S3 操作
- {
- sreg=0;
- s0=s0+1;
- if(s0==10){
- s0=0 ;
- s1=s1+1;
- if(s1==10){
- s1=0 ;
- s2=s2+1;
- if(s2==10){
- s2=0;
- s3=s3+1;
- if(s3==10) s3=0 ;
- }
- }
- }
- }
- s[0]=s0;
- s[1]=s1;
- s[2]=s2;
- s[3]=s3;
- }
复制代码一般是先
T0IF=0; //清除TMR0的中断标志
然后在
T0IE=1; //TMR0中断允许
另外你的 PSA=1; //TMR0不用分频
也没有。
还是一样的效果
- //------------------------------------------------------------------
- //TMR0初始化子程序
- void init_tmr0()
- {
- //Timer0初始化设置
- T0CS=0;
- PSA=1;//Timer0不使用预分频器
- //外部时钟定时方式
- T0IF=0;//清除TMR0的中断标志
- T0IE=1;//Timer0中断允许
- //GIE=1;
- }//------------------------------------------------------------------
- //中断入口函数
- void interrupt compare()
- {//定时器中断
- if(T0IF && T0IE)
- {
- TMR0=0xFF; //对TMR0写入一个调整值。因为写入TMR0后接着的
- //两个周期不能增量,中断需要3个周期的响应时间,
- //以及C语言自动进行现场保护要消耗周期
- T0IF=0; //清除中断标志
- if(++ms==25)
- {
- ms=0;
- if(++s==1000)
- {
- s=0;
- RB3=!RB3;
- }
- }
- }
- }
复制代码是什么地方设置的不对吗
一周热门 更多>