このコードは、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';
}
}