帮我看下这段程序吧,我找了两天了还是没找出问题

[复制链接]
2868|15
 楼主| 会流泪的鱼 发表于 2007-7-6 10:46 | 显示全部楼层 |阅读模式
pi, ui, AN, se, TI
    #include<INTRINS.H>
    #include<reg52.h>


    #define uchar unsigned char
    #define uint unsigned int


    uint yunsuan1(uint,uint); 
    void wendu_jishuan(void);
    uint  pinlu_shu[3];
    bit  fuhao;

    void time0(void)interrupt 1 using 1
    {
     TH0=0x3C;                                 /*重设初值*/
     TL0=0xC2;

     pinlu_shu[2]=0x2DE0;
     wendu_jishuan();

    }


     void wendu_jishuan(void)
     {
       if(pinlu_shu[2]<4899||pinlu_shu[2]>20024)
      {
       pinlu_shu[2]-=0000;
      }
      else if(pinlu_shu[2]<=11744)
      {
       pinlu_shu[2]-=10989;
       pinlu_shu[2]=yunsuan1(pinlu_shu[2],377);
       pinlu_shu[2]+=300;
       fuhao=0;
      }
      else if(pinlu_shu[2]<=12498)
      {
       pinlu_shu[2]-=11744;
       pinlu_shu[2]=yunsuan1(pinlu_shu[2],377);
       pinlu_shu[2]+=400;
       fuhao=0;
      }
      else
      {
       pinlu_shu[2]-=19271;
       pinlu_shu[2]=yunsuan1(pinlu_shu[2],376);
       pinlu_shu[2]+=1400;
       fuhao=0;
      }
     }




     uint yunsuan1(uint x,uint y)  
     {
      x/=2;
      x*=100;
      x/=y;

      return(x);
     }



    void main(void)
    {
      TMOD=0x51;                    /*设中段值,T1为计数,T0为计时*/
     TH0=0x3C;                        /*设计时初值,时间为0.1秒*/
     TL0=0xC2;                        
     TH1=0x00;                        /*清计时值*/
     TL1=0X00;
     EA=1;                            /*开总中断*/
     ET0=1;                            /*开T0计中断响应*/
     TR0=1;                            /*开T0计数*/
     TR1=1;                            /*开T1计数*/ 
     for(;;)
     {
      _nop_();
      _nop_();
      _nop_();
     }
    }

程序是这样的,我是KEIL编的
问是就是
     uint yunsuan1(uint x,uint y)  
     {
      x/=2;
      x*=100;
      x/=y;

      return(x);
     }
进入这个函数的时候Y就是代不进来本来Y应该是377但是,进来的是0000,这是为什么啊!!问题在那里,我现在在线等答案
 楼主| 会流泪的鱼 发表于 2007-7-6 10:49 | 显示全部楼层

现在查出来问题应该出在中断上,如果没有中断的话就是正常

wjy1107 发表于 2007-7-6 11:18 | 显示全部楼层

进中断处加上中断禁止试试.

zgl7903 发表于 2007-7-6 11:35 | 显示全部楼层

uint yunsuan1(uint x,uint y)后面加上 using 1

中断处使用了寄存器组定义,所以中断函数中调用带参数的函数需要使用相同的寄存器组
lucidmask 发表于 2007-7-6 11:40 | 显示全部楼层

re

楼上正解,直接把  中断 using 1去掉好了
zgl7903 发表于 2007-7-6 11:58 | 显示全部楼层

建议还是在中断调用函数后面加上 using 1

普通函数使用的是寄存器组0,如果中断也使用这组寄存器组,且存在数据运算等操作时,进入中断时会保存寄存器组,退出中断时恢复寄存器组,白白浪费宝贵的CPU时间和资源;而如果使用了独立的寄存器组,则无保存和恢复寄存器组的操作,会大大提高程序效率.
 楼主| 会流泪的鱼 发表于 2007-7-6 13:05 | 显示全部楼层

还是不行啊!!!

     uint yunsuan1(uint x,uint y) using 1
     {
      x/=2;
      x*=100;
      x/=y;

      return(x);
     }

我在子程序上加了using 1但是Y还是没有代进去!!!!
ayb_ice 发表于 2007-7-6 13:13 | 显示全部楼层

去掉using1...

最好把编译选项设置成"不使用绝对寄存器组"...
一无所知 发表于 2007-7-6 13:19 | 显示全部楼层

中断函数中的调用是比较特别的

    你在中断函数time0();中调用了函数wendu_jishuan(),又在这个函数中调用了函数yunsuan1(uint x,uint y),根据C51中对于中断函数的说明:

    凡是在中断函数中被调用的函数,所用寄存器组都必须和中断函数一致,那么也就是说,wendu_jishuan()也要声明为uising 1。
    而且还应该给在中断中调用的函数声明他的重入属性。
    考虑到你的的中断是定时中断,我觉得你这样的结构会影响定时的准确性,建议你在中断中竖起一个标志位,在主程序中,查标志位来处理温度计算。
xb 发表于 2007-7-6 13:46 | 显示全部楼层

楼上说的对

中断服务这么复杂不符合中断处理的机制,建议修改程序结构
 楼主| 会流泪的鱼 发表于 2007-7-6 15:08 | 显示全部楼层

看来只能这样了

因为是第一次编真正的程序,所以发现了很多问题,我把程序改起来在中断里面只用标志了
qingqiu647 发表于 2007-7-6 15:13 | 显示全部楼层

不指定使用的寄存器组,去掉using 1,看看

还有也是建议你,修改程序结构,不要把wendu_jishuan()放在中断里处理
 楼主| 会流泪的鱼 发表于 2007-7-6 15:26 | 显示全部楼层

谢谢各位了,我知道问题在那里了!!

laowa23 发表于 2007-7-10 19:16 | 显示全部楼层

菜鸟询问

  void time0(void)interrupt 1 using 1

不好意思
这是怎么声明方式
各位前辈说的我看不懂
能不能详细解释解释
gyt 发表于 2007-7-10 19:42 | 显示全部楼层

这是中断处理程序的声明

turmary 发表于 2007-7-11 01:02 | 显示全部楼层

我认为这个程序原本没问题

虽然调试时x, y即使都显示为0,
但是结果函数yunsuan1返回值却是正确的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

34

帖子

1

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