打印

请求各位大牛看看这两个程序的区别,急急急急

[复制链接]
2285|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victorgaopeiqi|  楼主 | 2012-1-21 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序1:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
void delay(uint);
sbit beer=P2^3;
uint i,j;
void fengming(uint n)
{
  for(i=0;i<n;i++)
  {
  beer=0;
  delay(1);
  beer=1;
  delay(1);
     }
                 }

void  delay(uint xms)
{

for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
   }
void main()
{
unsigned char temp;
temp=0xfe;
while(1)
{
   P1=temp;
   fengming(500);
   delay(500);
   temp=_crol_(temp,1);
  }                  
}
程序2:#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
void delay(uint);
sbit beer=P2^3;
uint i,j;
void fengming(uint n)
{
   uint i;  for(i=0;i<n;i++)
  {
  beer=0;
  delay(1);
  beer=1;
  delay(1);
     }
                 }

void  delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
   }
void main()
{
unsigned char temp;
temp=0xfe;
while(1)
{
   P1=temp;
   fengming(500);
   delay(500);
   temp=_crol_(temp,1);
  }                  
}
这两个程序到底有什么区别?i,j在全局变量中定义了还要再局部变量定义吗?小弟新手,请多多指教。。。。。。。

相关帖子

沙发
NE5532| | 2012-1-22 10:24 | 只看该作者
着急也犯不着发4次帖子吧~!两个都可以,局部变量和全局变量都可以用,你想下两个变量的作用范围就知道了。按需使用。

使用特权

评论回复
板凳
刘前辈| | 2012-1-22 11:54 | 只看该作者
本帖最后由 刘前辈 于 2012-1-22 11:59 编辑

局部变量是私有的,别人看不见也不知道也不可能使用的。随函数运行完毕而消亡。有点像ATM自动取款机的私人密码。

全局变量是公用的,是所有人都看得见、可以使用的。“永”不消亡的。

所以,全局变量可以作为各函数之间的通信媒介。——局部变量可做不到。
所以,如果私有函数不需要和别人交流数据,那就使用局部变量,还是自己的私人密码可靠。而全局变量万一被中断ISR 共用,可就麻烦了。


、、

使用特权

评论回复
地板
forgot| | 2012-1-22 12:36 | 只看该作者
刘前辈说的好 3# 刘前辈

使用特权

评论回复
5
frlop| | 2012-1-22 14:33 | 只看该作者
就是局部变量 和全局变量的用法,自己去找模块化编程的资料,会有详细介绍的。

使用特权

评论回复
6
nongfuxu| | 2012-1-22 18:33 | 只看该作者
那就使用局部变量,还是自己的私人密码可靠。而全局变量万一被中断ISR 共用,可就麻烦了。

全局与局部变量的关键点.

使用特权

评论回复
7
victorgaopeiqi|  楼主 | 2012-1-24 09:53 | 只看该作者
但是这两个程序我验证的时候效果不一样啊,第二个程序是发光二极管常亮,蜂鸣器一直叫。第一个程序就可以做到发光二极管是流水灯的形式,蜂鸣器简写鸣叫啊,这是什么原因啊。。。。

使用特权

评论回复
8
victorgaopeiqi|  楼主 | 2012-1-24 10:05 | 只看该作者
:L不好意思,不知道点发表之后就易经发表了,刷新之后才看到,抱歉,抱歉

使用特权

评论回复
9
刘前辈| | 2012-1-24 13:33 | 只看该作者
本帖最后由 刘前辈 于 2012-1-24 13:41 编辑
#7楼
          但是这两个程序我验证的时候效果不一样啊,第二个程序是发光二极管常亮,蜂鸣器一直叫。第一个程序就可以做到发光二极管是流水灯的形式,蜂鸣器简写鸣叫啊,这是什么原因啊。。。。


说反了吧,应该是第二个程序2使用私有局部变量正确;而第一个程序1中的全局变量i 被2个不同函数共享覆盖了。——乱套了。

、、

使用特权

