3597|6

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于内部数据寄存器的问题 [复制链接]

在keilC51里,用了可以位寻址的存储器,可是工程芯片设成89C51时编译可以通过,就是不能实现功能(在电脑上通过串口仿真)。只有把芯片改成89C52才可以实现。
在平凡单片机书上也写了用到内部数据存储器时工程里需要把芯片设成52系列的。
不知道这是为什么?51也有位寻址的存储器啊。
在实际应用中,51的芯片也不能实现想要的功能么?也必须用52的芯片么?
正在选芯片,希望大家指导啊!
附:用到的程序
unsigned char bdata hb; //用于实现hex向bin的转换
sbit hb_0 = hb^0;
for(i=0;i<3;i++)
{
        hb=hex;
        for(j=0;j<8;j++)
        {
                if(hb_0) bin[j]=1;
                else bin[j]=0;
                hb=hb>>1;
        }
}

最新回复

用bit做强制类型转换时输出的不是最低位么? 我赶紧去实验一下。多谢多谢!  详情 回复 发表于 2009-3-14 13:18
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这是你的仿真器的问题,跟内部RAM没关系。你这个程序有必要这么麻烦吗,我晕!

unsigned char  hb ;
for(i=0;i <3;i++)
{
hb=hex;
for(j=0;j <8;j++)
{
bin[j] = hb & 0x01;

hb >>= 1;
}
}

搞定
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Trouble with the bdata Memory Type
Some users have reported difficulties in using the bdata memory type. Using
bdata is similar to using the sfr modifier. The most common error is
encountered when referencing a bdata variable defined in another module. For
example:
extern bdata char xyz_flag;
sbit xyz_bit1 = xyz_flag^1;
In order to generate the appropriate instructions, the compiler must have the
absolute value of the reference to be generated. In the above example, this
cannot be done, as this address of xyz_flag cannot be known until after the
linking phase has been completed. Follow the rules below to avoid this problem.
1. A bdata variable (defined and used in the same way as an sfr) must be
defined in global space; not within the scope of a procedure.
2. A bdata bit variable (defined and used in the same way as an sbit) must also
be defined in global space, and cannot be located within the scope of a
procedure.
3. The definition of the bdata variable and the creation of its sbit access
component name must be accomplished where the compiler has a “view” of
both the variable and the component.
For example, declare the bdata variable and the bit component in the same
source module:
bdata char xyz_flag;
sbit xyz_bit1 = xyz_flag^1;
Then, declare the bit component external:
extern bit xyz_bit1;
As with any other declared and named C variable that reserves space, simply
define your bdata variable and its component sbits in a module. Then, use the
extern bit specifier to reference it as the need arises.
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
多谢啊,你的程序更简单了。就是说是keil的问题,实际上51芯片也是可以完成任务的。
不过因为单片机要控制MAX7219,所以还是要用到位寻址。这个有办法改的更简洁些么?多谢啊
unsigned char bdata v; //v为MAX7219 用可位操作全局变量
sbit v_7=v^7;
void MAX_input()
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
                MAX_clk=0;
                MAX_din=v_7;
                MAX_clk=1;
                v=v<<1;
        }
}
void MAX_load(unsigned int m)
{
        MAX_cs=0;
        v=m>>8;
        MAX_input();
        v=m;
        MAX_input();
        MAX_cs=1;
}
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
这个也可以这样啊
unsigned char v; //v为MAX7219 用可位操作全局变量

void MAX_input()
{
unsigned char i;
for(i=0;i <8;i++)
{
MAX_clk=0;
MAX_din= (bit)(v & 0x80);
MAX_clk=1;
v <<= 1;
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
2楼的意思是说只要再用extern声明,编译器就可以识别了是吗?
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

7
 
用bit做强制类型转换时输出的不是最低位么?
我赶紧去实验一下。多谢多谢!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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