打印
[国产单片机]

用51单片机编的定时程序为什么出现问题呢

[复制链接]
1820|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1stupidman|  楼主 | 2010-11-28 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 1stupidman 于 2010-11-28 16:25 编辑

我编了个单片机程序控制发光二极管亮灭,用内部定时器0控制,想让单片机上电2.5S后P2^7控制的发光二极管亮起来, 当中间的if(num==50) led1=0;这两行程序放在while语句中时就不运行,书上就是把这两行程序放在while语句中的,但是当这两行程序放在中断函数中的时候,就能正常运行,为什么呢,晶振是11.0592M的89C51单片机

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void init();
sbit led1=P2^7;// led1控制发光二极管亮灭
uchar num;
void mian()
{
    init();
    while(1)
    {  
         if(num==50) //就是这两行程序
        led1=0;  // 就是这两行程序
    }
}
void init()
{
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    TR0=1;
}
void time0() interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;

   num++;
                //放在这里就能运行

}

相关帖子

沙发
谈的元| | 2010-11-28 21:03 | 只看该作者
写成 if(num>=50)看看

使用特权

评论回复
板凳
谈的元| | 2010-11-28 21:07 | 只看该作者
查询可能错过50,

还有看中断是否运行正常,在中断中将一IO口取反  观察输出口波形,来证明你中断时间是与你期望一致

使用特权

评论回复
地板
airwill| | 2010-12-3 10:33 | 只看该作者
这么久的定时时间, 错过 50 是不可能的.
有 led1=0;  怎么没有 led1=1? 呢,
如果 led1=0; 是亮灯, 这不是亮了就没有机会暗下去了?
改成:
      if(num<=50)  led1 = 1;
    else    led1=0;  
再试试

使用特权

评论回复
5
POINTRTOS| | 2010-12-3 15:08 | 只看该作者
没有什么道理.看看初始化或者程序开始时num的值,有可能一开始就有 num>50,此时可能要等待的时间就是10几秒了,而你一看没有亮就终止运行去看代码了,等长一点也许能看到灯这.

使用特权

评论回复
6
dwp1112| | 2010-12-9 08:17 | 只看该作者
1# 1stupidman

同意二楼的说法,但具体的还是要用硬件去验证。另外可以用串口打印下NUM的值就知道是否错过了50这个值。

使用特权

评论回复
7
心静自然凉| | 2010-12-11 17:26 | 只看该作者
本帖最后由 心静自然凉 于 2010-12-11 17:34 编辑
if(num==50) //就是这两行程序
        led1=0;  // 就是这两行程序

你仔细想一想,如果num++到了50以后改变一次灯的状态,接下来呢?num会继续增加,而不是从0开始计数,所以num++到50以后别忘了清零,还有,LED状态要轮流亮灭,可你只有一个状态led1=0(此处应该是亮),可以用led1=!led1。

再好好想想,程序就会出来了。

使用特权

评论回复
8
老鱼探戈| | 2010-12-17 12:59 | 只看该作者
查询可能错过50,

还有看中断是否运行正常,在中断中将一IO口取反  观察输出口波形,来证明你中断时间是与你期望一致
谈的元 发表于 2010-11-28 21:07

LZ这个程序不可能错过 num=50的情况

使用特权

评论回复
9
老鱼探戈| | 2010-12-17 13:03 | 只看该作者
#define     cPwmWide    50       //改变这个常数可以改变占空比
#define       cSpdMax     100        //改变这个常数可以改变周期
while(1)
    {  
        if(num>=cSpdMax){num=0;led1=1;}
        if(num==CPwmWide)    led1=0;  
    }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

76

帖子

2

粉丝