单片机定时中断问题

tafengtianya 2016-07-16 02:12:07
本来定时0.01ms产生中断,计数500不应该是5ms一个周期吗,为什么仿真时候得不到5ms一个周期,是因为定时越小精度受影响和单片机语句运行时间吗,求问大神,以下是我的代码:
#include<reg52.h>
sbit pwm=P2^0;
sbit key1=P0^0;
sbit key2=P0^1;
bit keybuf1=1;
bit backup1=1;
bit keybuf2=1;
bit backup2=1;
unsigned int m=250;
unsigned int cnt=0;
/*void delay(unsigned int i)
{
while(i--);
} */
void InterruptTimer0() interrupt 1
{

TH0=(65536-10)/256;
TL0=(65536-10)%256;
cnt++;
if(cnt<m)
pwm=1;
else
pwm=0;
if(cnt==500)
{
cnt=0;

}

}
void main()
{
EA=1;
ET0=1; //定时器0中断使能
TMOD=0x01;//定时0工作在方式1,1ms中断1次
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
while(1) ;


}

...全文
157 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tafengtianya 2016-07-18
  • 打赏
  • 举报
回复
引用 4 楼 xgywd 的回复:
[quote=引用 3 楼 tafengtianya 的回复:]

#include<reg52.h>
sbit pwm=P2^0;
sbit key1=P0^0;
sbit key2=P0^1;
bit keybuf1=1;
bit backup1=1;
bit keybuf2=1;
bit backup2=1;
unsigned int m=250;
unsigned int cnt=0;
/*void delay(unsigned int i)
{
        while(i--);
} */
void InterruptTimer0() interrupt 1
{

TH0=(65536-10)/256;
TL0=(65536-10)%256; 
cnt++;

}
void main()
{	
    EA=1;
    ET0=1;	  //定时器0中断使能
    TMOD=0x01;//定时0工作在方式1,1ms中断1次
    TH0=(65536-10)/256;
    TL0=(65536-10)%256; 
    TR0=1;
while(1)
 {
    if(cnt<m)
    pwm=1;	
    else
    pwm=0;
    if(cnt==500)
    {
        cnt=0;
    }
 }
}
把中断里的东西移到中断外面去运行,这样中断就可以在周期之内运行完毕了,不会影响下次中断. 如果你还闲误差太大.那只有计算一下调用函数浪费的时间了,然后在定时器里把这个时间平掉.不过你做的再准也白费,proteus本身它就不是准的.
谢谢
tafengtianya 2016-07-18
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
用模式2,定时器自动重装载模式 , 从硬件上消除累计误差 16位 用定时器2
谢谢指教
hbxfxfms 2016-07-18
  • 打赏
  • 举报
回复
作为一个新手 学到了
五号智能 2016-07-18
  • 打赏
  • 举报
回复
楼上正解,我忽略了函数本身就是在定时器中断之后进行的.装载初值也是需要时间的.
zgl7903 2016-07-18
  • 打赏
  • 举报
回复
用模式2,定时器自动重装载模式 , 从硬件上消除累计误差 16位 用定时器2
五号智能 2016-07-18
  • 打赏
  • 举报
回复
[quote=引用 3 楼 tafengtianya 的回复:]

#include<reg52.h>
sbit pwm=P2^0;
sbit key1=P0^0;
sbit key2=P0^1;
bit keybuf1=1;
bit backup1=1;
bit keybuf2=1;
bit backup2=1;
unsigned int m=250;
unsigned int cnt=0;
/*void delay(unsigned int i)
{
        while(i--);
} */
void InterruptTimer0() interrupt 1
{

TH0=(65536-10)/256;
TL0=(65536-10)%256; 
cnt++;

}
void main()
{	
    EA=1;
    ET0=1;	  //定时器0中断使能
    TMOD=0x01;//定时0工作在方式1,1ms中断1次
    TH0=(65536-10)/256;
    TL0=(65536-10)%256; 
    TR0=1;
while(1)
 {
    if(cnt<m)
    pwm=1;	
    else
    pwm=0;
    if(cnt==500)
    {
        cnt=0;
    }
 }
}
把中断里的东西移到中断外面去运行,这样中断就可以在周期之内运行完毕了,不会影响下次中断. 如果你还闲误差太大.那只有计算一下调用函数浪费的时间了,然后在定时器里把这个时间平掉.不过你做的再准也白费,proteus本身它就不是准的.
hanson69 2016-07-17
  • 打赏
  • 举报
回复
应该是(65536-9216),不是65536-10,定时时间算错了,当然不准了。
tafengtianya 2016-07-17
  • 打赏
  • 举报
回复
引用 2 楼 xgywd 的回复:
且proteus仿真的时间,一分钟能差好几秒. 比正常时间慢很多,而且,,你的处理函数时间太长了.那么多语句.中断10微秒来一次,在你中断里就运行了10多微秒,进中断函数还要消耗很长时间,你这个波形真的是太正常了.
谢谢,若有所悟了,还想问一下怎么样才能更好的减小误差,除了我把中断里面处理的语句减小。
五号智能 2016-07-17
  • 打赏
  • 举报
回复
且proteus仿真的时间,一分钟能差好几秒. 比正常时间慢很多,而且,,你的处理函数时间太长了.那么多语句.中断10微秒来一次,在你中断里就运行了10多微秒,进中断函数还要消耗很长时间,你这个波形真的是太正常了.

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