搜索
bottom↓
回复: 7

51中断嵌套诡异的结果求解

[复制链接]

出0入0汤圆

发表于 2012-7-21 00:43:46 | 显示全部楼层 |阅读模式
程序如下:
#include<stc12c5a60s2.h>
#include<datatype.h>
#define uchar unsigned char
#define uint unsigned int
sbit m=P0^0;
sbit n=P0^1;  //m,n控制秒
sbit a=P0^2;
sbit b=P0^3;  //a,b控制分钟
sbit x=P0^4;
sbit y=P0^5;  //x,y控制小时
sbit zhan=P0^6;                // 控制外部中断开
sbit bo=P0^7;
sbit led=P3^0;
sbit  p33=P3^3;          //   按键改数值
sbit  p35=P3^5;                // 改数值
sbit  p36=P3^6;                  //         该数值
sbit p32=P3^2;                        //                   外部中断触发

int num,k,p,q;
unsigned char pp;
code char shuzi[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
void delay(int ms)
{
int a,b;
for(a=0;a<ms;a++)
for(b=0;b<80;b++);
}
void display(int num1)
  { int s=35;
        int i,j;
        int c,d;
        int w,e;
        i=num1%10;
        j=num1/10;
        c=q%10;
        d=q/10;
        w=p%10;
        e=p/10;
while(s--)
{       
        m=0;
        P1=shuzi[i];
        delay(2);
        m=1;
        n=0;
        P1=shuzi[j];
        delay(2);
        n=1;                        //显示秒

          
        a=0;
        P1=shuzi[c];
        delay(2);
        a=1;
        b=0;
        P1=shuzi[d];
        delay(2);
        b=1;                  //显示分钟

        x=0;
        P2=shuzi[w];
        delay(2);
        x=1;
        y=0;
        P2=shuzi[e];
        delay(2);
        y=1;                  //显示小时
       
        }                                                    
          
}
void main()
  {         
P1M1=0x00;
P1M0=0xff;
P2M1=0x00;
P2M0=0xff;
P0M1=0x00;
P0M0=0xff;
P3M1=0x00;
P3M0=0xff;
           TMOD=0x01;                         //选择定时器中断的运行方式
     TL0=(65536-46038)%256;//赋定时器的初值
         TH0=(65536-46038)/256;
         EA=1;   //中断总开关
         ET0=1;  //定时器的开关
         TR0=1;  //开启定时器中断
         PX0=1;
         PT0=0;
          
         while(1)
         {
         display(k);
         }                  
        }                         
                                     
                         
                          
                    
                                 
                               
  void T0_time() interrupt 1
{
           TH0=(65536-46038)/256;
           TL0=(65536-46038)%256;
           num++;
       if(num==20)
                   {
                                num=0;
                                led=~led;
                                k++;
                                if(k==60)
                                        {
                                                k=0;                       
                                                 q++;
                                                if(q==60)
                                                q=0;
                                        }
                           if(q==0&&k==0)
                                         {
                                          p++;
                                          if(p==24)
                                          p=0;
                                         }
                    }
           if(zhan==0)
                {
                        // EA=1;
                         EX0=1;
                         IT0=1;
                //         p32=1;
                //         if(bo==0)break;
                }
                zhan=1;                          
  }


  void waibu() interrupt 0
   {        
                   bo=1;
   while(1)
     {
                         p33=1;
                   if(p33==0){k+=1;}
                   p35=1;
                 if(p35==0){q+=1;}
                    p36=1;
                 if(p36==0){p+=1;}
                //        display(k);
               
                 if(bo==0)
                 for(pp=10;pp>0;pp--);
                 if(bo==0)
                 {
                 IE0=0;
                 break;
                 }
         }
         EX0=0;
}


要实现的功能是T0计时,然后zhan控制外部中断0的开启,p3^2触发进入外部中断0,bo按键跳出外部中断后继续t0的计数。
但是现在是跳出外部中断后计数器就被清零了,没有继续之前的计数。
弄了一晚上,不知道是怎么回事,求解呀。
希望大家帮忙。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-7-21 02:46:15 | 显示全部楼层
TL0=(65536-46038)%256这句%什么意思?

出0入0汤圆

发表于 2012-7-21 03:17:01 | 显示全部楼层
teddeng 发表于 2012-7-21 02:46
TL0=(65536-46038)%256这句%什么意思?

%是求余运算符,8bit是256,所以求出来的余数是寄存器低八位所需要的数值。路过帮解释下。

出0入0汤圆

发表于 2012-7-21 08:15:28 | 显示全部楼层
是不是你没有把那个数再读回来,或者你应该先让一个常量保存一下,再付给!

出0入0汤圆

 楼主| 发表于 2012-7-21 10:03:11 | 显示全部楼层
还是无法解决呀

出0入0汤圆

发表于 2012-7-21 15:05:21 | 显示全部楼层
CelestialBeing 发表于 2012-7-21 03:17
%是求余运算符,8bit是256,所以求出来的余数是寄存器低八位所需要的数值。路过帮解释下。 ...

配置定时器啊

出0入0汤圆

发表于 2012-7-21 22:07:17 | 显示全部楼层
眼子王来了。。。

出0入0汤圆

 楼主| 发表于 2012-7-22 00:23:49 | 显示全部楼层
jackson0585 发表于 2012-7-21 22:07
眼子王来了。。。

欢迎撒。发帖可以混积分的撒
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表