我是单片机设计入门菜鸟,想问高手一个问题!

书上原文:(sfr P1 = 0x90; //因P1 端口的寄存器是可位寻址的,所以我们可以定义
sbit P1_1 = P1^1; //P1_1 为P1 中的P1.1 引脚
//同样我们可以用P1.1 的地址去写,如sbit P1_1 = 0x91;)
这样我们在以后的程序语句中就可以用P1_1 来对P1.1 引脚进行读写操作了。
想问一下这句话是什么意思,sfr后的P1是变量吗?为什么给它赋ox90,这个语句实现了什么功能,和普通的赋值语句有什么不一样?为什么这样定义后就可以通过P1对P1端口进行控制了?ox90有什么特点?是地址值吗?如果是地址值的话,p1_1为什么要是ox91呢,它只是个位变量啊,而ox90和ox91相差了8位啊!

首先,端口引脚是和寄存器相映射的,比如,在你这里,p1端口,映射的地址是0x90,给0x90这个地址写一个8位的数据,就是相应的给p1端口的8个引脚设置相应的电平。比如,你给P1写0xff,那么,从0x90到0x97里面的数据都是1,对应的管脚,p1.0到p1.7都是高电平。
那么,有些时候需要单独对某个管脚操作,怎么办呢?只要对某个管脚对应的那个寄存器的位来进行赋值即可。对于你这里面的情况,估计是51单片机,p1.1引脚的地址就是0x91,(因为p1端口的总起始地址是0x90),所以,只要对0x91来赋值就行了,但程序里总用0x91会比较难看,所以,给他取个代号,p1_1,(sbit p1_1 = 0x91就是起代号,当然,sfr 也是起代号,不过一个是一组引脚一个是一个引脚,所以命令不一样)

51单片机是可以位寻址的,所以有这些命令,某些别的单片机,有的不能位寻址,要对位操作就比较麻烦。还有的可以位寻址,但计算方式比较复杂,不象51这样, p1.1就是0x91,p1.2就是0x92了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-10-28
可以这么认为,sfr是声明特殊功能寄存器的(而普通的不能)。有8位和16位声明。0x90是特殊功能寄存器P1在内部RAM中分配的固定地址,这时的P1就代表P1口的地址了(8位),不会改变的。P0(0X80),P2(0XA0),P3(0XB0)。因为P1口是8位的(8位为一个字节),0x90是此字节的起始地址。此字节的范围为(0x90~0x97)