Why second string not transmitting properly to uart?

Status
Not open for further replies.
Joined
Jul 25, 2012
Messages
1,192
Helped
171
Reputation
342
Reaction score
162
Trophy points
1,343
Visit site
Activity points
0
Why this AT89C51 uart is not working properly. It is transmitting the first string but not sending the second string "Card ID matched" to the uart.

Type 123456789123 in the 1st Virtual terminal then it displays "card Accepted" in LCD and sends two messages to Virtual terminal 2.
 

Attachments

  • uart problem.rar
    111.6 KB · Views: 114

i think it is because of lack ram in 8051..

since it has only 128 bytes of ram

u have declared the lot of global variables and u passing the global variables in functions
Code:
send_string_uart(mystring);
send_string_uart(mystring2);
which take lot of memory

u have enabled the serial interrupt in that u should check whether it is due to TI or RI. Since u are do transmitting the also i sending ot mystring and mystring2 the card_id got stored with my string valves this also leads to run time error

hope this was helpfull
 

OK. Thank you.

The problem got solved. Here are the files.
 

Attachments

  • serial 8051.jpg
    156.1 KB · Views: 132
  • uart problem.rar
    223.2 KB · Views: 114

I don't know how it worked, but I just changed the string variable's name from mystring[] to myString[]. I will check my old code once and I will tell you.
 

u give the input 123456789123 and see the output,

did u give the same input 123456789 again and checked the output.....
 

OK. The only thing that I changed in the code is I changed mystring[], and mystring2[] variables to myString[], and myString2[].
You mean that I have to enter the 123456789123 seconf time. I think it is not programmed to take new input. I have to do that.
 

Here is my new code. I cant read the card more than once.

Code:
#include<reg51.h>
#include<string.h>
#include<stdio.h>

//Function declarations
void cct_init(void);
void delay(int);
void lcdinit(void);
void writecmd(int);
void writedata(char);
void ReturnHome(void);
void display();
void display2();
//void send_uart();
void send_string_uart(unsigned char string[]);
void prompt();
//void SendByteSerially(unsigned char serialdata);

//*******************
//Pin description
/*
P2.4 to P2.7 is data bus
P1.0 is RS
P1.1 is E
*/
//********************

// Defines Pins
sbit RS = P1^0;
sbit E  = P1^1;

unsigned char card_id[12];
unsigned char tag[13] = { 49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51 };
unsigned char read_id[12];
unsigned char current_byte = 0;
unsigned int display_flag = 0;
unsigned int key = 0;
unsigned int count = 0;
unsigned char myString[28] = "AT89C51 Based RFID Reader\r\n";
unsigned char myString2[16] = "Card ID matched";

void recieve() interrupt 4     //Function to recieve data serialy from RS232 
{
        card_id[current_byte]=SBUF;
        RI=0;                // Reset the serial interrupt after recieving the byte
        current_byte++;    
}

// ***********************************************************
// Main program
//
void main(void)
{
	 cct_init();                                     //Make all ports zero
   
	 TMOD=0x20;                            //Enable Timer 1
   TH1=0XFD;
   SCON=0x50;
   TR1=1;
   EA=1;
   ES=1;
	 	 
	 lcdinit();                                      //Initilize LCD
	 
   prompt(); 

   ReturnHome();                                   //Return to 0 position
			
	while(1)
	{	
		prompt();
		while(current_byte!=12);
		display();
		writedata(' ');                                 //write
		writedata(' ');                                 //write
		delay(100000000);
		
		
		key=0;
		for(count=0;count<12;count++)
		{ 
		   if(card_id[count]==tag[count])
			{
			 key++;
			}
		}
    		
		
		count = 0;
		
		if((key == 12) && (display_flag == 0)) {
				delay(100000000);
				display2();
			  //display_flag = 0;
			  key = 0;
			  send_string_uart(myString);
			  send_string_uart(myString2);
		}
		
		/*
		if((card_id == tag) && (display_flag == 0)) {
			 
					delay(500000);
					display2();
					display_flag = 1;
		}
		*/		
			
		//send_uart();
		
		//SendByteSerially('A');
		
		
		/*
		if((tag == card_id) && (display_flag == 0)) {
			  display2();
			  display_flag = 1;
		}
		*/
				
	}

}

/*
void SendByteSerially(unsigned char serialdata)
{
	TI = 0;
SBUF = serialdata; 
while(TI == 0); 
TI = 0; 
}


void send_uart() {
	 TI = 0;
SBUF = 'A'; 
while(TI == 0); 
TI = 0;			            	
}
*/



