连接如下红外传感器电路产生0或5v,取决于闭路或开路输出线到微控制器8051 philips的端口2_0引脚。问题是,当我这样做时,电路值被当前值覆盖端口2_0 led总是继续。这是我的代码(在keil c中)我想我没有正确配置P 2_0作为输入
void MSDelay(unsigned int);
sbit led=P1^0;
void main()
{
unsigned int var;
P2=0xFF;
TMOD=0x20;
TH1=0xFD;
SCON =0x50;
TR1=1;
while(1)
{
var=P2^0;
if(var==0)
{
led=1;
SBUF='0';
while(TI==0);
TI=0;
MSDelay(250);
}
else
{
led=0;
SBUF='9';
while(TI==0);
TI=0;
MSDelay(100);
}
}
}
答案 0 :(得分:2)
通常使用P2_0的sbit数据类型来定义特殊功能寄存器(SFR)中的位。
来自C51: READING FROM AN INPUT PORT(已修改)
sfr P2 = 0xA0;
sbit P2_0 = P2^0;
...
P2_0 = 1; /* set port for input */
var = P2_0; /* read P2_0 into var */
重要的是要注意,sbit变量可能不会在函数内声明。它们必须在函数体之外声明。
另一种选择可能是读取P2的所有8个引脚,然后屏蔽掉不需要的位。
char var; /* define 8 bit variable */
P2 = 0xFF; /* set P2 for input */
var = P2; /* read P2 into var */
var &= 0x01; /* mask off unwanted bits */
不是将P2或P2_0引脚读入unsigned int(16位),而是使用char(8位)或单bit来节省内存。
char var;
...
var = P2;
或
bit var;
...
var = P2_0;
另一种选择可能是制作char bit-addressable。
char bdata var; /* bit-addressable char */
sbit var_0 = var^0; /* bit 0 of var */
...
var = P2; /* read P2 into var */
if(var_0 == 0) /* test var_0 (bit 0 of var char) */
{
...
}
您可以在Keil Cx51 Compiler User's Guide及相关链接中找到其他有用信息。
注意:我8051的大部分经验都是装配。上面的C示例可能不是100%正确。
答案 1 :(得分:2)
jschmier有一个好点。此外,端口可能没有正确配置,或者电路中是否存在导致LED快速关闭和打开的内容,因此它看起来一直处于打开状态。
答案 2 :(得分:0)
非常感谢...我的编码工作
我学习如何定义输入端口并读取数据
#include<reg51.h>
#define opp P1
#define ipp P0
sbit op =P1^0;
sbit ip =P0^0;
main()
{
unsigned int value;
P0=0xFF;
value=P0;
value &=0x01;
if(value==0)
{
P1=0x01;
}
else
{
P1=0x00;
}
}