51单片机C51语言的几个问题。

我学过C,也不是说学的特别精,反正算是会C语言吧。
现在刚好要做一个51单片机的开发,其它的都还行就是在一些数据类型上有一些没弄明白。
1、sbit a = PSW^2;
上面这条语句是不是声明一个sbit类型的变量a并给其赋以寄存器PSW第二位的状态值?
如果后面PSW第二位状态值发生改变了,a的值是否同样发生改变,还是要再执行一次上面这条语句,才能使a变量获取新的PSW^2的值?
2、sfr和sbit异同处?
3、bit与sbit异同处?
谢谢。

问题1:
sbit a = PSW^2;
这不是一条简单的赋值语句,a也不是什么变量,而是把他和PSW的第二位关联起来,相当于a是它的别名一样,如果a变化的话PSW的第二位会变,PSW的第二位变化时a当然也会变(假设你叫李宇春,现在这条语句就是说把春哥也变成你的名字),其实是一个东西,这么做的原因是,在程序中(主函数)PSW^2不能够直接被编译(如果直接引用,编译不通过)只能在主函数之前或头文件下方来这么一句,你可以打开reg52.h文件看看其实里面有很多这种定义,目的是为某个寄存器或IO口(其实还是寄存器)的某一位起个别名,使编程时既可以位操作又使编译能通过。
问题二:
sbit在问题1中说的很清楚了,就是为某一位起别名,sfr 这个关键字在reg52.h头文件中出现很多
它是单片机开发商把特殊功能寄存器的物理地址映射到一个宏上面,这样的话就可以对寄存器操作了,你自己可以改动,比如reg52.h中的sfr P0 = 0x80;你改为sfr PP=0X80; 那么单片机上的P1口(起名P1口是一种习惯)变成了你的PP口了,sbit a=PP^2完全正确;
问题三:
bit 只是个位变量的关键字,和bool (单片机不支持bool类型),char ,int 类似,为了进行2种状态判断有为了节省存储空间所以有了bit ,你就把他理解为bool就行
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-02-24
1.把PSW中的第二位用一个名字a来表示,只要后面使用到a,就是使用PSW的第二位。
2.sfr是用来给特殊寄存器区的一个地址命名的,假设在特殊寄存器区有个地址0xAC,将其命名为XAF寄存器,就用 sfr XAF=0xAC。sbit是针对特殊寄存器区的位地址命名的。因此sbit和sfr都是针对特殊寄存器区的命名使用的,不同的是sbit针对“位”(bit)地址,sfr针对“字节”(byte)地址。
3.bit是针对RAM区可位寻址范围(字节地址20~2F区)128位的位命名的。sbit就是上面描述的。异同点你可以自己归纳了。追问

我这么理解对不对
sbit a = PSW^2; /* a在程序中就可以代表PSW第2位的值,它的值随PSW第2位的变化而变化。同样的,对于一些可以被赋值的寄存器位,也可以对a进行赋值而改变a所指向的寄存器的某位的值。*/
sfr b = 0XD0; /*PSW的地址是0XD0,而这个语句使b始终代表PSW的值*/
bit c = 0X6F; /*bit语句只针对00H-7FH间的128个位数进行操作,实际上是字节物理地址20H-2FH这16个字节物理地址里的位数*/

追答

sbit a = PSW^2,此时a就是PSW的第二位,不是跟着其变化!
sfr b=0xD0,就是说用名字b代替原来0xD0寄存器的名字(PSW)。

追问

还是有点没明白,请您把下面几个值帮我确定一下,谢谢哈。
sbit a = PSW^0;
sfr b = 0XD0;
a = 1;
b = 0x00; /*运行完本行后,a = 0 ?*/
b = 0xFF; /*运行完本行后,a = 1 ?*/
a = 0; /*运行完本行后,PSW是0xFFH,还是0xFE?*/
另,能不能将PSW作为一个变量直接参与编程,如:
PSW = 0XEF;
PSW^0 = 0;
这样?

追答

PSW是反映CPU运行状态的,一般建议不要直接对其进行写操作。

另外,上面的程序运行结果如何,你可以自己编程检验啊!!

本回答被提问者采纳
第2个回答  2012-02-24
bit的意思是定义1个布尔逻辑变量如:bit a;,sbit是按位定义SFR寄存器地址,如:
sbit Add_Key = P1.0;。而sfr是按字节定义,如:sfr P1 = 0x90;。
sbit a = PSW^2;
上面这条语句是声明一个sbit类型的变量a并给其赋以寄存器PSW第二位的状态值。如果后面PSW第二位状态值发生改变了,a的值会同样发生改变。
第3个回答  2012-03-03
1、sbit a = PSW^2;意思是PSW的第二位的值赋给a,sbit是对位定义的变量,sfr是针对特殊寄存器定义变量的!多看看例子,就会明白咋回事啦!