void send_string_uart(unsigned char string[]) {

	unsigned int count;

	for(count = 0; count < strlen(string); count++) {
		TI = 0;
SBUF = string[count]; 
while(TI == 0); 
TI = 0;
	}

}

void prompt() {
	 writecmd(0x80);
	 writedata('U');                                 //write
   writedata('n');                                 //write
   writedata('i');                                 //write
   writedata('q');                                 //write
   writedata('u');                                 //write
   writedata('e');                                 //write
   writedata(' ');                                 //write
   writedata('C');                                 //write
   writedata('a');                                 //write
   writedata('r');                                 //write
   writedata('d');                                 //write
   writedata(' ');                                 //write
	 writedata('I');                                 //write
   writedata('d');
	 //writecmd(0xC0);
}
	
void display()        // Function to display the unique id
{
    unsigned char count;
    writecmd(0x80);        //Place cursor to second position of second line
    for(count=0;count<12;count++)
     { 		
				          writedata(card_id[count]);
									//read_id[count] = card_id[count] + 48;
		 }
    current_byte=0;
}


void display2()        // Function to display the unique id
{
    //unsigned char count;
    writecmd(0xC0);        //Place cursor to second position of second line
    //for(count=0;count<12;count++)
     //{ 		
				    //writedata(tag[count]);
						writedata('C');                                 //write
						writedata('a');                                 //write
						writedata('r');                                 //write
						writedata('d');                                 //write
						writedata(' ');                                 //write
						writedata('A');                                 //write
						writedata('c');                                 //write
						writedata('c');                                 //write
						writedata('e');                                 //write
						writedata('p');                                 //write
						writedata('t');                                 //write
						writedata('e');                                 //write
						writedata('d');                                 //write
		 //}
}



void cct_init(void)
{
P0 = 0x00;   //not used 
P1 = 0x00;   //not used 
P2 = 0x00;   //used as data port
P3 = 0x03;   //used for generating E and RS
}

void delay(int a)
{
   int i;
   for(i=0;i<a;i++);   //null statement
}

