搜索
bottom↓
回复: 4

全局变量问题

[复制链接]

出0入0汤圆

发表于 2013-5-3 21:15:12 | 显示全部楼层 |阅读模式
请教个问题,在中断中能不能对全局变量改变之后在main中使用而不返回初始值?

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

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

出70入0汤圆

发表于 2013-5-7 09:50:32 | 显示全部楼层
全局变量当然能在中断中改变,也能在main中使用,我没懂你的“不返回初始值”是什么意思。

出0入0汤圆

发表于 2013-5-7 10:14:43 | 显示全部楼层
定义成 volatile变量就可以了

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

出20入22汤圆

发表于 2013-5-7 10:41:54 | 显示全部楼层
本来就是这样的啊,全局变量就是要这么干,不然叫什么全局变量

出0入0汤圆

 楼主| 发表于 2013-5-7 12:02:23 | 显示全部楼层
绿茶山人 发表于 2013-5-7 09:50
全局变量当然能在中断中改变,也能在main中使用,我没懂你的“不返回初始值”是什么意思。 ...

#include <REG52.H>
#define uchar unsigned char      
#define uint unsigned int
uchar  imt[1]={'a'};
uchar  imu[3];
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[1];
       
       
                SBUF=imt[0];       
                 
       
               
       
                  
                   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[1]=SBUF;
               // rx ++;
                                //        if(rx>imu) //+5的时候只接收6位
              // {
                                        // rx=imu;
               
               //}
              }   
                                    
}


我上面用的办法是判断ri触发次数(发几个字符给他,他就触发几次),从而来使(h==1).....等等
我不知道怎么把收的的数据赋值给变量 ,随便设一个h把,然后(h==1)的时候执行一个程序,(h==2).......指点一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-27 00:19

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

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