打印

此计数程序为什么成了秒表

[复制链接]
1490|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2001myp|  楼主 | 2009-3-10 16:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <REG51.H>        
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x12,0xb7,0x19,0x91,0xb4,0xd0,0x50,0x97,0x10,0x90};
uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; 
/***************************************************************/
uint data cnt=0;            
bit bdata bitflag;            
/**********************************************/
void init(void)                    
{                            
    bitflag=0;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;                    
}                            
/**************************************************/
void delay(uint k)                
{                            
uint data i,j;                    
    for(i=0;i<k;i++)            
    {                        
    for(j=0;j<121;j++){;}        
    }                        
}                            
/**************************************************/
void main(void)                
{    uchar i;                    
    init();            
    while(1)                    
    {                        
    if(bitflag=!bitflag)cnt++;            
    if(cnt>99)cnt=0;            
        for(i=0;i<200;i++)        
        {                                    
        P1=SEG7[cnt/10];
        P2=ACT[0];            
        delay(1);                
        P1=SEG7[cnt%10];    
        P2=ACT[1];            
        delay(1);                
        }            
    }                        
}                            
/************************************************/
void extern_int0(void) interrupt 0 using 0    
{                            
bitflag=!bitflag;                
}                            
                            
上面这个计数程序,用数码管显示。我用下降沿中断有效,我在INTO出接了个对地的开关,我这个程序的目的是按一下记一个数的,可是现在只要通电运行后就开始自己一个数一个数自加,就像秒表一样,为什么呢,是程序问题么,可我看不出有问题啊,高手请指教

相关帖子

沙发
HWM| | 2009-3-10 16:11 | 只看该作者

仔细看看这玩意儿:“if(bitflag=!bitflag)cnt++;”

使用特权

评论回复
板凳
2001myp|  楼主 | 2009-3-10 16:41 | 只看该作者

HWM大哥在啊

谢谢提醒,我注意到了,我改成了if(bitflag==!bitflag)cnt++;或者:“if(bitflag!=bitflag)cnt++;”,无论怎么加外部中断,都在00处不会动了,为什么呢

使用特权

评论回复
地板
HWM| | 2009-3-10 16:51 | 只看该作者

你应该判bitflag,成立后(即该计数了)再将它取反。

使用特权

评论回复
5
2001myp|  楼主 | 2009-3-10 18:19 | 只看该作者

谢谢指教

不过我还觉得不对,你说成立后再取反,在哪里取反呢,我找了好几个位置想添加取反的语句,但都不对,呵呵,小弟愚钝,请指教

使用特权

评论回复
6
2001myp|  楼主 | 2009-3-11 08:48 | 只看该作者

问题蠢了点,但新人希望高手指点

我在后面加了取反后,发现还是不行,想了想几个取反的位置都不对,中断后本来标志位都已经取反为1了,结果我再取反为零了又,那样的话岂不是判断后又为假了,不执行了,高手指教

使用特权

评论回复
7
welson| | 2009-3-11 09:25 | 只看该作者

改成下面就可以了

 #include <REG51.H>        
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x12,0xb7,0x19,0x91,0xb4,0xd0,0x50,0x97,0x10,0x90};
uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; 
/***************************************************************/
uint data cnt=0;            
bit bdata bitflag;            
/**********************************************/
void init(void)                    
{                            
    bitflag=0;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;                    
}                            
/**************************************************/
void delay(uint k)                
{                            
uint data i,j;                    
    for(i=0;i<k;i++)            
    {                        
    for(j=0;j<121;j++){;}        
    }                        
}                            
/**************************************************/
void main(void)                
{    uchar i;                    
    init();            
    while(1)                    
    {                        
    if(bitflag==1)
                {
               cnt++;
          bitflag=0;
        }          
    if(cnt>99)cnt=0;            
        for(i=0;i<200;i++)        
        {                                    
        P1=SEG7[cnt/10];
        P2=ACT[0];            
        delay(1);                
        P1=SEG7[cnt%10];    
        P2=ACT[1];            
        delay(1);                
        }            
    }                        
}                            
/************************************************/
void extern_int0(void) interrupt 0 using 0    
{                            
bitflag=1;                
}                            

使用特权

评论回复
8
2001myp|  楼主 | 2009-3-11 09:51 | 只看该作者

谢谢WELSON大哥指点

谢谢WELSON大哥指点

使用特权

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

本版积分规则

59

主题

210

帖子

0

粉丝