5628|12

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在线急求 8051在keil中编程关于全局变量的问题! [复制链接]

我使用的是一款STC的一个有双串口的51片子,有1280byte的RAM和60K的ROM.
我声明了几个全局变量比如:
unsigned int counst1;
unsigned char buf[256];

然后在串口的中断程序中使用来存放接受数据,但是经过以下语句查看串口输出很奇怪

k=SBUF;  //SBUF内容是0x01
buf[0]=k;
Serial_One_Send_Byte(k);
Serial_One_Send_Byte(buf[0]);

然后我在串口助手开到我输出的k是0x01
但是buf[0]是0xFF 很是费解
我想应该是内存空间的问题但是不晓得到底该怎么做
那为大哥帮帮忙 很急的 谢谢了先

最新回复

顶  详情 回复 发表于 2009-5-29 02:08
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
一直循环着的
但是都一样没办法
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
把你相关的代码贴出来看看吧
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
最好不用全局变量
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
代码没带出来
如果不用全局的话又没加OS更不好搞
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

6
 
你可以把这么大的数组放到XDATA区, 当然这个还与你的存储器模式设置有关(small/large)。  
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
#include
#include "string.h"
#include "stdio.h"
#include "stdlib.h"

#define        Fosc                        24000000                //24.0MHZ
#define        Tc                                1                //ms
#define        CTC0_RELOAD_H        0xb1                        //Tc/12/Fosc/100;(12T)
#define CTC0_RELOAD_L        0xe0                        //Tc/1/Fosc/100;(1T)
#define TIME_OVER                6000                        //时间片 1s=1000
#define CLEAR_S2TI                0xFD                        //1111 1101
#define CLEAR_S2RI                0xFE                        //1111 1110

struct  ICXX_Message
{
    ......       
};

struct  ICJC_Message
{
        .......       
};

sbit        MCU_Debug_Led=P1^4;

struct ICXX_Message icxxdata;       
struct ICJC_Message icjcdata;
unsigned char Current_Address[4];                                 
xdata unsigned char One_Rec_Buffer[30];                //串口接收缓存          
xdata unsigned char Two_Rec_Buffer[256];
xdata unsigned int counst1;                                                        //串口计数器
xdata unsigned int counst2;                               
unsigned int time_slice=1;                                                //时间计数器 CTC0中断一次加1
unsigned char        flag_time;
unsigned char         flag_rec;                                                                    
unsigned char        flag_send;
unsigned char        One_Send_Ok;                                        //串口1接收结束
unsigned int One_end_flag        ;                                        //串口1接收到结束符标志
unsigned char        Two_Send_Ok;                                          //串口2接收结束

void Wink_Led(unsigned int time);
void Serial_One_Initial(unsigned int band1);
void Serial_One_Send_Byte(char c1);
void Serial_One_Interrupt_Receive();
void Serial_Two_Initial(unsigned int band2);
void Serial_Two_Send_Byte(char c2);
void Serial_Two_Interrupt_Receive();
void Delay(int time);

void main()
{                 
        flag_time=0;
        One_Send_Ok=0;                                        //信号量初始化
        Two_Send_Ok=0;
        One_end_flag=0;
        flag_time=0;
        flag_rec=0;
        flag_send=0;
        counst1=0;
        counst2=0;
        memset(One_Rec_Buffer,0,30);
        memset(Two_Rec_Buffer,0,256);

        Serial_One_Initial(9600);                //串口初始化
        Serial_Two_Initial(9600);

        Serial_One_Send_Byte('A');

        while (counst1<30)
        {
                Serial_One_Send_Byte(One_Rec_Buffer[counst1++]);
                Delay(10);
                Serial_One_Send_Byte('B');
                Delay(10);       
        }                 
}

