2

接続は次のとおりです。マイクロコントローラー8051 philipsのポート2_0ピンへの閉回路または開回路出力ラインに応じて、0または5vを生成する赤外線センサー回路。常に続きます。ここに私のコードがあります(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 変数は関数内で宣言できないことに注意してください。関数本体の外で宣言する必要があります。


もう 1 つのオプションは、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 ビット) またはシングルビットを使用してメモリを節約できます。

char var;
...
var = P2;

また

bit var;
...
var = P2_0;

もう 1 つのオプションは、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 Compiler User's Guideおよび関連リンクで、追加の有用な情報を見つけることができます。

注: 私の 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 に答える