评论回复
10
victorgaopeiqi|  楼主 | 2012-1-25 09:07 | 只看该作者
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(uchar,uchar);
void delay(uint);
uchar shi,ge,num,num1;
void main()
{
  TMOD=0x11;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  EA=1;
  ET0=1;
  TR0=1;
  ET1=1;
  TR1=1;
  while(1)
  {
   display(shi,ge);
   }
  }
void t0()interrupt 1
{ uint a;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  a++;
  if(a==4)
  {
    a=0;
           led=~led;
   }
  }
void t1()interrupt 3
{
  
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  num++;
  if(num==20)
   {
    num=0;
    num1++;
    shi=num1/10;
    ge=num1%10;
    if(num1==60)
         {num1=0;}
        }
}
void display(uchar shi,uchar ge)
{
duan=1;
P0=table[shi];                       
duan=0;
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
delay(5);

duan=1;
P0=table[ge];
duan=0;
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
delay(5);
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
   }
像上面这样就可以实现发光二极管的流水灯闪烁和60秒计时。定义的为全局变量。但是像下面一样就不可以了,
为局部变量。这是为什么呢?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
sbit duan=P2^6;
sbit wei=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(uchar,uchar);
void delay(uint);
void main()
{ uchar shi,ge;
  TMOD=0x11;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  EA=1;
  ET0=1;
  TR0=1;
  ET1=1;
  TR1=1;
  while(1)
  {
   display(shi,ge);
   }
  }
void t0()interrupt 1
{ uint a;
  TH0=(65536-45872)/256;
  TL0=(65536-45872)%256;
  a++;
  if(a==4)
  {
    a=0;
           led=~led;
   }
  }
void t1()interrupt 3
{
   uchar shi,ge,num,num1;
  TH1=(65536-45872)/256;
  TL1=(65536-45872)%256;
  num++;
  if(num==20)
   {
    num=0;
    num1++;
    shi=num1/10;
    ge=num1%10;
    if(num1==60)
         {num1=0;}
        }
}
void display(uchar shi,uchar ge)
{
duan=1;
P0=table[shi];                       
duan=0;
P0=0xff;
wei=1;
P0=0xfe;
wei=0;
delay(5);

duan=1;
P0=table[ge];
duan=0;
P0=0xff;
wei=1;
P0=0xfd;
wei=0;
delay(5);
}
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
   }
小弟刚入门,最近几天被局备变量和全局变量困扰啊,求求刘前辈指教啊。。。。:'(:'(

使用特权

评论回复
11
08211004kun| | 2012-1-25 23:39 | 只看该作者
楼主你下面的那段程序t1()函数里面的shi这个变量跟display(uchar shi,uchar ge)这个函数里面的shi这一变量是不同的两个东西,两者是没有关联的,只是名字相同而已,ge也同理;
不论t1()函数里面的shi和ge怎么变,都不会影响到display(uchar shi,uchar ge)这一函数里面的shi和ge,所以你的显示是不会变的。
关于局部和全局变量还是函数的参数等等不是几句话就能解释得清楚的,还是多看书吧:(

使用特权

评论回复
12
zc564075839| | 2012-1-26 16:34 | 只看该作者
记号

使用特权

评论回复
13
刘前辈| | 2012-1-27 18:58 | 只看该作者
11楼正解。

重复3楼概念:

局部变量是私有的,别人看不见也不知道也不可能使用的。

display( shi, ge);和

void t1()interrupt 3
{
   uchar shi,ge;

是2个互不相识的人,他们的 shi, ge 分别属于各自的隐私。局部变量不可能作为2函数相互通信媒介,全局变量才行。——3楼说过了,没必要反复讲,书上都有。



、、

使用特权

评论回复
14
无名小豆丁| | 2012-1-28 10:40 | 只看该作者
LZ 的程序没有问题,允许全局变量和局部变量同名。编译程序通常按局部变量优先来编译。
只不过任何编译器都不提倡全局变量和局部变量同名。

使用特权

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

本版积分规则

0

主题

18

帖子

1

粉丝