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

[复制链接]
 楼主| xyz549040622 发表于 2014-1-6 20:57 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2014-1-7 10:31 编辑

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


main.c

  1. #include "includes.h"


  2. void main()
  3. {

  4.         LCD_Initial();
  5.     Init_Timer0();
  6.         InitUART();
  7.         
  8.         while(1)
  9.         {
  10.      SendByte(Key_Full_Value);
  11.         }

  12. }

Timer.c

  1. #include "Timer.h"

  2. UINT8U Key_Full_Value = 0;


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

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

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

  18. }

timer.h

  1. #ifndef  _TIMER_H
  2. #define  _TIMER_H

  3. #include "reg52.h"
  4. //#include "KEY.h"
  5. #include "Uart.h"

  6. void Init_Timer0(void);
  7. extern UINT8U Key_Full_Value;

  8. #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试试
huangxz 发表于 2014-1-6 22:55 | 显示全部楼层
可能是编译器优化问题
as564335sa 发表于 2014-1-6 22:58 | 显示全部楼层
代码不贴出来咋看
 楼主| xyz549040622 发表于 2014-1-6 23:12 | 显示全部楼层
i55 发表于 2014-1-6 21:04
no code u say a j8

已经上代码了
 楼主| xyz549040622 发表于 2014-1-6 23:12 | 显示全部楼层
as564335sa 发表于 2014-1-6 22:58
代码不贴出来咋看

上代码了
板砖横飞 发表于 2014-1-6 23:16 | 显示全部楼层
可能编译器优化,一直取的是寄存器内的拷贝,加上volatile试试。
 楼主| xyz549040622 发表于 2014-1-6 23:22 | 显示全部楼层
@dirtwillfly  @板砖横飞  @huangxz 加上voatile,编译器优化开到最低,依然还是不行,已经上工程文件包
as564335sa 发表于 2014-1-6 23:54 | 显示全部楼层
Init_Timer0();
        InitUART();这两个里都初始化了TMOD寄存器,前面设置的被后面的覆盖了,最后TMOD的值是0x20吧,定时器0工作方式不是一了
as564335sa 发表于 2014-1-7 01:13 | 显示全部楼层
又看了下你的工程,里面用的是或逻辑赋值,那tmod没错,程序也没错,那考虑变量长度把!你设置的应该是char型的吧!一直加的话超过255就……
dong_abc 发表于 2014-1-7 02:07 | 显示全部楼层
本帖最后由 dong_abc 于 2014-1-7 02:10 编辑

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

  6.     if(SysTickCnt%100==0)  
  7.     {
  8.         SysTickCnt=0;
  9.         systick_tt.SysTick_Timer_Flag.T_500ms=1;
  10.     }   
  11.    
  12.     if(SysTickCnt%20==0)  
  13.     {
  14.         systick_tt.SysTick_Timer_Flag.T_100ms=1;        
  15.     }
  16.    
  17.     if(SysTickCnt%4==0)
  18.     {                     
  19.         systick_tt.SysTick_Timer_Flag.T_20ms=1;
  20.     }

  21.     systick_tt.SysTick_Timer_Flag.T_5ms=1;     
  22. }


 楼主| xyz549040622 发表于 2014-1-7 07:59 | 显示全部楼层
dong_abc 发表于 2014-1-7 02:07
中断函数退出了,里面的变量就消失了!
我一直用静态变量!

我明明把他设置成外部全局变量来着
ayb_ice 发表于 2014-1-7 09:00 | 显示全部楼层
这种东西明显程序问题了
tjzyh 发表于 2014-1-7 09:05 | 显示全部楼层
用软件仿真了下,跟你这个void SendByte(unsigned char dat)有关系。

评分

参与人数 1威望 +2 收起 理由
xyz549040622 + 2

查看全部评分

w522930954 发表于 2014-1-7 09:09 | 显示全部楼层
我给你试了一下。。。中断根本没进去。。。把串口初始化屏蔽掉就能进去了。你的串口初始化有问题,具体看看资料吧。。89C52已经绝迹好长时间了。。

评论

压根没想中断进不去的问题,我在中断中用串口打印,还是好的  发表于 2014-1-7 10:01

评分

参与人数 1威望 +5 收起 理由
xyz549040622 + 5

查看全部评分

w522930954 发表于 2014-1-7 09:13 | 显示全部楼层
变量的增加也没有问题,就是中断没进去而已。。。这跟全局变量没关系啊。都说全局变量猛于虎,但也不至于这么不堪一击吧。
guangbiao 发表于 2014-1-7 09:37 | 显示全部楼层
在定时中断中,加断点调试一下,看能否进去。。。
 楼主| xyz549040622 发表于 2014-1-7 09:58 | 显示全部楼层
tjzyh 发表于 2014-1-7 09:05
用软件仿真了下,跟你这个void SendByte(unsigned char dat)有关系。

就是这个函数问题,进入串口中断,跑飞了,谢谢啦:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部