Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[SOLVED] Why Serial Transmit is not working?

Status
Not open for further replies.
Joined
Jul 25, 2012
Messages
1,192
Helped
171
Reputation
342
Reaction score
162
Trophy points
1,343
Activity points
0
Hello! I want to know why serial transmit is not working?

Code:
#include<reg51.h>
#include<string.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);
void send_string_uart(unsigned char string[]);

//*******************
//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[12] = { 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[] = "AT89C51";

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
	 
   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'); 

   ReturnHome();                                   //Return to 0 position
			
	while(1)
	{
		while(current_byte!=12);
		display();
		delay(500000);
		
		key=0;
		for(count=0;count<12;count++)
		{ 
		   if(card_id[count]==tag[count])
			{
			 key++;
			}
		}	
		
		count = 0;
		
		if((key == 12) && (display_flag == 0)) {
				delay(500000);
				display2();
			  display_flag = 1;
			  key = 0;
		}
			
		send_uart();
		send_string_uart(mystring);
		
		
		/*
		if((tag == card_id) && (display_flag == 0)) {
			  display2();
			  display_flag = 1;
		}
		*/
				
	}

}

void send_uart(void) {
	
	TI = 0;
	SBUF = 'A';
	while(TI == 0);
	delay(500000);
	
}

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);
		delay(500000);
	}

}


void display()        // Function to display the unique id
{
    unsigned char count;
    writecmd(0xC1);        //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(0xC1);        //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 = 0x00;   //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);
}
 

Attachments

  • serial tx.rar
    69 KB · Views: 88

probably because your uart is not initialized?
sure there's no uart_init() function?
and where does this set the baud rate and such?
 

Here is the Timer Initialization and UART Initialization

Code:
TMOD=0x20;                            //Enable Timer 1
   TH1=0XFD;
   SCON=0x50;
   TR1=1;
   EA=1;
   ES=1;

The Uart Receiving in working fine. Transmit is not working. In the virtual terminal you have to type 123456789123 then it displays Card Accepted in LCD, then only it transmits 'A' and "AT89C51" to uart.
 

because there is no isr routine........

u have enabled the serial interrupt but u are not handling it...........
 

look u have enabled the serial interrupt.......
Code:
EA=1;
   ES=1;

where is serial interrupt service in ur program
 

Yes. It is working after I changed P3.0 and P3.1 to 1 i.e., P3 = 0x03.

major error fixed.

here is the working file.
 

Attachments

  • rfid reader v3.rar
    111.8 KB · Views: 91
Last edited:

Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top