打印

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

[复制链接]
1761|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

中断处使用了寄存器组定义,所以中断函数中调用带参数的函数需要使用相同的寄存器组

使用特权

评论回复
5
lucidmask| | 2007-7-6 11:40 | 只看该作者

re

楼上正解,直接把  中断 using 1去掉好了

使用特权

评论回复
6
zgl7903| | 2007-7-6 11:58 | 只看该作者

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

普通函数使用的是寄存器组0,如果中断也使用这组寄存器组,且存在数据运算等操作时,进入中断时会保存寄存器组,退出中断时恢复寄存器组,白白浪费宝贵的CPU时间和资源;而如果使用了独立的寄存器组,则无保存和恢复寄存器组的操作,会大大提高程序效率.

使用特权

评论回复
7
会流泪的鱼|  楼主 | 2007-7-6 13:05 | 只看该作者

还是不行啊!!!

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

      return(x);
     }

我在子程序上加了using 1但是Y还是没有代进去!!!!

使用特权

评论回复
8
ayb_ice| | 2007-7-6 13:13 | 只看该作者

去掉using1...

最好把编译选项设置成"不使用绝对寄存器组"...

使用特权

评论回复
9
一无所知| | 2007-7-6 13:19 | 只看该作者

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

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

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

使用特权

评论回复
10
xb| | 2007-7-6 13:46 | 只看该作者

楼上说的对

中断服务这么复杂不符合中断处理的机制,建议修改程序结构

使用特权

评论回复
11
会流泪的鱼|  楼主 | 2007-7-6 15:08 | 只看该作者

看来只能这样了

因为是第一次编真正的程序,所以发现了很多问题,我把程序改起来在中断里面只用标志了

使用特权

评论回复
12
qingqiu647| | 2007-7-6 15:13 | 只看该作者

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

还有也是建议你,修改程序结构,不要把wendu_jishuan()放在中断里处理

使用特权

评论回复
13
会流泪的鱼|  楼主 | 2007-7-6 15:26 | 只看该作者

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

使用特权

评论回复
14
laowa23| | 2007-7-10 19:16 | 只看该作者

菜鸟询问

  void time0(void)interrupt 1 using 1

不好意思
这是怎么声明方式
各位前辈说的我看不懂
能不能详细解释解释

使用特权

评论回复
15
gyt| | 2007-7-10 19:42 | 只看该作者

这是中断处理程序的声明

使用特权

评论回复
16
turmary| | 2007-7-11 01:02 | 只看该作者

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

虽然调试时x, y即使都显示为0,
但是结果函数yunsuan1返回值却是正确的.

使用特权

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

本版积分规则

9

主题

34

帖子

1

粉丝