51单片机C51语言的几个问题。
问题1:sbit a = PSW^2;这不是一条简单的赋值语句,a也不是什么变量,而是把他和PSW的第二位关联起来,相当于a是它的别名一样,如果a变化的话PSW的第二位会变,PSW的第二位变化时a当然也会变(假设你叫李宇春,现在这条语句就是说把春哥也变成你的名字),其实是一个东西,这么做的原因是,...

关于C51单片机单片机的几个问题
--51 单片机里面,确实没有 PC 的地址,因为,谁都不需要这个地址。4、MOV 20H,@DPTR 这个语句错了是因为DPTR只能用于片外寻址么 --这个指令,并不存在。DPTR只能用于片外寻址么 --查一下指令表,就知道了。5、”80C51单片机子程序调用时能自动保护断点和现场“,这句话错了是不是因为只能自...

51单片机的编程问题?
其实就是用io脚做出来的同步半双工串口。支持cpu卡的程序一般比较庞大,需要用c51来组织,但是由于c编译的不确定性,必须把底层程序封装成汇编语言模块嵌入到工程中。这就带来几个问题:如何声明函数、参数如何传递等。限于篇幅,不能说得很细。下面举例:汇编程序单独保存一个文件,加入到工程中,函数如...

51单片机使用KEIL C51 数据碰到编译异常
AAA是个long型数据吧?问这样的问题之前,你应当先了解一下Keil Cx51的默认数据类型。Cx51在不修改项目配置时,计算时默认的数据类型是int型的(有符号整型),所以在没有类型指定的前提下,9600×4会计算得到溢出的结果变成-27136(0x9600),接下来执行赋值操作时promote类型为四字节,即0xFFFF9600。要...

在keil C51中使用结构体的问题
51的 ram 分外三种.内部直接寻址你的128byte 内部间接的128byte 还有就是外部 ram 你的51单片机有512byte 那么肯定是 内部 直接 间接各128 外加外部256字节 你把那些大一点的数据全部改成 xdata 声明就可以了.当然如果你会控制ram大小的话..用idata 声明效率更好一点 例如 unsigned char yy;写个...

C51单片机相关问题,哪位大神能给我解释一下面这个高八位和低八位...
include<reg51.h> \/\/包含单片机寄存器的头文件 void main(void){ unsigned char m,n;unsigned int s;m=64;n=71;s=m*n;P1=s>>8; \/\/这样写你应该可以理解了 P0=s; \/\/一个16位数直接赋值给8位变量,潜规则就是只取低八位。} ...

51单片机的问题
7.定时\/计数器工作于定时方式时,是通过89C51片内振荡器输出经12分频后的脉冲进行计数,--对。直至溢出。--这要看你的软件,也可以让它永远不溢出。8.80C51单片机的扩展程序存储器与片内程序存储器存储空间重叠。--可以重叠,也可以不重叠。--这要看,是谁设计电路了。9.在中断响应时断点地...

C51 单片机 局部变量 问题
但是51单片机就那么128字节,必须详细策划好如何分配,所以局部变量才有了自己固定的地盘。说到这里,我相信你的问题我已经找到答案了,虽然都是我推测的,但是十之八九不会错。欢迎讨论!哦,至于初始值为0,这个没啥啊,单片机复位以后,RAM就是0 书上没写,但是实际用都是这样 ...

c51程序在52单片机上可以运行,在51单片机上运行不了。求高手回答,谢谢...
78E516也有内部看门狗的,而且还有几个寄存器是52里没有的,下面是我改过的REG52.h 另外,78E516的ROM区前4K是用于BOOT的,如果里面的程序没有跳出来的话,就永远进不了你的应用程序区了,好好看看CHPENR 那几个寄存器的使用方式。\/ --- Copyright (c) KEIL ELEKTRONIK GmbH and Franklin Softwar...

单片机C51这个错在哪
以下是单片机实践团为您解答:1)请下载:C51FPS.LIB放到,目录:c:\\keil\\c51\\lib即可。2)问题分析:你包含了头文件stdio.h,里面有些实体是在这个C51FPS.LIB中的,我猜测的。3)为什么这么说呢,你的keil版本太老了(而且组件不全),一看就知道,建议使新版本的避免不必要的麻烦。4)还要请参考...

相似回答