打印
[C语言]

c语言全局变量的问题【已解决】

[复制链接]
4328|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2014-1-6 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz549040622 于 2014-1-7 10:31 编辑

比如我在定时器里让一个变量m,然后定时器每10ms执行一次m++;我在主函数中打印这个m的值,可是我发现打印出来的值是这个m初始化的值,而不会随着定时器而增加,到底这个m应该如何定义呢?定义这个m有几种方式可以实现呢?

51函数测试.rar (92.45 KB)
main.c

#include "includes.h"


void main()
{

        LCD_Initial();
    Init_Timer0();
        InitUART();
        
        while(1)
        {
     SendByte(Key_Full_Value);
        }

}

Timer.c

#include "Timer.h"

UINT8U Key_Full_Value = 0;


void Init_Timer0(void)//5ms
{
TMOD |= 0x01;          //ʹÓÃģʽ1£¬16λ¶¨Ê±Æ÷£¬Ê¹ÓÃ"|"·ûºÅ¿ÉÒÔÔÚʹÓöà¸ö¶¨Ê±Æ÷ʱ²»ÊÜÓ°Ïì                     

EA=1;            //×ÜÖжϴò¿ª
ET0=1;           //¶¨Ê±Æ÷Öжϴò¿ª
TR0=1;           //¶¨Ê±Æ÷¿ª¹Ø´ò¿ª
}

/*------------------------------------------------
                 ¶¨Ê±Æ÷ÖжÏ×Ó³ÌÐò
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 using 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
Key_Full_Value++;

}

timer.h

#ifndef  _TIMER_H
#define  _TIMER_H

#include "reg52.h"
//#include "KEY.h"
#include "Uart.h"

void Init_Timer0(void);
extern UINT8U Key_Full_Value;

#endif


相关帖子

沙发
i55| | 2014-1-6 21:04 | 只看该作者
no code u say a j8

使用特权

评论回复
板凳
xyz549040622|  楼主 | 2014-1-6 21:26 | 只看该作者
i55 发表于 2014-1-6 21:04
no code u say a j8

:lol老朴俺不懂

使用特权

评论回复
地板
dirtwillfly| | 2014-1-6 21:32 | 只看该作者
对全局变量加上volatile试试

使用特权

评论回复
5
huangxz| | 2014-1-6 22:55 | 只看该作者
可能是编译器优化问题

使用特权

评论回复
6
as564335sa| | 2014-1-6 22:58 | 只看该作者
代码不贴出来咋看

使用特权

评论回复
7
xyz549040622|  楼主 | 2014-1-6 23:12 | 只看该作者
i55 发表于 2014-1-6 21:04
no code u say a j8

已经上代码了

使用特权

评论回复
8
xyz549040622|  楼主 | 2014-1-6 23:12 | 只看该作者
as564335sa 发表于 2014-1-6 22:58
代码不贴出来咋看

上代码了

使用特权

评论回复
9
板砖横飞| | 2014-1-6 23:16 | 只看该作者
可能编译器优化,一直取的是寄存器内的拷贝,加上volatile试试。

使用特权

评论回复
10
xyz549040622|  楼主 | 2014-1-6 23:22 | 只看该作者
@dirtwillfly  @板砖横飞  @huangxz 加上voatile,编译器优化开到最低,依然还是不行,已经上工程文件包

使用特权

评论回复
11
as564335sa| | 2014-1-6 23:54 | 只看该作者
Init_Timer0();
        InitUART();这两个里都初始化了TMOD寄存器,前面设置的被后面的覆盖了,最后TMOD的值是0x20吧,定时器0工作方式不是一了

使用特权

评论回复
12
as564335sa| | 2014-1-7 01:13 | 只看该作者
又看了下你的工程,里面用的是或逻辑赋值,那tmod没错,程序也没错,那考虑变量长度把!你设置的应该是char型的吧!一直加的话超过255就……

使用特权

评论回复
13
dong_abc| | 2014-1-7 02:07 | 只看该作者
本帖最后由 dong_abc 于 2014-1-7 02:10 编辑

中断函数退出了,里面的变量就消失了!
我一直用静态变量!   
extern "C" void __irq SysTick_Handler(void)
{
   volatile static unsigned char SysTickCnt = 0;
   
    SysTickCnt++;

    if(SysTickCnt%100==0)  
    {
        SysTickCnt=0;
        systick_tt.SysTick_Timer_Flag.T_500ms=1;
    }   
   
    if(SysTickCnt%20==0)  
    {
        systick_tt.SysTick_Timer_Flag.T_100ms=1;        
    }
   
    if(SysTickCnt%4==0)
    {                     
        systick_tt.SysTick_Timer_Flag.T_20ms=1;
    }

    systick_tt.SysTick_Timer_Flag.T_5ms=1;     
}


使用特权

评论回复
14
xyz549040622|  楼主 | 2014-1-7 07:59 | 只看该作者
dong_abc 发表于 2014-1-7 02:07
中断函数退出了,里面的变量就消失了!
我一直用静态变量!

我明明把他设置成外部全局变量来着

使用特权

评论回复
15
ayb_ice| | 2014-1-7 09:00 | 只看该作者
这种东西明显程序问题了

使用特权

评论回复
16
tjzyh| | 2014-1-7 09:05 | 只看该作者
用软件仿真了下,跟你这个void SendByte(unsigned char dat)有关系。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
xyz549040622 + 2
17
w522930954| | 2014-1-7 09:09 | 只看该作者
我给你试了一下。。。中断根本没进去。。。把串口初始化屏蔽掉就能进去了。你的串口初始化有问题,具体看看资料吧。。89C52已经绝迹好长时间了。。

使用特权

评论回复
评论
xyz549040622 2014-1-7 10:01 回复TA
压根没想中断进不去的问题,我在中断中用串口打印,还是好的 
评分
参与人数 1威望 +5 收起 理由
xyz549040622 + 5
18
w522930954| | 2014-1-7 09:13 | 只看该作者
变量的增加也没有问题,就是中断没进去而已。。。这跟全局变量没关系啊。都说全局变量猛于虎,但也不至于这么不堪一击吧。

使用特权

评论回复
19
guangbiao| | 2014-1-7 09:37 | 只看该作者
在定时中断中,加断点调试一下,看能否进去。。。

使用特权

评论回复
20
xyz549040622|  楼主 | 2014-1-7 09:58 | 只看该作者
tjzyh 发表于 2014-1-7 09:05
用软件仿真了下,跟你这个void SendByte(unsigned char dat)有关系。

就是这个函数问题,进入串口中断,跑飞了,谢谢啦:lol

使用特权

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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2810

主题

19297

帖子

104

粉丝