搜索
bottom↓
回复: 30

51单片机 变量的问题

[复制链接]

出0入8汤圆

发表于 2012-6-8 22:38:01 | 显示全部楼层 |阅读模式
今天偶尔 发现个 很纠结的问题
先把程序 上传了
#include<reg52.h>
#define uint unsigned int

void abc(void)
{
        uint a;
        a++;

}
void main()
{
        uint b;
        while(1)
        {
            b++;
        abc();
        }
}
按照 程序的流程b++ 后  等到 执行到 abc() 函数 后 a才 ++  可是 在调试的时候
b++ 刚执行完  a 就是加一了
还有个问题 是  明明在程序中 a 定义的是 uint 类型 应该 16位的 在调试的时候只有 8位了  百思不得其解
哪位 大大能够解释 解释的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-6-8 22:56:47 | 显示全部楼层
你Watch里看到的不是你的变量a,而是单片机的ACC寄存器的值. 没进入abc函数之前,abc内的局部变量a对调试器来说不可见.

出0入0汤圆

发表于 2012-6-8 23:59:50 | 显示全部楼层
shark 发表于 2012-6-8 22:56
你Watch里看到的不是你的变量a,而是单片机的ACC寄存器的值. 没进入abc函数之前,abc内的局部变量a对调试器来 ...

正解。
LZ你把你abc函数里的变量a改个名字,再调试观察,就知道是怎么回事了。

出0入0汤圆

发表于 2012-6-9 02:10:06 | 显示全部楼层
路过!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2012-6-9 07:00:21 来自手机 | 显示全部楼层
果然,命名是一件很重要的事情

出0入0汤圆

发表于 2012-6-9 07:55:21 | 显示全部楼层
改成全局变量,也行

出0入8汤圆

 楼主| 发表于 2012-6-9 07:57:04 | 显示全部楼层
shark 发表于 2012-6-8 22:56
你Watch里看到的不是你的变量a,而是单片机的ACC寄存器的值. 没进入abc函数之前,abc内的局部变量a对调试器来 ...

谢谢 谢谢 ! 名师一点通哇   呵呵

出0入8汤圆

 楼主| 发表于 2012-6-9 09:41:42 | 显示全部楼层
本帖最后由 12tangyang12 于 2012-6-9 09:42 编辑
shark 发表于 2012-6-8 22:56
你Watch里看到的不是你的变量a,而是单片机的ACC寄存器的值. 没进入abc函数之前,abc内的局部变量a对调试器来 ...


我把程序改了 一下 可是 新 的问题 有出来了

图中 ii++ 都没有执行到 只是 刚进入bcd()   ii   的值怎么就成了 0x0001 了

等到执行 ii++ 后 ii 又加了一次  就是说 每调用 bcd()  一次  ii  竟然 加了 两次 。
天哪  脑子 糊涂了 现在是

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-6-9 10:44:03 | 显示全部楼层
受教了

出0入0汤圆

发表于 2012-6-9 10:45:47 | 显示全部楼层
定义一个变量却没初始化就进行自增操作,会不会有问题的啊

出0入0汤圆

发表于 2012-6-9 12:16:37 | 显示全部楼层
楼主为什么坚持不为变量赋初值呢?

出0入0汤圆

发表于 2012-6-9 12:48:22 | 显示全部楼层
12tangyang12 发表于 2012-6-9 09:41
我把程序改了 一下 可是 新 的问题 有出来了  

图中 ii++ 都没有执行到 只是 刚进入bcd()   ii ...

abc 和 bcd 之间没有调用关系, 所以他们的局部变量会被编译覆盖, 就是说变量 cc 和 ii 实际上占用同一内存地址.
由于你没有给初值, 在调用bcd的时候, 它的ii实际上就是已经被加1后的abc()函数内的局部变量cc .

出0入8汤圆

 楼主| 发表于 2012-6-9 13:33:27 | 显示全部楼层
本帖最后由 12tangyang12 于 2012-6-9 13:36 编辑
shark 发表于 2012-6-9 12:48
abc 和 bcd 之间没有调用关系, 所以他们的局部变量会被编译覆盖, 就是说变量 cc 和 ii 实际上占用同一内 ...



强人 解释的 精辟。  在实际编程中很有可能遇到两个没有调用关系的函数  局部变量就被编译覆盖了 。

嗯嗯 ,给定初值后 问题解决了。。。

thank  you

出0入0汤圆

发表于 2012-6-9 14:10:39 | 显示全部楼层
不赋初值的自加运算以及自减运算,都是耍流氓

出0入0汤圆

发表于 2012-6-9 14:17:23 来自手机 | 显示全部楼层
一个没有初始化的数自加自减干乌呀?

出0入0汤圆

发表于 2012-6-9 15:58:43 | 显示全部楼层
dudududu 发表于 2012-6-9 14:10
不赋初值的自加运算以及自减运算,都是耍流氓

应该说“不赋初值的局部变量都是流氓、不赋初值的局部指针变量都是流氓头子”。

出0入8汤圆

 楼主| 发表于 2012-6-9 16:19:37 | 显示全部楼层
