找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6172|回复: 5
打印 上一主题 下一主题
收起左侧

[求助][讨论]1秒内LED闪10次

[复制链接]
跳转到指定楼层
楼主
ID:25279 发表于 2010-10-12 09:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

编了一个1秒内LED1闪10次的程序(12MHZ,STC89C52),编译OK,但在实验板上运行失败,网友也帮忙写了个程序,结果也是失败。现在将此程序贴上来,请大家来一起来帮帮忙,指教指教,探讨探讨

 

题目要求:1秒内LED1闪10次后停止(或是说灯在1秒之内只闪10次)

 

 

我写的:

程序分析:闪10次即亮10次灭10次,共20次,1S/20=50MS每次。

#include<reg52.h>

#define uchar unsigned char

sbit P1_4=P1^4;

sbit LED1=P0^0;

uchar a;

 

void main()

{

  P1_4=0;

        a=0;

  TMOD=0X01;

   TH0=0X3C;

   TL0=0Xb0;

   EA=1;

   ET0=1;

   TR0=1;

while(1); 

}

 

void time0() interrupt 1

{

  TH0=0X3c;

   HL0=0Xb0;

a++;

   if(a==1)

      {

          a=0;

     LED1=~LED1;

       }

         if(a==20)

             {

               TR0=0;

              }

}

 

当以上程序运行失败之后,我在if(a==1)之前加了个while(1)将两个if都放在了{ }中,但结果仍然达不到题目要求:1秒钟之内LED1闪烁10次后停止。

 

网友的程序:

#include<reg52.h>

#define uchar unsigned char

sbit P1_4=P1^4;

sbit LED1=P0^0;

uchar a,b;

 

void main()

{

  P1_4=0;

        a=0;

         b=0;

  TMOD=0X01;

   TH0=0X3C;

   TL0=0Xb0;

   EA=1;

   ET0=1;

   TR0=1;

while(1); 

}

 

void time0() interrupt 1

 

 

{

  TH0=0X3c;

   HL0=0Xb0;

a++;

   if(a==1)

      {

          a=0;

     

       }

         for(b=0;b<=10;b++)

                {

               LED1=~LED1;

                }

}

以上是网友的程序,大概是这样吧,因为他给我的资料没带在身边编译OK,实验板上得不到题目要求的结果。

[此贴子已经被作者于2010-10-12 18:56:49编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:25279 发表于 2010-10-12 23:32 | 只看该作者

我做出来了:程序如下,有愿意一起学习共同进步的朋友可以加我Q:125991680

 

#include  <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a=0;
uchar b=0;
sbit LED=P0^0;
sbit P1_4=P1^4;
void main()
{
   P1_4=0;
 a=0;
 b=0;
 TMOD = 0x11;
 TH0 = (65536-50000)/256;//50ms
 TL0 = (65536-50000)%256;
 EA = 1;
 ET0 = 1;
   ET1=1;
 TR0 = 1;
 TR1=1;
 while(1);
}

void Timer_0() interrupt 1
{
 TH0 = (65536-50000)/256;
 TL0 = (65536-50000)%256;
   a++;

    if(a == 1)
   {
     a=0;
         LED = ~LED;
   }
}

void time1() interrupt 3
{
   TH0 = (65536-50000)/256;
 TL0 = (65536-50000)%256;
   b++;
 if(b==20)
  {
      a=0;
  b=0;
  TR0=0;
  TR1=0;
  }
}

 

 

回复

使用道具 举报

板凳
ID:22246 发表于 2010-10-13 02:52 | 只看该作者
好样的,
回复

使用道具 举报

地板
ID:25279 发表于 2010-10-13 08:15 | 只看该作者

谢谢你的夸奖呢!但是还是做得不好:

用了两个定时器,A:占用资源;B:感觉很怪(其实也是编好了之后才想到的可以一个用来定时,另一个用来计数)

 

我现在想用一个定时器也完成它,那个朋友可以帮帮我呢,我上面采用的是用一个定时器,但是失败了,我现在又想到了

两个方案:

1,用延时+定时器(这个我要晚上实验才能有结果)

2,不加延时程序,只用一个定时器(这个希望能够得到大家的学友们的帮助,因为加上学友的程序,我都实验了6个之多了,可是都失败了!!!)

 

 

回复

使用道具 举报

5#
ID:25782 发表于 2010-10-14 09:19 | 只看该作者

#include<reg52.h>

#define uchar unsigned char

sbit P1_4=P1^4;

sbit LED1=P0^0;

uchar a;

 

void main()

{

  P1_4=0;

        a=0;

  TMOD=0X01;

   TH0=0X3C;

   TL0=0Xb0;

   EA=1;

   ET0=1;

   TR0=1;

while(1); 

}

 

void time0() interrupt 1

{

  TH0=0X3c;

   HL0=0Xb0;

a++;

   if(a==1)

      {

          //a=0;把这句去掉就行了吧。

     LED1=~LED1;

       }

         if(a==20)

             {

               TR0=0;

              }

}

回复

使用道具 举报

6#
ID:25279 发表于 2010-10-18 09:06 | 只看该作者

谢谢你噢!!!

我今天晚上回去试一下。

 

 

我试了一下,不行噢,

[此贴子已经被作者于2010-10-18 19:31:52编辑过]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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