51单片机定时器问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机定时器问题相关的知识,希望对你有一定的参考价值。
在执行定时器中断函数的时,定时器会继续计数,还是等定时器中断函数执行完之后,再继续计数?我发现我在定时器中断函数中写的指令很长的话,定时器就会出现问题。。求解答~
定时器中断服务程序执行时,计数是不会自行中断的,所以编写中断服务程序一般要求是:1、要尽可能的短小
2、不要在里面延时
如果以上两点无法避免,那么可以采用暂停计数的处理来避免出现你想象中的问题举例如下:
void t0isr() interrupt 1
TR0=0;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=1;
PULSE=~PULSE;
参考技术A 定时器应该是再跑的,你可能没跑完就又进中断了 参考技术B 一直在计数,溢出就归零重新计数, 所以一般都尽可能减少定时器中的程序。 参考技术C 是等定时器中断函数执行完之后,继续计数的,在定时器里写的程序应该尽量短,不然会影响定时器工作。。你发现的问题就是这样 没错 所以不要再定时器那边写很多的程序 能短尽量短,因为程序长了 超过了你定时的时间 这样 定时时间就不准了
单片机c语言编程问题,功能是用定时器T0使发光管间隔200ms闪烁,定时器T1使数码管循环显示0-59.
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit led1=P1^0;
uchar num,num1,num2,shi,ge;
uchar code tabledula[]=
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
;
void delayxms(uint xms);
void desplay(uchar shi,uchar ge);
void main()
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
desplay(shi,ge);
void delayxms(uint xms)
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
void desplay(uchar shi,uchar ge)
dula=1;
P0=tabledula[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayxms(5);
dula=1;
P0=tabledula[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayxms(5);
void T0_time() interrupt 1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
num1=0;
led1=~led1;
void T1_time() interrupt 3
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)
num2=0;
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
如上程序所示,在最后的中断函数void T1_time() interrupt 3
中的"num2=0;"这句如果少了的话,竟然也会实现数码管0-59循环显示,只不过时间不是一秒间隔,而是好几秒,谁能告诉我这是为什么?因为少了这句的话从程序上看应该只会显示0然后1,然后就不变了。
num2++;
if(num2==20)
num2=0;//少了这句,num2会持续增长,长到255后,才变成0。
……
num2:0~255,只有在=20时,数字才加一。
那么,就是约12.5秒,数字才加一。 参考技术A 溢出了
然后就从0开始累加 然后你懂得的 参考技术B 有点晕
以上是关于51单片机定时器问题的主要内容,如果未能解决你的问题,请参考以下文章