#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint count,flag=0;
void mian()
{
P1=0xff;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(count==10)
{
count=0;
if(flag%2==0)
{
P1=0xaa;
flag=1;
}
else
{
P1=0x55;
flag=0;
}
}
}
}
void ad() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
}
好奇怪,上面的程序灯都不亮,但是我稍稍一改等就能亮,修改如下
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint count,flag=0;
void mian()
{
P1=0xff;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
while(1);
}
void ad() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
count++;
if(count==10)
{
count=0;
if(flag%2==0)
{
P1=0xaa;
flag=1;
}
else
{
P1=0x55;
flag=0;
}
}
}
但改过之后count为10,100时灯交替的时间基本上没变化,很奇怪啊,相差10倍呢,等我调到1000,灯就都不亮了,是怎么回事?
你写的这个我懂,我只想知道我的程序错在哪?还有,中断函数不必非要放在main函数之前,写time0或ad是随便的,只是一个名字而已。用定时器控制时间比较准确,可以随意设置。你写的延时函数不如定时器精准,时间长了会出现较大误差
晶振是12M,采用计数器0的方式1,级数初值是15535,即每计数完一个周期是50毫秒,我设count为10,刚好是500毫秒。count调到1000就灯不亮了,10,100的频率基本一样,flag是用来区分不同次数的,够详细了吧
追答你改后把中断程序内容写得太多是不对的。开始的程序是没有问题的,你试试对P1口进行位操作,看看运行结果。
怎么说呢,count为10,100时灯交替的时间基本上没变化,很奇怪啊,相差10倍呢,等我调到1000,灯就都不亮了,你知道是怎么回事?