搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 2012-7-20 09:53:36 | 显示全部楼层 |阅读模式
本帖最后由 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);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-7-20 10:11:37 | 显示全部楼层
【2楼】
T1_count=1 second;  这句怎么写啊

出0入0汤圆

发表于 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);
}

出0入0汤圆

发表于 2012-7-20 10:41:04 | 显示全部楼层
EA没开能运行吗?

出0入0汤圆

发表于 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;        
    }

}

出0入0汤圆

发表于 2012-7-20 10:58:27 | 显示全部楼层
  1. typedef  unsigned char  uint8;
  2. typedef  unsigned int   uint16;
  3. #include <reg52.h>         

  4. #define  CPU_FOSC  11059200UL    //11.0592MHz
  5. #define  _TIME0      50000            //50000us

  6. #define  _TL0      ((65536-_TIME0*(CPU_FOSC/200)/60000)%256)
  7. #define  _TH0      ((65536-_TIME0*(CPU_FOSC/200)/60000)/256)

  8. sbit LED = P2^0;

  9. uint8 count;

  10. void Time0() interrupt 1
  11. {
  12.         TL0 = _TL0;
  13.         TH0 = _TH0;

  14.         if (++count == 200)    //200个50ms,也就是10秒
  15.         {
  16.                 LED = 0;           // LED点亮
  17.         }
  18.         else if (count >= 220) //P2_0在持续1秒之后,变为P2_0=1,使得led灯灭
  19.         {
  20.                 LED = 1;
  21.                 count = 0;
  22.         }
  23. }

  24. void main()
  25. {
  26.         count = 0;
  27.        
  28.         TMOD = 0x01;
  29.         TH0 = _TH0;
  30.         TL0 = _TL0;
  31.         EA  = 1;
  32.         ET0 = 1;
  33.         TR0 = 1;
  34.        
  35.         while (1);
  36. }
复制代码

出0入0汤圆

发表于 2012-7-20 11:12:42 | 显示全部楼层
做个标记互锁

出0入0汤圆

发表于 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;}
更加严谨一些

出0入0汤圆

发表于 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;
                }
        }
        else  if(++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);
}


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

出0入0汤圆

发表于 2012-7-20 12:28:40 | 显示全部楼层
1、中断里没有重装TH0和TL0,导致时间不准。
2、EA没有打开,当然不能进中断。

出145入215汤圆

发表于 2012-7-20 12:49:50 | 显示全部楼层
C不感冒

出0入0汤圆

发表于 2012-7-20 12:53:56 | 显示全部楼层
7L和9L的方法都可以做的,清晰明了...

出0入0汤圆

发表于 2012-7-20 15:33:47 | 显示全部楼层
  1. oid led() interrupt 1
  2. {
  3.         if (  ++T_count == 1 )          P2_0 = 0;  // LED点亮

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

  7. }
复制代码

出0入0汤圆

发表于 2012-7-20 15:56:42 | 显示全部楼层
lryxr2507 发表于 2012-7-20 15:33

每次进中断 T_count 自加3次 了

出0入0汤圆

发表于 2012-7-20 16:06:01 | 显示全部楼层
  1. oid led() interrupt 1
  2. {
  3. T_count++;
  4.         if (  T_count == 1 )          P2_0 = 0;  // LED点亮

  5.         if( T_count == 200)          P2_0 = 1;  // LED熄灭
  6.         
  7.         if( T_count == 220)         T_count = 0;   

  8. }
复制代码

出0入0汤圆

发表于 2012-7-21 17:51:38 | 显示全部楼层
你可以在定时器中断里面加一个自定义的变量,比如I++,,控制LED的程序卸写在主程序里面,在主程序里面判断I小于20时为1,在再在IF里面判断是否小于220,如果是置零,ELSE I=0 ,一直循环就可以实现了

出0入0汤圆

发表于 2012-7-22 00:00:41 | 显示全部楼层
你可以这样想:
设置一个延时1s的子程序
然后调用10次,即延时了10s
再调用1次,即点亮1s
.......
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表