#include <REG2051.H><br />#include "SimUART.h"<br /><br />sbit SimPortA_TX =P1^1;<br />sbit SimPortA_RX =P1^2;<br />sbit SimPortB_TX =P3^3;<br />sbit SimPortB_RX =P3^4;<br /><br />static unsigned char guSimPortA_Count =1;<br />static unsigned char guSimPortB_Count =1;<br /><br />static unsigned char bdata gSimUART_Status =0xcc;<br />sbit gbSimPortA_Sending =gSimUART_Status^0;<br />sbit gbSimPortA_Receiving =gSimUART_Status^1;<br />sbit gbSimPortA_Txd =gSimUART_Status^2;<br />sbit gbSimPortA_Rxd =gSimUART_Status^3;<br />sbit gbSimPortB_Sending =gSimUART_Status^4;<br />sbit gbSimPortB_Receiving =gSimUART_Status^5;<br />sbit gbSimPortB_Txd =gSimUART_Status^6;<br />sbit gbSimPortB_Rxd =gSimUART_Status^7;<br /><br />static bit fTimeOverflow_A =FALSE;<br />static bit fTimeOverflow_B =FALSE;<br /><br />unsigned char code BitCtrl[] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};<br /><br />unsigned char SimUART_BaudSet(unsigned char PortID,unsigned char BaudRate)<br />{<br /> unsigned char divrate,state;<br /><br /> state =!0;<br /> switch(BaudRate)<br /> {<br /> case BAUD9600:<br /> divrate =1;<br /> break;<br /> case BAUD4800:<br /> divrate =2;<br /> break;<br /> case BAUD2400:<br /> divrate =4;<br /> break;<br /> case BAUD1200:<br /> divrate =8;<br /> break;<br /> default:<br /> state =0; //0 for fail<br /> break;<br /> }<br /><br /> if(state)<br /> {<br /> switch(PortID)<br /> {<br /> case SIMPORTA:<br /> guSimPortA_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x01;<br /> break;<br /> case SIMPORTB:<br /> guSimPortB_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x10;<br /> break;<br /> case SIMPORTAB:<br /> guSimPortA_Count =(divrate *COUNT_MULTIPLE);<br /> guSimPortB_Count =(divrate *COUNT_MULTIPLE);<br /> state =0x11;<br /> break;<br /> default:<br /> state =0;<br /> }<br /> }<br /><br /> return(state);<br />}<br /><br />void SimUARTs_Send(unsigned char CtrlWord)<br />{<br /> unsigned char count;<br /><br /> if((gSimUART_Status &0x33) ==0)<br /> {<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /> gbSimPortA_Txd =0;<br /> gbSimPortB_Txd =0;<br /> gbSimPortA_Sending =TRUE;<br /> gbSimPortB_Sending =TRUE;<br /><br /> while(!fTimeOverflow_A) //waiting for sending start-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /><br /> for(count =0;count <8;count++)<br /> {<br /> gbSimPortA_Txd =gbSimPortB_Txd =(bit)(CtrlWord &BitCtrl[count]);<br /> while(!fTimeOverflow_A) //waiting for sending a data-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /> }<br /><br /> gbSimPortA_Txd =1;<br /> gbSimPortB_Txd =1;<br /> while(!fTimeOverflow_A) //waiting for sending stop-bit<br /> ;<br /> fTimeOverflow_A =FALSE;<br /> fTimeOverflow_B =FALSE;<br /><br /> gbSimPortA_Sending =FALSE;<br /> gbSimPortB_Sending =FALSE;<br /> }<br />}<br /><br />bit SimUARTA_Receive(unsigned char *ptr)<br />{<br /> static unsigned char BitCount =0;<br /> static unsigned char ReceivedByte =0;<br /><br /> if(gbSimPortA_Receiving)<br /> {<br /> if(fTimeOverflow_A)<br /> {<br /> fTimeOverflow_A =FALSE;<br /> if(BitCount >=8)<br /> {<br /> BitCount =0;<br /> gbSimPortA_Receiving =FALSE;<br /> if(gbSimPortA_Rxd) //Check for stop-bit<br /> {<br /> *ptr =ReceivedByte;<br /> return(TRUE);<br /> }<br /> }<br /> else<br /> {<br /> if(gbSimPortA_Rxd)<br /> ReceivedByte |=BitCtrl[BitCount];<br /> else<br /> ReceivedByte &=(~(BitCtrl[BitCount]));<br /> BitCount++;<br /> }<br /> }<br /> }<br /> else<br /> BitCount =0;<br /> return(FALSE);<br />}<br /><br />bit SimUARTB_Receive(unsigned char *ptr)<br />{<br /> static unsigned char BitCount =0;<br /> static unsigned char ReceivedByte =0;<br /><br /> if(gbSimPortB_Receiving)<br /> {<br /> if(fTimeOverflow_B)<br /> {<br /> fTimeOverflow_B =FALSE;<br /> if(BitCount >=8)<br /> {<br /> BitCount =0;<br /> gbSimPortB_Receiving =FALSE;<br /> if(gbSimPortB_Rxd) //Check for stop-bit<br /> {<br /> *ptr =ReceivedByte;<br /> return(TRUE);<br /> }<br /> }<br /> else<br /> {<br /> if(gbSimPortB_Rxd)<br /> ReceivedByte |=BitCtrl[BitCount];<br /> else<br /> ReceivedByte &=(~(BitCtrl[BitCount]));<br /> BitCount++;<br /> }<br /> }<br /> }<br /> else<br /> BitCount =0;<br /> return(FALSE);<br />}<br /><br />//Timer0 interrupt routine<br />void Timer0(void) interrupt TF0_VECTOR using 1<br />{<br /> static unsigned char data SimPortA_SampleCount =0;<br /> static unsigned char data SimPortB_SampleCount =0;<br /> bit RxdPin_A,RxdPin_B;<br /><br /> RxdPin_A =SimPortA_RX;<br /> RxdPin_B =SimPortB_RX;<br />// SimPortA_TX =gbSimPortA_Txd;<br />// SimPortB_TX =gbSimPortB_Txd;<br /> <br /> //Port A<br /> if((gSimUART_Status &0x03) ==0)<br /> {<br /> if(RxdPin_A ==0) //find out receive start-bit<br /> {<br /> SimPortA_SampleCount++;<br /> if(SimPortA_SampleCount >=2)<br /> {<br /> if(!gbSimPortA_Sending) //working as simplex-system<br /> gbSimPortA_Receiving =TRUE; //start receive<br /> SimPortA_SampleCount =0;<br /> }<br /> }<br /> else<br /> SimPortA_SampleCount =0;<br /> }<br /> else<br /> {<br /> SimPortA_SampleCount++;<br /> if(SimPortA_SampleCount >=guSimPortA_Count)<br /> {<br /> fTimeOverflow_A =TRUE;<br /> if(gSimUART_Status &0x01) //Sending<br /> SimPortA_TX =gbSimPortA_Txd;<br /> if(gSimUART_Status &0x02) //Receiving<br /> gbSimPortA_Rxd =RxdPin_A;<br /> SimPortA_SampleCount =0;<br /> }<br /> }<br /><br /> //Port B<br /> if((gSimUART_Status &0x30) ==0)<br /> {<br /> if(RxdPin_B ==0) //find out receive start-bit<br /> {<br /> SimPortB_SampleCount++;<br /> if(SimPortB_SampleCount >=2)<br /> {<br /> if(!gbSimPortB_Sending) //working as simplex-system<br /> gbSimPortB_Receiving =TRUE; //start receive<br /> SimPortB_SampleCount =0;<br /> }<br /> }<br /> else<br /> SimPortB_SampleCount =0;<br /> }<br /> else<br /> {<br /> SimPortB_SampleCount++;<br /> if(SimPortB_SampleCount >=guSimPortB_Count)<br /> {<br /> fTimeOverflow_B =TRUE;<br /> if(gSimUART_Status &0x10) //Sending<br /> SimPortB_TX =gbSimPortB_Txd;<br /> if(gSimUART_Status &0x20) //Receiving<br /> gbSimPortB_Rxd =RxdPin_B;<br /> SimPortB_SampleCount =0;<br /> }<br /> }<br />}
|