想让单片机控制定时器延时闪烁,但是灯却一直亮着,没有达到要的效果(用c语言控制的)

这是源程序代码
#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为例():

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-30
定时器 的使用方法不对,延时程序不是这样写的
试试这个
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit p0=P1^0; // 这是一个灯的亮 / 灭。
uchar tt;
void main()
{
tt=0;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if(tt==10)
{
tt=0;
p0 = ~p0;
}
}
}
void timer0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
tt++;
}
第2个回答  2012-08-30
delay函数有毛病,用定时器延时,不是这么用的,要用中断方式。你这个程序的写法起不到延时作用。其实你的灯不是一直亮着,而是一直“半亮着”,也就是高频率闪烁,你的眼睛没有分出来而已。
再去学习一下中断的使用吧追问

delay是有毛病,不过延时程序不一定要用中断吧,我调试了很久,发现终于可以了。只要把delay函数改为这样就行了
#include
void delay()/*延时50ms子程序*/
{
TMOD=0x01;
TH0=0x3c;
TL0=0x0b0;
TR0=1;/*50毫秒*/
while(!TF0);
TR0=0;
TF0=0;
}

追答

好吧,本来我也想跟你说这种方式的,等待标志位置位。不过我想这种方式实在是不值得使用

本回答被提问者采纳
第3个回答  2012-08-30
#include<reg52.h>
unsigned char num;
sbit led=P1^3;
void main(void)
{
led=0;
TMOD|=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void time0(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num=num+1;
if(num==20)
{
num=0;
led=~led;
}
}
给你个程序参考一下,我这个是成功的,延时一秒闪烁,一楼说的对,你这错误太大了追问

这个程序在main函数中没有用到啊?还有这个函数头是什么意思?有看过这个函数,但是不能理解这里边的原理?void time0(void) interrupt 1 using 1

第4个回答  2012-08-30
delay(),看不出能够延时50毫秒啊?
if(TF0==1)后面应该有个else 之类的吧?要不在哪里延时等待啊?