打印

变量赋值问题,大哥们帮忙!

[复制链接]
2319|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy2008|  楼主 | 2010-3-22 10:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义的全局变量adval不能动态的赋值,在程序最后加复位才能实现A/D动态显示效果,不加复位数码管只能静态显示,调节外部输入模拟量无效
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wr=P3^6;
sbit rd=P3^7;
sbit dula=P2^6;   
sbit wela=P2^7;
uchar a,A1,A2,A2t,A3,adval;
uchar code table[]={   
                        0x3f,0x06,0x5b,0x4f,   
                        0x66,0x6d,0x7d,0x07,   
                        0x7f,0x6f,0x77,0x7c,   
                        0x39,0x5e,0x79,0x71   
                    };
.
.
.
.
.
.
void main()
{
while(1)
{
start();
P1=0xff;  //拉高  
delay(20);
rd=0;
delay(10);
rd=1;
adval=P1;//p1口值(A/D输出的模拟量)赋给adval,adval交给display显示
delay(10);
  

    A1=adval/100;         
    A2t=adval%100;   
    A2=A2t/10;   
    A3=A2t%10;
display(A1,A2,A3);
delay(10);
//复位
}
}

相关帖子

沙发
chen3bing| | 2010-3-22 12:34 | 只看该作者
会不会是延时时间太短。

使用特权

评论回复
板凳
energy2008|  楼主 | 2010-3-22 14:03 | 只看该作者
不是,把adval改P0口,P0的值是可以动态变化的,如果屏蔽掉display(adval没有分配空间),P1口外接的发光二极管也可以动态变化的,我觉得是变量adval出的问题!

使用特权

评论回复
地板
gaohq| | 2010-3-22 18:14 | 只看该作者
display函数是怎样子的?

使用特权

评论回复
5
hxlwjn| | 2010-3-23 11:56 | 只看该作者
把adval变成局部变量就没问题吗?我看不是变量赋值问题。

使用特权

评论回复
6
energy2008|  楼主 | 2010-3-23 14:41 | 只看该作者
问题解决了!这几天拼命查阅资料发现了问题原因,看来很多初学者和我一样没有意识到这个问题,贴出来和大家分享一下,共同提高。
    全局变量adval前要加volatile修饰符。如果你声明变量使用了volatile修饰符,编译器就不会把这个变量缓存在寄存器里——每次访问都将去存取变量在内存中的实际位置,如果一个变量会被其它引用改变,或在其它并行的任务中会被改变(例如上面的程序),都要显式地说明为"volatile”,否则在编译器优化阶段会作出错误的判断,例如将这个变量读入寄存器以后,在没有对这个变量赋值以前,会一直使用寄存器中的值,而实际上这个变量的值可能已经被一个指针引用改变了,或者是在中断服务程序中被改变了。(怪不得我的P1在读前拉高,数码管会显示255,其实程序读的是寄存器的备份,没有读变化的模拟电压量)

使用特权

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

本版积分规则

0

主题

12

帖子

1

粉丝