нужна помощь в настройке порта для ввода в 8051 - PullRequest
2 голосов
/ 07 мая 2010

Соединение выглядит следующим образом. Схема инфракрасного датчика, которая выдает 0 или 5 В в зависимости от выходной линии замкнутой или разомкнутой цепи на вывод порта 2_0 микроконтроллера 8051 philips. Проблема заключается в том, что когда я делаю это, значение схемы переопределяется текущим значением на Индикатор порта 2_0 всегда горит. Вот мой код (в 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);
        }
    }       
}

Ответы [ 3 ]

2 голосов
/ 08 мая 2010

У jschmier есть хороший момент. Кроме того, порт может быть настроен неправильно или в цепи есть что-то, что приводит к тому, что светодиод выключается и включается очень быстро, так что похоже, что он постоянно включен.

2 голосов
/ 08 мая 2010

Обычно вы используете тип данных сбит для 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) */
{
    ...
}

Дополнительную полезную информацию можно найти в руководстве пользователя по компилятору *1051* и связанных с ним ссылках.

Примечание: большая часть моего опыта 8051 в сборке. Приведенные выше примеры С могут быть не на 100% правильными.

0 голосов
/ 11 июня 2015

Спасибо большое ... мой код работает

И я учусь определять порт ввода и читать данные

#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;
    }  
}    
...