sunoracle 发表于 2012-7-20 09:53:36

请看程序,定时间隔10秒钟让led亮1秒钟

本帖最后由 sunoracle 于 2012-7-20 09:57 编辑

晶振是11.0592的,LED灯珠是低电平触发的。下面有段程序不会写,烦请看看,指点一二。 或者请写出其他方法...

#include<reg52.h>       

#define uchar unsigned char
#define uint unsigned int

sbit P2_0 = P2^0;
uint i;
uint T_count = 0;

void led() interrupt 1
{
        if (++T_count == 200 )//200个50ms,也就是10秒
        {
          P2_0 = 0;// LED点亮
          T_count = 0;       
        }
   //?????????此处如何让P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
}

void main()
{
        TMOD = 0x01;
        TH0 = 0x4C;       //50ms
        TL0 = 0x00;
        IE = 0x82;
        TR0 = 1;
        while(1);
}

sunoracle 发表于 2012-7-20 10:11:37

【2楼】
T1_count=1 second;这句怎么写啊

zyyn123 发表于 2012-7-20 10:27:50

sbit P2_0 = P2^0;
uint i;
uint T_count = 0;

void led() interrupt 1
{
        ++T_count;
        if(T_count>20)
                P2_0=1;
      if (T_count == 200 )//200个50ms,也就是10秒
      {
          P2_0 = 0;// LED点亮
          T_count = 0;      
      }
}

void main()
{
      TMOD = 0x01;
      TH0 = 0x4C;         //50ms
      TL0 = 0x00;
      IE = 0x82;
      TR0 = 1;
      while(1);
}

zlz 发表于 2012-7-20 10:41:04

EA没开能运行吗?

zlz 发表于 2012-7-20 10:48:19

使用状态机!
当led点亮时,加一句flag=1.
if(flag==1)
{
    if (++T_count == 20 )//20个50ms,也就是1秒
{
          P2_0 = 1;// LED熄灭
       T_count = 0;      
    }

}

BXAK 发表于 2012-7-20 10:58:27

typedefunsigned charuint8;
typedefunsigned int   uint16;
#include <reg52.h>         

#defineCPU_FOSC11059200UL    //11.0592MHz
#define_TIME0      50000            //50000us

#define_TL0      ((65536-_TIME0*(CPU_FOSC/200)/60000)%256)
#define_TH0      ((65536-_TIME0*(CPU_FOSC/200)/60000)/256)

sbit LED = P2^0;

uint8 count;

void Time0() interrupt 1
{
        TL0 = _TL0;
        TH0 = _TH0;

        if (++count == 200)    //200个50ms,也就是10秒
        {
                LED = 0;         // LED点亮
        }
        else if (count >= 220) //P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
        {
                LED = 1;
                count = 0;
        }
}

void main()
{
        count = 0;
       
        TMOD = 0x01;
        TH0 = _TH0;
        TL0 = _TL0;
        EA= 1;
        ET0 = 1;
        TR0 = 1;
       
        while (1);
}

xyr 发表于 2012-7-20 11:12:42

做个标记互锁

zenghui 发表于 2012-7-20 11:19:33

本帖最后由 zenghui 于 2012-7-20 11:24 编辑

7楼的代码中
      if (++count == 200)    //200个50ms,也就是10秒
      {
                LED = 0;         // LED点亮
      }
      else if (count >= 220) //P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
      {
                LED = 1;
                count = 0;
      }

我觉得改为
      if ((count++)< 200)    LED = 1; //200个50ms,也就是10秒LED灯灭
      else if ((count++)< 220)   LED = 0;//LED点亮
      else {LED = 1;count = 0;}
更加严谨一些

slzm40 发表于 2012-7-20 12:07:34

本帖最后由 slzm40 于 2012-7-20 14:12 编辑

sbit P2_0 = P2^0;
uint i;
uint T_count = 0;
bit flag;
uint T_count_1s=0;

void led() interrupt 1
{
      TH0 = 0x4C;         //50ms
      TL0 = 0x00;

        if(flag)//10S到,灯已亮
        {
          if( ++T_count_1s==20)   //20个50ms,也就是1秒到
                {
               P2_0 = 1;// LED灭
               T_count=0;
               T_count_1s=0;
               flag=0;
                }
        }
        elseif(++T_count == 200 )//200个50ms,也就是10秒
      {
          P2_0 = 0;// LED点亮
          flag=1;      
      }       
       //
}

void main()
{
      TMOD = 0x01;
      TH0 = 0x4C;         //50ms
      TL0 = 0x00;
      IE = 0x82;
      TR0 = 1;
      while(1);
}


我不建议程序放中断里。感觉就是不习惯。

6K6K 发表于 2012-7-20 12:28:40

1、中断里没有重装TH0和TL0,导致时间不准。
2、EA没有打开,当然不能进中断。

dz20062008 发表于 2012-7-20 12:49:50

C不感冒

xiaoya1945 发表于 2012-7-20 12:53:56

7L和9L的方法都可以做的,清晰明了...{:lol:}

lryxr2507 发表于 2012-7-20 15:33:47

oid led() interrupt 1
{
      if (++T_count == 1 )          P2_0 = 0;// LED点亮

      if( ++T_count == 200)          P2_0 = 1;// LED熄灭
      
      if( ++T_count == 220)         T_count = 0;   

}

BXAK 发表于 2012-7-20 15:56:42

lryxr2507 发表于 2012-7-20 15:33 static/image/common/back.gif


每次进中断 T_count 自加3次 了

lryxr2507 发表于 2012-7-20 16:06:01

oid led() interrupt 1
{
T_count++;
      if (T_count == 1 )          P2_0 = 0;// LED点亮

      if( T_count == 200)          P2_0 = 1;// LED熄灭
      
      if( T_count == 220)         T_count = 0;   

}

单纯太难 发表于 2012-7-21 17:51:38

你可以在定时器中断里面加一个自定义的变量,比如I++,,控制LED的程序卸写在主程序里面,在主程序里面判断I小于20时为1,在再在IF里面判断是否小于220,如果是置零,ELSE I=0 ,一直循环就可以实现了

lxa0 发表于 2012-7-22 00:00:41

你可以这样想:
设置一个延时1s的子程序
然后调用10次,即延时了10s
再调用1次,即点亮1s
.......
页: [1]
查看完整版本: 请看程序,定时间隔10秒钟让led亮1秒钟