void Serial_One_Initial(unsigned int band1)
{
        unsigned int RELOAD;
//        RELOAD=256-int(Fosc/band/32+0.5);        //1T                        
        RELOAD=256-(int)(Fosc/band1/32/12+0.5);//12T                

        SCON=0x50;                //串口1 8位可变波特率无校验                                
/*  定时器1作为波特率发生器                          
        TMOD=0x20;                //使用定时器1作为波特率发生器                  
        TH1=RELOAD;
        TL1=RELOAD;
        TR1=1;                        //启动定时器1                 
*/
        BRT=RELOAD;                //使用独立波特率发生器                         
        AUXR=0x11;                //BRTR=1 启动独立波特率发生器                        
                                        //S1BRS=1        串口1使用独立拨特率发生器                       
       
        ES=1;                        //开串口1中断                
        EA=1;                        //开中断         
}

void Serial_One_Send_Byte(char c1)                       
{
        ES=0;
        TI=0;
        SBUF=c1;
        while(TI==0);
        TI=0;
        ES=1;
}

void Serial_One_Interrupt_Receive() interrupt 4
{
        unsigned char k;
        if(RI==1)
        {
                RI=0;
                k=SBUF;                                                                  
                if(k==0x01)         
                {
                        One_Rec_Buffer[counst1++]=k;
                        Serial_One_Send_Byte(k);
                        Serial_One_Send_Byte(One_Rec_Buffer[counst1-1]);       
                }
                else
                {
                       。。。。。。。。。。。
                }
        }          
        else
                TI=0;                                               
}

void Wink_Led(unsigned int time)
{
        unsigned int count;
        unsigned char i=3;
        while(i>0)
        {
                i--;
                MCU_Debug_Led=0;
                for(count=0;count                 {
                        _nop_();
                        _nop_();
                        _nop_();
                }
                MCU_Debug_Led=1;
                for(count=0;count                 {
                        _nop_();
                        _nop_();
                        _nop_();
                }
        }
}
。。。。。。
代码贴出来了大家帮我看看哈 问题出在全局变量One_Rec_Buffer和counst1上 对他们的写完全无效包括用memset来清One_Rec_Buffer,串口输出都是0xFF,局部变量的读写有效
赋给全局的没有了
大家帮我看看哈 还有关于设置 我都用的large代码数据都是不然编译都不通过
编译器LX51和BX51都用过了没用
我想应该要一个类似与startup之类的内存初始化文件但是我都试了哈都不管用只是不晓得自己做的对不,在keil提供的
startup文件上把 xdatalen改成了3ffH.
大哥门帮我看哈啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
今天有搞了一天
突然在查看M51文件的时候发现XDATA都2000多个字节了
本来RAM就只有1280字节可能是这个问题今天改了哈把XDATA压缩到900多个字节
不过没时间试了 看来只有端午节加班了
悲哀啊
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
我想很大的可能是串口根本就没接收到数据
你把BUF[256]清空,多发几个数据,看看BUF[1]BUF[2]..是不是和BUF[0]一样是0XFF
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
STC的是51核的,先用下面的代码试,然后再进行修改。有问题就继续讨论。
  1. # include
  2. # define BYTE unsigned char
  3. # define WORD unsigned int

  4. BYTE idata txdata[7]={"ABCDEF"};
  5. sbit  P15=P1^5;
  6. void main()
  7. {
  8.   BYTE h;
  9.   WORD k;
  10.   P15 = 0x00;
  11.   TMOD=0X20;
  12.   TL1=0xfd;  //9600,根据晶振选择
  13.   TH1=0xfd; //9600,根据晶振选择
  14.   SCON=0x50;   
  15.   PCON=0x80;

  16.   TR1=1;
  17.   while(1)
  18.   {
  19.       h=0;
  20.       while (txdata[h]!=0x00)
  21.       {
  22.         SBUF=txdata[h];
  23.         while(TI==0);
  24.         TI=0;
  25.         h++;
  26.       }
  27.       for(k=0;k <1000;k++);
  28.   }
  29. }
复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
xdata?外部扩展RAM?怎么会消耗这么多的?从程序中看不出那么大的变量呀。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
是其他一个文件影响到了
一个信息处理程序需要中间转换的变量比较多而且都有点占空间
还不确定是不是
只是嫌疑比较大
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

13
 
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表