2

连接如下 红外传感器电路产生 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);
        }
    }       
}

编辑:我遇到了一个问题,因为我使用的 8086 处理器有故障。建议任何人在编程时尝试这个以获得一些备件。

4

3 回答 3

2

jschmier 有一个很好的观点。此外,端口可能配置不正确,或者电路中是否有某些东西导致 LED 非常快速地关闭和打开,因此看起来它一直处于打开状态。

于 2010-05-07T22:17:24.053 回答
1

您通常使用 P2_0 的sbit数据类型来定义特殊功能寄存器 (SFR) 中的位。

C51:从输入端口读取(修改)

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 引脚读入无符号整数(16 位),不如使用char(8 位)或单个来节省内存。

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 编译器用户指南和相关链接中找到更多有用的信息。

注意:我的大部分 8051 经验都是在组装中。上面的 C 示例可能不是 100% 正确的。

于 2010-05-07T20:45:39.693 回答
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;
    }  
}    
于 2015-06-11T10:17:55.070 回答