打印

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

[复制链接]
1885|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

粉丝