void writedata(char t)
{
   RS = 1;             // This is data

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (t&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((t<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}


void writecmd(int z)
{
   RS = 0;             // This is command

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (z&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((z<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}

void lcdinit(void)
{
  ///////////// Reset process from datasheet /////////
     delay(15000);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(4500);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(300);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(650);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x20&0xF0);    // Write 0x2
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

	 delay(650);

  /////////////////////////////////////////////////////
   writecmd(0x28);    //function set
   writecmd(0x0c);    //display on,cursor off,blink off
   writecmd(0x01);    //clear display
   writecmd(0x06);    //entry mode, set increment
}

void ReturnHome(void)     //Return to 0 location
{
  writecmd(0x02);
    delay(1500);
}
 

Exactly right. Thanks, It works fine now.

Code:
#include<reg51.h>
#include<string.h>
#include<stdio.h>

//Function declarations
void cct_init(void);
void delay(int);
void lcdinit(void);
void writecmd(int);
void writedata(char);
void ReturnHome(void);
void display();
void display2();
//void send_uart();
void send_string_uart(unsigned char string[]);
void prompt();
//void SendByteSerially(unsigned char serialdata);

//*******************
//Pin description
/*
P2.4 to P2.7 is data bus
P1.0 is RS
P1.1 is E
*/
//********************

// Defines Pins
sbit RS = P1^0;
sbit E  = P1^1;

unsigned char card_id[12];
unsigned char tag[13] = { 49, 50, 51, 52, 53, 54, 55, 56, 57, 49, 50, 51 };
unsigned char read_id[12];
unsigned char current_byte = 0;
unsigned int display_flag = 0;
unsigned int key = 0;
unsigned int count = 0;
unsigned char myString[28] = "AT89C51 Based RFID Reader\r\n";
unsigned char myString2[16] = "Card ID matched";

void recieve() interrupt 4     //Function to recieve data serialy from RS232 
{
			if(RI == 1) {
        card_id[current_byte]=SBUF;
        RI=0;                // Reset the serial interrupt after recieving the byte
        current_byte++; 
			}		
}

// ***********************************************************
// Main program
//
void main(void)
{
	 cct_init();                                     //Make all ports zero
   
	 TMOD=0x20;                            //Enable Timer 1
   TH1=0XFD;
   SCON=0x50;
   TR1=1;
   EA=1;
   ES=1;
	 	 
	 lcdinit();                                      //Initilize LCD
	 
   prompt(); 

   ReturnHome();                                   //Return to 0 position
			
	while(1)
	{	
		prompt();
		while(current_byte!=12);
		display();
		writedata(' ');                                 //write
		writedata(' ');                                 //write
		delay(100000000);
		
		
		key=0;
		for(count=0;count<12;count++)
		{ 
		   if(card_id[count]==tag[count])
			{
			 key++;
			}
		}
    		
		
		count = 0;
		
		if((key == 12) && (display_flag == 0)) {
				delay(100000000);
				display2();
			  //display_flag = 0;
			  key = 0;
			  send_string_uart(myString);
			  send_string_uart(myString2);
		}
		
		/*
		if((card_id == tag) && (display_flag == 0)) {
			 
					delay(500000);
					display2();
					display_flag = 1;
		}
		*/		
			
		//send_uart();
		
		//SendByteSerially('A');
		
		
		/*
		if((tag == card_id) && (display_flag == 0)) {
			  display2();
			  display_flag = 1;
		}
		*/
				
	}

}

/*
void SendByteSerially(unsigned char serialdata)
{
	TI = 0;
SBUF = serialdata; 
while(TI == 0); 
TI = 0; 
}


void send_uart() {
	 TI = 0;
SBUF = 'A'; 
while(TI == 0); 
TI = 0;			            	
}
*/



void send_string_uart(unsigned char string[]) {

	unsigned int count;

	for(count = 0; count < strlen(string); count++) {
		TI = 0;
SBUF = string[count]; 
while(TI == 0); 
TI = 0;
	}

}

void prompt() {
	 writecmd(0x80);
	 writedata('U');                                 //write
   writedata('n');                                 //write
   writedata('i');                                 //write
   writedata('q');                                 //write
   writedata('u');                                 //write
   writedata('e');                                 //write
   writedata(' ');                                 //write
   writedata('C');                                 //write
   writedata('a');                                 //write
   writedata('r');                                 //write
   writedata('d');                                 //write
   writedata(' ');                                 //write
	 writedata('I');                                 //write
   writedata('d');
	 //writecmd(0xC0);
}
	
void display()        // Function to display the unique id
{
    unsigned char count;
    writecmd(0x80);        //Place cursor to second position of second line
    for(count=0;count<12;count++)
     { 		
				          writedata(card_id[count]);
									//read_id[count] = card_id[count] + 48;
		 }
    current_byte=0;
}


void display2()        // Function to display the unique id
{
    //unsigned char count;
    writecmd(0xC0);        //Place cursor to second position of second line
    //for(count=0;count<12;count++)
     //{ 		
				    //writedata(tag[count]);
						writedata('C');                                 //write
						writedata('a');                                 //write
						writedata('r');                                 //write
						writedata('d');                                 //write
						writedata(' ');                                 //write
						writedata('A');                                 //write
						writedata('c');                                 //write
						writedata('c');                                 //write
						writedata('e');                                 //write
						writedata('p');                                 //write
						writedata('t');                                 //write
						writedata('e');                                 //write
						writedata('d');                                 //write
		 //}
}



void cct_init(void)
{
P0 = 0x00;   //not used 
P1 = 0x00;   //not used 
P2 = 0x00;   //used as data port
P3 = 0x03;   //used for generating E and RS
}

void delay(int a)
{
   int i;
   for(i=0;i<a;i++);   //null statement
}

void writedata(char t)
{
   RS = 1;             // This is data

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (t&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((t<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}


void writecmd(int z)
{
   RS = 0;             // This is command

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= (z&0xF0);     // Write Upper nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);

   P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
   P2 |= ((z<<4)&0xF0);// Write Lower nibble of data

   E  = 1;             // => E = 1
   delay(150);
   E  = 0;             // => E = 0
   delay(150);
}

void lcdinit(void)
{
  ///////////// Reset process from datasheet /////////
     delay(15000);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(4500);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(300);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x30&0xF0);    // Write 0x3
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

     delay(650);

	 P2 &= 0x0F;		   // Make P2.4 to P2.7 zero
	 P2 |= (0x20&0xF0);    // Write 0x2
	
	 E  = 1;               // => E = 1
	 delay(150);
	 E  = 0;               // => E = 0
	 delay(150);

	 delay(650);

  /////////////////////////////////////////////////////
   writecmd(0x28);    //function set
   writecmd(0x0c);    //display on,cursor off,blink off
   writecmd(0x01);    //clear display
   writecmd(0x06);    //entry mode, set increment
}

void ReturnHome(void)     //Return to 0 location
{
  writecmd(0x02);
    delay(1500);
}
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…