这是源程序代码
#include <reg52.h>
void delay()/*延时50ms子程序*/
{
TMOD=0x01;
TH0=0x3c;
TL0=0x0b0;
TR0=1;/*50毫秒*/
if(TF0==1)
{
TR0=0;
TF0=0;
}
}
void main()
{
unsigned char i;
while(1)/*间隔闪烁1秒*/
{
P1=0x00;/*等全亮*/
for(i=1;i<=20;i++)/*20次延时,达到一秒延时*/
delay();
P1=0xff;/*全暗*/
for(i=1;i<=20;i++)
delay();
}
}
这个程序有什么问题,忘指教。不要复制,敷衍我。谢谢各位的帮助
delay()实现里面不能用if来判断TF0,因为程序运行到这时定时计数器还在计数,TH0还没有溢出,TF0还是0;所以你要用个while(!TF0);让程序在这等一下,等到TH0溢出,这时TF0被硬件自动置1,while(!TF0)循环结束,程序继续往下走,这时令TR0=0,关闭定时器。delay()运行完总共延时也就是50毫秒。以方式0为例():
delay是有毛病,不过延时程序不一定要用中断吧,我调试了很久,发现终于可以了。只要把delay函数改为这样就行了
#include
void delay()/*延时50ms子程序*/
{
TMOD=0x01;
TH0=0x3c;
TL0=0x0b0;
TR0=1;/*50毫秒*/
while(!TF0);
TR0=0;
TF0=0;
}
好吧,本来我也想跟你说这种方式的,等待标志位置位。不过我想这种方式实在是不值得使用
本回答被提问者采纳这个程序在main函数中没有用到啊?还有这个函数头是什么意思?有看过这个函数,但是不能理解这里边的原理?void time0(void) interrupt 1 using 1