定时器第二种工作方式为什么不循环

[复制链接]
 楼主| 2001myp 发表于 2009-3-5 18:50 | 显示全部楼层 |阅读模式
#include <REG51.H>    
#define uchar unsigned char
uchar min,sec,cnt2,cnt1,m;    
uchar out_val=0x0f;            
/****************************/
void initial(void)        
{                    
TMOD=0x02;            
TH0=0x38;            
TL0=0x38;            
IE=0x00;                
TR0=1;
P1=out_val;                
}    
/****************************/            
void main(void)            
{    
    initial();                
      for(;;)                
      {                    
       while(!TF0);    
       TF0=0;        
       if(++cnt1>=200){cnt1=0;cnt2++;}
       if(cnt2>=25){cnt2=0;sec++;}
       if(sec>=60){sec=0;min++;}
       if(min>=2){min=0;P1=~out_val;}
      }                    
}                        
以上程序是我在一本书上摘抄的,书上说该程序用定时器第二种工作方式自动加载,连续计时,上面那个FOR循环是无线循环,所以指示灯亮120秒,再灭120秒,无线循环下去,但我仿真后发现只做了一个循环就保持不变了,即灯先灭,然后变亮,然后保持常亮了,小弟新人,不解,希望哪位高手指教
fengcqin 发表于 2009-3-5 19:21 | 显示全部楼层

把IE的数值重新设置一下

 
把IE的数值重新设置一下
pingo_zp 发表于 2009-3-5 20:37 | 显示全部楼层

你的if 语句存在逻辑上的问题

首先,uchar min,sec,cnt2,cnt1,m;一堆的变量没有初始化;
在你没有给cnt1赋任何值之前,就判断它是否大于等于200,结果自然不成立,所以后面的{cnt1=0;cnt2++;}不会被执行,这是cnt2 又不知道是多少,同样没有赋值,判断结果为否,后面的语句不会被执行,下面两条判断语句有同样的问题,所以你的{min=0;P1=~out_val;}根本不会被执行,怎么会有输出呢?
建议你可以在调试的时候看一下反汇编窗口的调试过程。
可以将你的主函数改为这样试试看
void main(void)            
{    
     initial();                
      for(;;)                
      {                    
       while(!TF0);    
       TF0=0; P1=~P1;       
      }                    
}    
另外,这里没有中断程序,应该和中断开关寄存器IE没有什么关系!
  如有说的不对的地方,敬请指正!
 楼主| 2001myp 发表于 2009-3-7 15:22 | 显示全部楼层

谢谢楼上两位

可能关键在P1=~out_val;上吧,我把她改成P1=~P1就可以了,谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

210

帖子

0

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

59

主题

210

帖子

0

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