找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10636|回复: 13
打印 上一主题 下一主题
收起左侧

求助,如何定义51单片机中位寻址的位为标志

[复制链接]
跳转到指定楼层
楼主
ID:76471 发表于 2015-4-15 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如PSW中的F0,可以在程序中判断为1或为0,还可以置1或清零。我看了郭天详的视频,他讲课直接用一个字节8位做标志,实在是浪费,51的资料RAM从20H到2FH有16字节共128位可位寻址,请教高手C语言如何定义可寻址位为标志
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:74784 发表于 2015-4-15 22:24 | 只看该作者
以20H到2FH的128位做用户标志最便捷

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:76471 发表于 2015-4-16 18:52 | 只看该作者
lxa0 发表于 2015-4-15 22:24
以20H到2FH的128位做用户标志最便捷

如何用,用bit吗?例如这样定义,bit flag_0=0x00;这样只占一位对吧
回复

使用道具 举报

地板
ID:74784 发表于 2015-4-16 22:40 | 只看该作者
steb x

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:76471 发表于 2015-4-17 19:18 | 只看该作者

用C语言写呀,setb x;不能通过编译,而且setb不是关键字,汇编才能用吧
回复

使用道具 举报

6#
ID:76471 发表于 2015-4-17 19:22 | 只看该作者

我回来用bit F1;实现了,还是感谢你的热情帮助
回复

使用道具 举报

7#
ID:76471 发表于 2015-4-17 20:19 | 只看该作者
还找了个高手,要了个标准C定义位的,据说用到联合、枚举、结构体啥的,能用到所有用C编程的MCU上,经测试使用无问题,同大家分享一下。
/**********************************************************************
标准C位定义
***********************************************************************/
typedef unsigned char INT8U;

volatile union uFlag
{
   INT8U byte;       
   struct {
      INT8U bit0:1;
          INT8U bit1:1;
          INT8U bit2:1;
          INT8U bit3:1;
          INT8U bit4:1;
          INT8U bit5:1;
          INT8U bit6:1;
          INT8U bit7:1;
          }flag;                                                                 //flag不能是关键字
}umyFlag,keyFlag;                                                         //可定义多个字节做标志位


#define F1                                                                umyFlag.flag.bit0
#define F2                                                                umyFlag.flag.bit1
#define F3                                                                umyFlag.flag.bit2
#define F4                                                                umyFlag.flag.bit3
#define F5                                                                umyFlag.flag.bit4
#define F6                                                                umyFlag.flag.bit5
#define F7                                                                umyFlag.flag.bit6
#define F8                                                                umyFlag.flag.bit7
回复

使用道具 举报

8#
ID:76471 发表于 2015-4-17 20:22 | 只看该作者
这方法即使不是可位寻址的位都可以直接用
回复

使用道具 举报

9#
ID:95514 发表于 2016-9-21 17:04 | 只看该作者
在keil里有一个<absacc.h>这个头文件,这里面的函数可以满足你的需要,可以QQ私聊我。3030895463
回复

使用道具 举报

10#
ID:137239 发表于 2016-9-21 21:11 | 只看该作者
可以用bit语句来声明一位,它只占一位
回复

使用道具 举报

11#
ID:111634 发表于 2016-9-23 20:53 | 只看该作者
本帖最后由 zl2168 于 2016-9-23 20:58 编辑

⒍ 位变量定义方式

80C51片内RAM16字节128位的可寻址位(字节地址20H2FH,位地址00H7FH),还有11个特殊功能寄存器是可位寻址的,C51编译器扩充了关键词bitsbit,用于定义这些可寻址位。位变量也需先定义,后使用。

定义128位可寻址位的位变量

bit  位变量名

例如:

bit  u,v;                      //定义位变量uv

C51编译器将自动为其在位寻址区安排一个位地址(1bit)。

对于4-5中已经按存储器类型bdata定位的字节,其每一可寻址位,可按如下方法定义:

unsigned char bdata  flag;        //定义字符型变量flag,存储器类型bdata

bit  f0=flag^0;                   //定义位标识符f0,为flag0

bit  f1=flag^1;                //定义位标识符f1,为flag1

上述第一条语句先定义了一个字符型变量flag,存储器类型bdataC51编译器将自动为其在片内RAM位寻址区(20H2FH)安排一个字节(8bit),第23条语句则分别定义f0f1为该字节第01位的位标识符。注意,“^”不是运算符,仅指明其位置,相当于汇编中的“.”。

定义11个特殊功能寄存器可寻址位的位变量

80C51单片机11个可寻址位的特殊功能寄存器中,有6SFRPSWTCONSCONIEIPP3),它们每一可寻址位有位定义名称,C51库函数reg51.h也已对其按MCS-51中取的位定义名称(必须大写)全部作了定义,并赋予了既定的位地址。只要在头文件中声明包含库函数reg51.h,就可按位定义名称直接引用。但是,还有5SFRACCBP0P1P2),可寻址位没有专用的位定义名称,只有位编号,但这些位编号不符合ANSI C标识符要求,例如,ACC.0P1.0等(C51标识符规定不可用小数点),应重新定义。其格式如下:

sbit  位变量名=位地址常数

其中,位地址常数必须是该位变量既定的真实位地址。例如:

sbit  P10=0x90;                          //定义位标识符P10,位地址90HP1.0

sbit  P10= 0x90^0;              //定义位标识符P10,为90HP1口)第0

sbit  P10= P1^0;             //定义位标识符P10,为P1口第0

上述第1条语句是直接用P1.0的位地址,第2条语句是用P1口的字节地址加位编号,第3条语句是用P1口特殊功能寄存器名加位编号。

需要说明的是,若用户不按既定的位定义名称引用6SFR中的可寻址位,另起位变量名,则也须对其重新定义。虽然C51允许用关键词sbit定义这些位变量,体现了C51编译功能的多样性和完整性,但编者还是建议读者不要去重新定义6SFR中的可寻址位,而直接使用预处理命令,既省事又不易出错。

需要指出的是,使用sbit定义11个特殊功能寄存器可寻址位的位变量,因其具有不变的真实地址,属于全局变量,应放在主函数之前(参阅4-6)。

需要注意的是,不要混淆bitsbit的区别。bit用于普通位变量,而sbit位用于特殊功能寄存器中可位寻址的位变量(有既定位地址)。


以上摘自张志良编著
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9


书中电路和程序设计有详细说明,程序语句条条有注解。


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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