标题: 循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么? [打印本页]
作者: zy02752003 时间: 2015-10-31 12:33
标题: 循环等待定时器中断后,累加次数只要一多,时间就不准,这是为什么?
HI,ALL
本来是红外发射码,但是发现只要定时器用得多了,就有问题,只能将代码一点一点删除,现在就剩下发38K脉冲持续500次,延时一段时间,再循环。实测38K持续时间忽长忽短,不知所以,请大侠解释一下。。
#include <reg51.h>
//#include <C51_ZY.h>
sbit P1_1=P1^1; // LED
static bit OP; //the turn on or off of the IR led
sbit P1_3=P1^3; // IR pin
static unsigned char flag; //the flag of IRemission
static unsigned int lead_high;
static unsigned int lead_low;
static unsigned int count; //delaycount
static unsigned int endcount; //terminatecount
void SendIRdata(void);
void timer0_int(void);
void IR_transfer_test(void);
void delay_100ms(int);
void main(void)
{
IE=0x0;
P1_1=0;
//AUXR |= 0x80; //SET TIMER0 1T MODE
P1M1 &= 0xF7;
P1M0 |= 0x08; //SETP1_3 PUSH-PULL MODE
timer0_int();
IR_transfer_test();
}
void IR_transfer_test()
{
//int i;
// int j;
count=0;
flag=0;
OP=0;
P1_3=0;
lead_high=500;
lead_low=500;
do{
EA=1;
SendIRdata();
EA=0;
P1_3=0;
delay_100ms(1);
} while(1);
}
void SendIRdata()
{
endcount=lead_high;
flag=1;
count=0;
//ET0=1;TR0 = 1;
do{}while(count<endcount);
//TR0 = 0;ET0=0;
//endcount=lead_low;
//flag=0;
// count=0;
//ET0=1;TR0 = 1;
//do{}while(count<endcount);
// TR0 =0;ET0=0;
}
void timer0_int()
{
EA=1;
AUXR |= 0x80; //定时器时钟1T模式
TMOD &=0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0x64; //设置定时初值
TH0 = 0x64; //设置定时重载值
TF0 = 0; //清除TF0标志
ET0=1;
TR0 = 1; //定时器0开始计时
}
void timeint(void) interrupt 1
{
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P1_3= OP;
}
void delay_100ms(int k)
{
int i,j;
for(k;k>0;k--)
{
for(i=0;i<150;i++)
{
for(j=0;j<100;j++);
}
}
}
作者: wc86110 时间: 2015-11-24 07:56
这个问题建议加入汇编程序来解决延时会更精准。
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |