打印
[51单片机]

中断 定时器次数累加?

[复制链接]
3094|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jilu1986|  楼主 | 2014-6-28 11:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void T0_time()interrupt 1
{
   TH0=(65536-50000)/256;
   TL0=(65536-50000)%256;
    num1++;
   if(num1==20)
   {
   num1=0;
   num++;
   if(num==60)
        num=0;
   shi=num/10;
   ge=num%10;

   }
}

最近为了提高自己就从头学习了51,但是做到中断的时候,发现这个 NUM1++,说是50ms自动累加一次(定时器溢出一次),可是这个没有赋初值啊而且怎么联系上定时器溢出? 请教各位方家

相关帖子

沙发
严斌| | 2014-6-28 11:51 | 只看该作者
定时器设定初值和定时器中断的设置在主函数里也要有的

使用特权

评论回复
板凳
jilu1986|  楼主 | 2014-6-28 11:57 | 只看该作者
严斌 发表于 2014-6-28 11:51
定时器设定初值和定时器中断的设置在主函数里也要有的

主函数有,但是我不知道这个 ++的初值以及怎么赋值的

使用特权

评论回复
地板
ningling_21| | 2014-6-28 12:50 | 只看该作者
本帖最后由 ningling_21 于 2014-6-28 12:51 编辑
jilu1986 发表于 2014-6-28 11:57
主函数有,但是我不知道这个 ++的初值以及怎么赋值的

T0中断中必须有赋初值

每中断一次,NUM就会加1,时间长短和系统时钟和初值有关

NUM最好初始化为0,当中断次数累积到20次就相当与溢出...

使用特权

评论回复
5
严斌| | 2014-6-28 13:06 | 只看该作者
jilu1986 发表于 2014-6-28 11:57
主函数有,但是我不知道这个 ++的初值以及怎么赋值的

可以定义全局变量。也可以直接在中断函数里面定义赋值的,默认的话是初值为0

使用特权

评论回复
6
jilu1986|  楼主 | 2014-6-28 16:01 | 只看该作者
严斌 发表于 2014-6-28 13:06
可以定义全局变量。也可以直接在中断函数里面定义赋值的,默认的话是初值为0 ...

也就是说不赋值,keil默认赋0?

使用特权

评论回复
7
jilu1986|  楼主 | 2014-6-28 21:18 | 只看该作者
#include<reg51.h>                                            //头文件
#define uint unsigned int                             //宏定义unsigned int 为uint
#define uchar unsigned char                     //宏定义unsigned char为uchar
sbit wx1=P0^0;                                                                        //P3.0控制74138 A
sbit wx2=P0^1;                                                                        //P3.1控制74138 B
sbit wx3=P0^2;                                                                        //P3.2控制74138 C
uchar num,num1,num2,num3,ms,mg,fs,fg,zs,zg;                                                                  //定义num
uchar code tablea[]={0x3f,0x06,0x5b,0x4f,           //定义1~F数码管显示代码
                     0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f};
void delayms(uint);
void display(uchar,uchar);
void main()                                                      //主函数
{
                 TMOD=0X01;                           //设置定时器0和定时器1工作(此时TMOD寄存器状态为00010001,定时器工作在方式1)
                 TH0=(65536-50000)/256;                                  //装初值,  THX=(65536-N)/256,TLX=(65536-N)%256
                 TL0=(65536-50000)%256;                                  //N=一次中断的时间/机器周期(建议采用50ms计时)
                 EA=1;                                //总中断开启
                 ET0=1;                                                                  //开定时器0中断
                 TR0=1;                                                                  //启动定时器0
                 while(1)                                                          //循环体
                 {
                 display(zs,zg);
                 }
}                  
void display(uchar zs,uchar zg)                  
                  {wx1=0;                                                          //位选第一位(74HC138)
                   wx2=0;                                                          //位选第一位(74HC138)
                   wx3=0;                                                          //位选第一位(74HC138)
                   P1=0xff;                                                          //消抖
                   P1=tablea[zs];                                          //第一位数码管显示1
                   delayms(1);                                                  //延时1ms
                  
                   wx1=1;                                                          //位选第2位显示2,延时1ms
                   wx2=0;                                                          
                   wx3=0;                                                          
                   P1=0xff;
                   P1=tablea[zg];                                          
                   delayms(1);                                                  
                  
                   wx1=0;                                                          //位选第3位显示3,延时1ms
                   wx2=1;
                   wx3=0;
                   P1=0xff;
                   P1=0x9;
                   delayms(1);
                                                                              
                   wx1=1;                                                           //位选第4位显示4,延时1ms
                   wx2=1;
                  wx3=0;
                   P1=0xff;
                   P1=tablea[fs];
                   delayms(1);
                                                                                           //位选第5位显示5,延时1ms
                   wx1=0;
                   wx2=0;
                   wx3=1;
                   P1=0xff;
                   P1=tablea[fg];
                   delayms(1);
                                                                                       
                   wx1=1;                                                            //位选第6位显示冒号,延时1ms
                   wx2=0;
                   wx3=1;
                   P1=0xff;
                   P1=0x9;
                   delayms(1);                                               

                   wx1=0;                                                          //位选第7位显示7,延时1ms
                   wx2=1;
                   wx3=1;
                   P1=0xff;
                    P1=tablea[ms];
                   delayms(1);

                   wx1=1;                                                         //位选第8位显示8,延时1ms
                   wx2=1;
                   wx3=1;
                   P1=0xff;
                   P1=tablea[mg];
                   delayms(1);
                   }
                                        
void delayms(uint xms)                   //延时子函数
{
      uint i,j;                                   //定义
          for(i=xms;i>0;i--)           //i=xms即为延时x毫秒
             for(j=120;j>0;j--);   //12M频率下,一个机器周期为1μS
}           
void T0_time()interrupt 1
{
   TH0=(65536-50000)/256;                //重新赋予定时器初值       
   TL0=(65536-50000)%256;               
    num1++;                                                //累加计数
   if(num1==20)                                        //如果到了20次,说明1s时间到
   {
   num1=0;                                                //1s时间到,清零,重新计时
   num++;
   if(num==60)                                        //num定义秒
           num2++;                           //num2定义分,每60秒,分钟数+1
            if (num2==60)                          //
           num3++;                                    //num3定义小时,每到60分,小时+1
           if(num3==24)
           num3=0;                                        //24小时后,小时清零一次
           if(num2==60)
           num2=0;                                        //60分钟后,分钟清零
   if(num==60)
        num=0;                                        //60秒后,秒清零
   ms=num/10;                                       
   mg=num%10;                                   //秒显示计算
   fs=num2/10;
   fg=num2%10;                                        //分钟显示计算
   zs=num3/10;
   zg=num3%10;                                        //小时显示计算
   }
}

源文件如下,请大家指导。我还是不明白在终端中的初值及中断次数累加是怎么回事

使用特权

评论回复
8
cjseng| | 2014-6-28 23:17 | 只看该作者
uchar num,num1,num2,num3,ms,mg,fs,fg,zs,zg;                                                                  //定义num
这样定义,num1就是0了。
具体可以去看一下这个程序的汇编代码。

使用特权

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

本版积分规则

9

主题

101

帖子

0

粉丝