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

[复制链接]
 楼主| 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;  
再试试
POINTRTOS 发表于 2010-12-3 15:08 | 显示全部楼层
没有什么道理.看看初始化或者程序开始时num的值,有可能一开始就有 num>50,此时可能要等待的时间就是10几秒了,而你一看没有亮就终止运行去看代码了,等长一点也许能看到灯这.
dwp1112 发表于 2010-12-9 08:17 | 显示全部楼层
1# 1stupidman

同意二楼的说法,但具体的还是要用硬件去验证。另外可以用串口打印下NUM的值就知道是否错过了50这个值。
心静自然凉 发表于 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。

再好好想想,程序就会出来了。
老鱼探戈 发表于 2010-12-17 12:59 | 显示全部楼层
查询可能错过50,

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

LZ这个程序不可能错过 num=50的情况
老鱼探戈 发表于 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

粉丝
快速回复 在线客服 返回列表 返回顶部