单片机高手进,时请问T89S51单片机有些人在编程,时候并没有直接说从哪个端口输入输出,而是用一些地址

这是为什么?

不像AVR或者PIC,MSP430系列的单片机,AT89S51的端口模式是固定的,P0口开漏结构,P1~P3弱上拉结构
作为输出口的时候,直接写就可以了
作为输入口的时候,在检测之前,单片机程序保证端口送的事高电平,也就是弱上拉输出,相当于端口接一个50K左右的电阻到VCC,所以当外界输入的信号时低电平,且阻抗很低的时候,这个端口就会被拉低,从而可以检测为低电平追问

如何区别那些端口呢?
作为输出如何直接写?能举一个例子么谢谢

追答

比如P0口如果不外接上拉电阻或者连接的器件不带上拉的话,只能作为输入口

输出 P1=0XUU (0XUU可以使任何数)
如果要检测P1.1端口状态时
先P1_1=1;//如果前面已经把P1_1输出为高电平,这个语句就可以省略了
if(P1_1){
//等于1时候的操作
}
else{
//等于0时候的操作
//我想你迷惑的地方是,为什么我明明输出为1了,检测怎么会是0呢
//原因很简单,因为51单片机的高电平维持能力很低,只要外接有一个能力更强的低电平,就可以把端口拉低了,就好像你和一个小孩扳手腕一样,如果你不用力的时候,那么你的手可能是压在他的手下的,如果你一发力,他的手就被你压到底下了
}

对于使用地址的情况,一般都是对于P0与P2的操作
你可以看看单片机关于访问外部数据存储器或程序存储器的相关内容
也就是对应汇编语言的MOVX 与MOVC指令
在汇编里面 一般都是把外部地址先送到DPTR里面,然后执行MOVX或者MOVC指令后,单片机会自动完成一些固定格式的动作,如果是读的话,显示P2与P0组成的16位地址送在总显示,然后P3.7 RD线产生一个低电平,同时将此时P0的状态送到ACC累加器中

追问

拜托把AT89S51各个端口的地址代码复制给我,我现在需要,非常感谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-10
89S51单片机对端口读写(输入输出)操作方法
如:P1口,,P1地址 = 0x90 (不要问我为什么P1地址 = 0x90,这个要问设计51单片机的工程师)
KEIL 编程
读端口方法1 MOV A,P1; 方法2 MOV A,0x90;

写端口方法1 MOV P1,A 方法2 MOV 0x90,A追问

拜托把AT89S51各个端口的地址代码复制给我,我现在需要,非常感谢

追答

P0 = 0x80;
P1 = 0x90;
P2 = 0xA0;
P3 = 0xB0;

本回答被提问者采纳
第2个回答  2012-05-10
输出:
P1=0xff
这个就是P1口上都输出高电平了
其他的端口类似