yh1036164041 发表于 2013-5-3 21:15:12

全局变量问题

请教个问题,在中断中能不能对全局变量改变之后在main中使用而不返回初始值?

绿茶山人 发表于 2013-5-7 09:50:32

全局变量当然能在中断中改变,也能在main中使用,我没懂你的“不返回初始值”是什么意思。

sjnh 发表于 2013-5-7 10:14:43

定义成 volatile变量就可以了

“不返回初始值” 估计是 中断中改变了,main中还是原来的值

gyzzg2030 发表于 2013-5-7 10:41:54

本来就是这样的啊,全局变量就是要这么干,不然叫什么全局变量

yh1036164041 发表于 2013-5-7 12:02:23

绿茶山人 发表于 2013-5-7 09:50 static/image/common/back.gif
全局变量当然能在中断中改变,也能在main中使用,我没懂你的“不返回初始值”是什么意思。 ...

#include <REG52.H>
#define uchar unsigned char      
#define uint unsigned int
ucharimt={'a'};
ucharimu;
uchar c,t,f,y;
//uchar *rx=imu;
bit flag_send=1;
void delay900ms(void)   //误差 -0.000000000205us
{
    unsigned char a,b,c;
    for(c=127;c>0;c--)
      for(b=128;b>0;b--)
            for(a=24;a>0;a--);
}

void delay20us(void)   //误差 -0.46875us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
      for(a=1;a>0;a--);
}

void init(void)                        
{                        
TMOD=0x20;   //T1方式2                     
TH1=0xfd;   //波特率 1200 晶振12M                     
TL1=0xfd;                        
SCON=0x50;//串口工作于方式1即10位(1+8+1)      
TR1=1;      //启动定时器1      
ES=1;       //串口中断允许         
EA=1;      //总中断打开
}            

void send (void)
{
      //uchar i=0;
      ES =0;
                //for(i=0;i<1;i++)      
   // {   
       
          //SBUF=imu;
       
       
                SBUF=imt;       
                 
       
               
       
                  
                   while(!TI);
            TI=0;
               
        //        ES=0;
   // }
      
                ES=1 ;
}
void main(void)                        
{   
   
    t=0;

       flag_send=0;
      init();
      while(1)
       {
          if(t==1)
               {
                  f++;
       }
   if(flag_send)
            {
                          
                                  
                              y++;
                                  
            

            flag_send =0;
                                  
            }
                                if(f==100)
                                {
                                        if(y==1)
                                        {
            while(!flag_send)
                                  {
            send() ;
                               
               y=0;
                                        f=0;
                                        t=0;
                                        }
                                   }
                                        if(y==2)
                                        {
            send() ;
                                  
                                  send() ;
                                  
                                  
                                  
                                  
               y=0;
                                        f=0;
                                        t=0;
                              }
                                                if(y==3)
                                        {
            send() ;
            send() ;
                                  
                                  send() ;
                               
               y=0;
                                        f=0;
                                        t=0;
                                   }
                                        if(y==4)
                                        {
            send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                                  
                                  
               y=0;
                                        f=0;
                                        t=0;
                              }
                                                if(y==5)
                                        {

            send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                           send() ;
                                  send() ;
               y=0;
                                        f=0;
                                        t=0;
                                   }
                                        if(y==6)
                                        {
            send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                                  
                                  send() ;
                                  
                                  send() ;
               y=0;
                                        f=0;
                                        t=0;
                              }




                               
                                        }
                       
                  
   
      }      
}
      void uart(void) interrupt 4
{   
            if(RI)
             {
                                  
                             RI=0;
                                       t=1;
                                        flag_send=1;
            // imu=SBUF;
               // rx ++;
                                //        if(rx>imu) //+5的时候只接收6位
            // {
                                        // rx=imu;
               
               //}
            }   
                                  
}


我上面用的办法是判断ri触发次数(发几个字符给他,他就触发几次),从而来使(h==1).....等等
我不知道怎么把收的的数据赋值给变量 ,随便设一个h把,然后(h==1)的时候执行一个程序,(h==2).......指点一下
页: [1]
查看完整版本: 全局变量问题