标题: 请教:这个程序下载后,小灯为什么常亮,不闪烁 [打印本页]

作者: 深海鲸变    时间: 2014-8-19 14:16
标题: 请教:这个程序下载后,小灯为什么常亮,不闪烁
#include<reg52.h>

sbit enled=P1^4;
sbit led = P0^0;

void main()
{
    unsigned char cnt = 0;
    enled = 0;
    TMOD = 0X01;
    TH0 = 0XB8;
    TL0 = 0X00;
    TR0 = 1;

    while(1)
        {
        if(TF0 == 1)
        TF0 = 0;
        TH0 = 0XB8;
        TL0 = 0X00;

          cnt++;
         if(cnt >= 50)
         {

             cnt = 0;
             led = ~led;
         }
         
         }
   
   
   
}

作者: admin    时间: 2014-8-19 15:13
应该是定时器没有设置好 我等下拿到板子上看看
作者: admin    时间: 2014-8-19 20:13
有下面这几种原因导致  灯会常亮
1是 定时器没有工作
2是 闪烁的速度太快 导致你看不到闪烁
作者: admin    时间: 2014-8-19 20:14
************************************************/
#include<reg51.h>

sbit P14=P1^4;
sbit P07=P0^7;
sbit P26=P2^6;


volatile int i;       //声明一个变量为可能意外变化的量(相对于const而言)用语中断程序

void main()

{
P26=1;  //防止数码管干扰
P0=0x00;
P26=0;
P0=0xff;

P14=0; //开led使能

P07=0;                    //先将P20位的LED点亮

TMOD=0x01;        //设置定时器T0工作在模式1

TH0=0xb1; TL0=0xe0;      //装T0的计数初值,12MHz,20ms计时

EA=1;                     //开启总中断允许位

ET0=1;                   //开启T0定时器

TR0=1;                   //开启T0定时器中断允许位

while(1);          //循环等待中断发生

}

void time0(void) interrupt 1 //中断程序写法

{ TH0=0xb1; TL0=0xe0;       //重装T0的计数初值

i++; if(i==25)     //计数到25次(即0.5秒)

{

   i=0; //i清零

   P07=~P07;    //取反LED端口,

}

}
作者: 深海鲸变    时间: 2014-8-19 22:25
多谢老大指点。谢谢你的代码
作者: heise    时间: 2014-8-19 23:21
楼主 调试结果怎么样?
作者: 深海鲸变    时间: 2014-8-20 14:23
我的程序还是不行,看程序貌似没什么问题,难道是片子问题,定时器有问题?没搞清楚。老大用的是中断写法,我正在学习定时器,所以用这种写法试试
作者: 深海鲸变    时间: 2014-8-20 22:29
已经找到原因了。调试成功,在 if(TF0 == 1)下面,少写了一组大括号,找了一天,很U伤。

通过的代码是这样的

#include<reg52.h>

sbit enled=P1^4;
sbit led = P0^0;

void main()
{
    unsigned char cnt = 0;
    enled = 0;
    TMOD = 0X01;
    TH0 = 0XB8;
    TL0 = 0X00;
    TR0 = 1;

    while(1)
        {
        if (TF0 == 1)
        {
        TF0 = 0;
        TH0 = 0XB8;
        TL0 = 0X00;

          cnt++;
         if(cnt >= 50)
         {

             cnt = 0;
             led = ~led;
         }
         
         }
   }
   
   
}
作者: hkccd    时间: 2014-8-21 04:09
原来如此
作者: a110    时间: 2014-8-21 22:30
看来一些程序连一个括号都不能忽视啊!楼主的经验值得我们学习
作者: 深海鲸变    时间: 2014-8-21 22:53
恩,好像是while下面如果不加大括号,程序就反复执行下面的第一句程序,反复执行这一句,不会再向后执行了。
多谢各位关注我的问题。致敬!!
作者: 深海鲸变    时间: 2014-8-23 22:30
还有一个疑问,请教!!!

还是这段程序,我写的时候小灯闪烁定时1s,但结果却是一秒钟能闪烁3次吧,实在不知道这是为什么?请大家不吝赐教!!谢。
作者: hujia    时间: 2014-8-23 23:37
深海鲸变 发表于 2014-8-23 22:30
还有一个疑问,请教!!!

还是这段程序,我写的时候小灯闪烁定时1s,但结果却是一秒钟能闪烁3次吧,实 ...

  if(cnt >= 50),把50改小一些即可,,比如17
作者: hujia    时间: 2014-8-23 23:40
深海鲸变 发表于 2014-8-21 22:53
恩,好像是while下面如果不加大括号,程序就反复执行下面的第一句程序,反复执行这一句,不会再向后执行了 ...

是的,,大括号里面的语句块,是作为一个整体执行的,while下面的循环体如果超过一句一定得用大括号
作者: 深海鲸变    时间: 2014-8-24 08:51
本帖最后由 深海鲸变 于 2014-8-24 08:52 编辑
hujia 发表于 2014-8-23 23:37
if(cnt >= 50),把50改小一些即可,,比如17

为什么会是改少?我我设置的定时器是20ms,50个周期,正好是1s。难道是我的算法有问题?17是随便举的例子吗?为什么是17?
作者: hujia    时间: 2014-8-24 11:37
说反了应该是改大三倍,,要改为150
作者: hujia    时间: 2014-8-24 11:38
先试试看看行吗
作者: 深海鲸变    时间: 2014-8-25 23:28
如果改大,当然可以了,但是我的时间是计算出来的啊,晶振是11.0592M的。为什么实际的和计算的不一致啊?
作者: NB没B    时间: 2014-8-28 17:26
a110 发表于 2014-8-21 22:30
看来一些程序连一个括号都不能忽视啊!楼主的经验值得我们学习

我又一次写贪吃蛇 for()循环后面直接加了;导致无法进入循环 我找了半个小时才找到
作者: 深海鲸变    时间: 2014-8-29 23:09
哪位大侠能帮我解答一下我的问题,想精确延时,否则用for语句就可以实现闪烁,想在想精确控制小灯闪烁时间




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1