连接如下如下,红外传感器电路,该电路取决于封闭或开放电路输出线的0或5V,到端口2_0 PIN至MicroController 8051 Philips。总是继续。在这里是我的代码(在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);
        }
    }       
}
有帮助吗?

解决方案

Jschmier有一个很好的观点。此外,该端口可能无法正确配置,或者电路中是否有一些导致LED切换和迅速切换的东西,因此看起来一直在上面。

其他提示

您通常使用 SBIT P2_0的数据类型在特殊功能寄存器(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变量可能不会在功能中声明。它们必须在功能主体之外宣布。


另一个选择可能是阅读所有8个P2销,然后掩盖不需要的位。

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引脚读取 未签名的int (16位),您可以使用 char (8位)或单个 少量 保存内存。

char var;
...
var = P2;

或者

bit var;
...
var = P2_0;

另一个选择是使 char 位适用.

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示例可能不正确。

非常感谢...我的编码作品

我学习如何定义输入端口并阅读数据

#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;
    }  
}    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top