采用MCS-51单片机控制8只LED交替闪烁,间隔是500毫秒,看我以下的程序错在哪?怎么仿真不出来?

#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,灯就都不亮了,是怎么回事?

第1个回答  2011-09-13
把中断函数放到MAIN函数之前,而且要中断函数起始行写成void Timer0() interrupt 1,而不是你写的AD()。然后不是很建议此类函数使用定时器中断延时。可以自己写一个延时子函数,通过调用延时子函数实现延时。
程序如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
void mDelay(uint Delay)
{ uint i;
for(;Delay>0;Delay--)
{ for(i=0;i<124;i++)
{;}
}
}
void main()
{ P1=0xff;
while(1)
{
P1=0xaa;
mDelay(500);
P1=0x55;
mDelay(500);
}
}追问

你写的这个我懂,我只想知道我的程序错在哪?还有,中断函数不必非要放在main函数之前,写time0或ad是随便的,只是一个名字而已。用定时器控制时间比较准确,可以随意设置。你写的延时函数不如定时器精准,时间长了会出现较大误差

第2个回答  2011-09-13
问题非常的简单,主函数的名字写错了!!!!!! 应该是 void main() 不是 void mian()!!!!!!!!!
第3个回答  2011-09-13
void mian()
……
主函数,应该是:
main()本回答被提问者采纳
第4个回答  2011-09-13
你一个注释都没有,很难猜到你的意思。你的晶振是多少M?可能是你的延时时间不够,由于人眼的暂留,你看不到它灭。把计数器提高到1000看一看。追问

晶振是12M,采用计数器0的方式1,级数初值是15535,即每计数完一个周期是50毫秒,我设count为10,刚好是500毫秒。count调到1000就灯不亮了,10,100的频率基本一样,flag是用来区分不同次数的,够详细了吧

追答

你改后把中断程序内容写得太多是不对的。开始的程序是没有问题的,你试试对P1口进行位操作,看看运行结果。

第5个回答  2011-09-13
仿真是什么出不来,是灯不交替闪烁还是时间不对?追问

怎么说呢,count为10,100时灯交替的时间基本上没变化,很奇怪啊,相差10倍呢,等我调到1000,灯就都不亮了,你知道是怎么回事?