eduhf_123 发表于 2012-6-9 15:58
应该说“不赋初值的局部变量都是流氓、不赋初值的局部指针变量都是流氓头子”。 ...

出0入0汤圆

发表于 2012-6-9 16:23:12 | 显示全部楼层
eduhf_123 发表于 2012-6-9 15:58
应该说“不赋初值的局部变量都是流氓、不赋初值的局部指针变量都是流氓头子”。 ...

恩,看过很多帖子以后,得出一个结论,红头发这哥们是个编程高高手

出0入0汤圆

发表于 2012-6-9 17:06:55 | 显示全部楼层
说得好……

出0入0汤圆

发表于 2012-6-9 18:44:15 | 显示全部楼层
新人常遇到的问题,建议楼主认真看看c语言的书。其实很多地方都有详细的说明。都有提到,只是不实际用就注意不到罢了。

出0入8汤圆

 楼主| 发表于 2012-6-9 18:48:31 | 显示全部楼层
vp110 发表于 2012-6-9 18:44
新人常遇到的问题,建议楼主认真看看c语言的书。其实很多地方都有详细的说明。都有提到,只是不实际用就注 ...

是啊  是啊  多谢指导

出0入0汤圆

发表于 2012-6-9 18:54:04 | 显示全部楼层
记得初始化啊,要是不初始化,将来搞个银行系统,那还不玩完啊。这个人钱没了,那个人钱突然多了几百万,哈哈。。。。。

出0入8汤圆

 楼主| 发表于 2012-6-9 21:04:18 | 显示全部楼层
shell.albert 发表于 2012-6-9 18:54
记得初始化啊,要是不初始化,将来搞个银行系统,那还不玩完啊。这个人钱没了,那个人钱突然多了几百万,哈 ...

出0入0汤圆

发表于 2012-6-10 21:51:45 | 显示全部楼层
dudududu 发表于 2012-6-9 16:23
恩,看过很多帖子以后,得出一个结论,红头发这哥们是个编程高高手  ...


嗯,他是编程高高手、俺是搞硬件的。

出0入0汤圆

发表于 2012-6-11 17:29:55 | 显示全部楼层
楼上的,那个红头发的,说的就是你

出0入0汤圆

发表于 2012-6-11 20:04:27 来自手机 | 显示全部楼层
围观卖萌的高手
来自:amoBBS 阿莫电子论坛 Android客户端

出0入0汤圆

发表于 2012-6-15 10:27:40 | 显示全部楼层
dudududu 发表于 2012-6-11 17:29
楼上的,那个红头发的,说的就是你

红头发的是俺头像,之前还真不知道他是编程高手来着……

出0入0汤圆

发表于 2012-6-15 10:35:08 | 显示全部楼层
路过

出0入0汤圆

发表于 2012-6-15 13:15:46 | 显示全部楼层
eduhf_123 发表于 2012-6-8 23:59
正解。
LZ你把你abc函数里的变量a改个名字,再调试观察,就知道是怎么回事了。 ...

我用F330做东西,再没进行嵌套汇编的设置之前,程序运行正确,比如捕获脉宽:
         输入脉宽值              脉宽变量width值
       3000us                         0x0bc3
           2200us                        0x08a3
           3800us                        0x0ee5
在做如下设置:
            
          1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
           #pragma ASM;
                   Assembler Code Here
                 #pragma ENDASM

              2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和

          “Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

        3、根据选择的编译模式,把 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件作为工程的最后文件;
为了方便测试,排除错误,我把嵌套汇编的程序屏蔽掉了,但是测试下来得到如下的值
        输入脉宽值         脉宽变量width值

        3000us                         0x0b
           2200us                          0x08
           3800us                         0x0e
此外,我的所有变量,似乎都只有高位,没有低位了。
请各位指点一下

出0入0汤圆

发表于 2012-6-15 13:28:44 | 显示全部楼层
shark 发表于 2012-6-8 22:56
你Watch里看到的不是你的变量a,而是单片机的ACC寄存器的值. 没进入abc函数之前,abc内的局部变量a对调试器来 ...

我用F330做东西,再没进行嵌套汇编的设置之前,程序运行正确,比如捕获脉宽:
         输入脉宽值              脉宽变量width值
       3000us                         0x0bc3
           2200us                        0x08a3
           3800us                        0x0ee5
在做如下设置:
            
          1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:
           #pragma ASM;
                   Assembler Code Here
                 #pragma ENDASM

              2、在 Project 窗口中包含汇编代码的 C 文件上右键,选择“Options for ...”,点击右边的“Generate Assembler SRC File”和

          “Assemble SRC File”,使检查框由灰色变成黑色(有效)状态;

        3、根据选择的编译模式,把 Keil\C51\Lib\C51S.Lib)加入工程中, 该文件作为工程的最后文件;
为了方便测试,排除错误,我把嵌套汇编的程序屏蔽掉了,但是测试下来得到如下的值
        输入脉宽值         脉宽变量width值

        3000us                         0x0b
           2200us                          0x08
           3800us                         0x0e
此外,我的所有变量,似乎都只有高位,没有低位了。

出0入0汤圆

发表于 2012-6-17 23:23:05 来自手机 | 显示全部楼层
受教了,多谢!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:17

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

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