Hi .
I am doing a Project in 8052 McU.i need to have two serial port so i thought of writing soft UART with any two GPIO..i selected P3.2,P3.3 of 8052..can anyone help me...i got some rough idea about the Software..but for a fully complted one i need ur help..can any one have sample code..am confused with serial data controlling i mean how to mimic the functionalit of SCON regster..i dnt even knw wheter it s required or not..pls help someone..
There are many examples available, just use 'google' or similar.
Like an 20 year old application note for the 80c751 derivative which can be found:
Duplex UART Routines for the 751/752" from 8/20/1992
smartdata.usbid.com/.../an446.pdf
That example works, but it is a little bit weak in concept, it could work at higher baudrate and more reliable; but you will locate these things yourself if you fully unserstand how that is done, won't you?
Thanks a lot man..actually in between am in my way to finish my code my own.i just asked for code just to check whether its correct or not.am a bit confused with the SCON functionality since am a beginner only.i will post my half done code along with just check.
#include<reg52.h>
#define RX1 P1^2 #define TX1 P1^3
unsigned char data SBUFF; sbit data TFLG;
void external_interrupt(void) interrupt 0 {
//Function body }
void rev_fn(void) { unsigned char cp_dat,tr=0,rcd;
cp_dat=RX1; while(tr<8) { rcd=(0x80&RX1)?1:0; cp_dat=cp_dat<<1; tr++; } TFLG=1; SBUFF=rcd; } void tx_fn(void) { unsigned char cp_dat,tr=0,txd;
cp_dat=SBUFF; while(tr<8) { TX1=(0x80&dat)?1:0; cp_dat=cp_dat<<1; tr++; } TFLG=1; } void main() { TMOD=0x02; TH0=0xFD; SCON=?; TR0=1; IE=0x81; while(1); }
No. You are not even close to have written any software UART.
An UART transmits and receives using a specific baudrate. So there must be a very specific delay between every single bit sent out. And a very specific delay between each sample of input. Where do you delay your bits?
An UART can send and transmit at the same time. So there can't be a single loop to send 8 bits or a single loop to receive 8 bits.
An UART is asynchronous, making use of start and stop bits. Where are your start-bit detection for receiving data? Where are your start and stop bit generation for transmitting data?
An UART has to support slight baudrate errors, so when receiving data, the RX line must be polled faster than the baudrate. First you need to find the start of the start bit - then you need to at least poll the data and stop bits somewhere in the middle of the individual bit periods - where do you do that?
And the program may not be interrupted so you miss your time-critical delays - when to emit a bit or when to poll. How did you plan to integrate that with the communication on the other UART? How did you plan to integrate that with your require main loop processing of data?
Have you really googled and read up about the general concept of an UART? Of the requirements of a software UART? Or did you just assume that a software UART is a shift register sending out or receiving 8 bits at a time?
hi,
Thanks for ur reply,
first of all my need is to create a half duplex virtual UART for my 8052.this code is not a full version,i know its not even close.am a fresher in MCU programming.i got 2 days time from my senior to complete this,and my time will end by this Saturday evening.am a bit desperate to complete it on time.am giving timer 0 to put delay in between individual bits.and setting up baud rates i also need the TH0 of timer 1 i believe.i have googled it but i was a bit misguided.
1.taking one interrupt 2.setting one timer for delay 3.sending individual bits 4.start stop condition
is this much necessary for it.
This is a duplicate of another therad, which school do yu attend? e-mail address, please
Thanks for ur reply you do not need a microresistor (ur) for a soft UART
Erik
namees.majeed@gmail.com this is my email id..wat u mean by my school?see am just in a begning stage
#include<reg52.h> #include<stdio.h>
sbit TX1=P3^3;
unsigned char SBUFF; bit TFLG;
void delay(unsigned char num) { unsigned char i,j; for(i=0;i<num;i++) for(j=0;j<1275;j++) ; } void transmit_vir(unsigned char dat) { unsigned char tx=0,cp_data;
cp_data=dat; TX1=0; TR0=1; while(TF0==1); TR0=0; while(tx<8) { TX1=(0x80&dat)?1:0; TR0=1; while(TF0==1); TR0=0; cp_data=cp_data<<1; tx++; } TFLG=1; TR0=1; while(TF0==1); TR0=0; TX1=1; } void main() { TMOD=0x02; TH0=0xFD; while(1) { delay(25); transmit_vir('a'); while(TFLG==1); TFLG=0; delay(25); }
}
Half duplex communication for virtual serial port..only TX is being implemented.is this correct
www.danlhenry.com/.../keil_code.png
ok i wil do it here after.
No, your code isn't correct.
Do you really feel that you are fulfilling what you see if you read this link? en.wikipedia.org/.../RS-232
hi, thanks for u r response,i read the link u provided.Am actually a bit confused collecting data bit wise.am suing only 3 line from serial to USB connector. 1.a sample data collection UART algorithm,sub routine after listening to External interrupt pin(P3.2)
void recev() routine to recieve { unsigned char r=0; bit sbuff[8]; if(P3.2==0) //start bit detection while(r<8) { sbuff[r]=P3.2; r++; TR0=1; while(TF0==1); //delay in between bits Timer 0 is used TR0=0; } if(P3.2==1) //stop bit condition achieved TFLG=1; //flag to indicate the receive has completed } void transmit_vir(unsigned char dat) //a simple transmisson algorithm { unsigned char tx=0,cp_data; cp_data=dat; TX1=0; //start bit TR0=1; //timer start while(TF0==1); TR0=0; while(tx<8) { TX1=(0x80&dat)?1:0; //8-bit data TR0=1; while(TF0==1); TR0=0; cp_data=cp_data<<1; tx++; } TFLG=1; //transmission flag TR0=1; //baud rate while(TF0==1); TR0=0; TX1=1; //stop bit }
while transimisson which only i copiled and burned to my MCU i got a 'FC' data on my hyper-terminal..read so many articles in google they are telling for a simple communication handshaking is not required. that's y i developed like this since my need is urgent Tomorrow is my dead line..
If your dead line is to morrow then may be you should consi der stop bits.
And another thing - are you sure your code uses the same bit order as the other side for your data bits?
i need result rather than time.i have provided stop bits there...then one more thing is hyper terminal has a specific code to accept data.i mean whether LSB or MSB which should go out first.is my logic correct which i implemented here..any comments..since no one here to guide me as well
Why you ask? Did you read the link I posted?
You really have stop bits? And how many bit times do you hold your stop bits? And what is your delay after the while loop, but before your "stop bit" line?
while transimisson which only i copiled and burned to my MCU i got a 'FC' this could be the result of badly mismatched send and receive. set it to transmit 'U' (uppercase U) continously and scope the output.
No, I am not going to tell you what to look for, If you can't figure that out, you should not have started this project.