0

このコードは、Proteus ソフトウェアで AT89C51 を使用して動作する RFID リーダーをシミュレートするためのものです。RFIDリーダーの代わりに、RFIDの送信またはスキャンに仮想端末を使用しています。ここでは、仮想端末でIDを入力しています。文字列「a」は入力を保存し、既存の文字列と比較して出力を提供します。ここでの問題は、仮想端末に入力している ID が文字列 'a' にコピーされないことです。while ループでスタックしています。RI は、RX ピンでシリアル データを受信したかどうかを通知する割り込みフラグです。

//CODE of lcd interfacing with 8051 microcontroller
#include<reg51.h>
#include<string.h>

void delay( unsigned int i );
void lcd_cmd( unsigned char a );
void lcd_data( unsigned char b );
void lcd_init( void );
void lcd_str( unsigned char* str );
void sendser_char( unsigned char b );
void sendser_str( unsigned char* str );
sbit rs = P2 ^ 0;
sbit en = P2 ^ 1;
unsigned int i;
unsigned char a[60], b[10];
sfr ldata = 0x90;//port1 
void clear( void );

void main()
{
    TMOD = 0x20;//timer1 mode2 -auto reload mode
    TH1 = 0xfd;//9600 baud rate
    SCON = 0x50;//8bit data ,1start bit,1stop bit
    TR1 = 1;
    REN = 1;
    lcd_init();
    lcd_str( "   WELCOME TO   " );
    lcd_cmd( 0xc0 );
    lcd_str( "   MY PROJECT   " );

    delay( 65000 );
    while( 1 )
    {
        lcd_cmd( 0x01 );
        lcd_cmd( 0x80 );
        lcd_str( "   Waiting For    " );
        delay( 65000 );
        lcd_cmd( 0xc0 );
        lcd_str( "   RFID Tag   " );
        delay( 65000 );

        for( i = 0; i < 10; i++ )
        {
            while( RI == 0 );   //code is stuck here, RI value shall be changed 
                            //when input given in virtual terminal.but it is never changing.
            a[i] = SBUF;
            RI = 0;
        }
        a[i] = '\0';
        delay( 65000 );
        if( 0 == strcmp( "0123456789", a ) )
        {
            lcd_cmd( 0x01 );
            lcd_cmd( 0x80 );
            lcd_str( " WELCOME USER 1" );
            lcd_cmd( 0xc0 );
            lcd_str( a );
            delay( 65000 );
            clear();
        }
        else if( 0 == strcmp( "10003B0CAE", a ) )
        {
            lcd_cmd( 0x01 );
            lcd_cmd( 0x80 );
            lcd_str( " WELCOME USER 2" );
            lcd_cmd( 0xc0 );
            lcd_str( a );
            delay( 65000 );
            clear();
        }
        else
        {
            lcd_cmd( 0x01 );
            lcd_cmd( 0x80 );
            lcd_str( " INVALID TAG" );
            lcd_cmd( 0xc0 );
            lcd_str( a );
            delay( 65000 );
            clear();
        }
    }
}

void lcd_init()
{
    lcd_cmd( 0x38 );
    lcd_cmd( 0x0c );
    lcd_cmd( 0x01 );
    lcd_cmd( 0x80 );
}

void delay( unsigned int i )
{
    unsigned int j;
    for( j = 0; j < i; j++ );
}

void lcd_cmd( unsigned char a )
{
    rs = 0;//cmd 
    ldata = a;
    en = 1;
    delay( 5 );
    en = 0;
    delay( 5 );
}

void lcd_data( unsigned char b )
{
    rs = 1;//data 
    ldata = b;
    en = 1;
    delay( 5 );
    en = 0;
    delay( 5 );
}

void lcd_str( unsigned char* str )
{
    while( *str )
    {
        lcd_data( *str++ );
    }
}

void sendser_char( unsigned char b )
{
    SBUF = b;
    while( TI == 0 );
    TI = 0;
}

void sendser_str( unsigned char* str )
{
    while( *str )
    {
        sendser_char( *str++ );
    }
}

void clear( void )
{
    unsigned int i;
    for( i = 0; i < 60; i++ )
    {
        a[i] = '\0';
    }
}
4

0 に答える 0