89C52达不到100KHz的方波输出精度,主要原因
可能在于程序尤其是切换中断程序执行会耗费时间,而且中断程序执行也会耗费时间的,所以精度是上不来。
其二,手动载入THx、TLx计数量,没有机器自动载入来的快,所以还是用自动载入吧!通过查询方式计时的方式那就更没精度可谈了!
#include
sbit output=P1^1;
sbit s1=P2^0;
sbit s2=P2^1;
sbit s3=P2^2;
sbit s4=P2^3;
sbit s5=P2^4;
sbit s6=P2^5;
sbit s7=P2^6;
sbit s8=P2^7;
char port2;
unsigned int count=0;
main()
{
IE=0xA8; //10101000
TMOD=0x20; //00100000
T2CON=0x00;
//TMOD=0x01;
output=1;
P2=0xff;
while(1)
{
port2=P2;
TR1=0;
TR2=0;
if(s1==0)count=5; //即使使用mode2自动载入,也达不到想要的精度!
else if(s2==0)count=10;
else if(s3==0)count=50;
else if(s4==0)count=100;
else if(s5==0)count=500;
else if(s6==0)count=1000;
else if(s7==0)count=5000;
else if(s8==0)count=10000;
if(count > 300 ){
RCAP2H=(65536-count)/256;
RCAP2L=(65536-count)%256;
TH2=RCAP2H;
TL2=RCAP2L;
TR2=1;
TR1=0;
}else
{
TH1=256-count;
TR1=1;
TR2=0;
}
while(port2==P2);
}
}
void timer2_isvof()interrupt 5
{
output=~output;
TF2=0; //必须手动清除Timer2的中断标志位,否则程序会经常自动进入中断程序。
}
void timer1_isvof()interrupt 3
{
output=~output;
}
阅读(1342) | 评论(0) | 转发(0) |