串口模拟程序,只占用一个T2资源
<P>//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 扩展串口</P><P>//simulate serial port</P>
<P> #include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define On 1 ;
#define Off 0
sbitTXDS = P1^0 ;
sbitRXDS = P1^1 ;
sbitrede1= P3^5;
bit Tend;//发送结束标志
bit Rend;//接收结束标志
bit Tov;// 接收超时标志
bit TR;//发送 接受标志
uchar Tb=10;//发送数据为十位
uchar Rb=8; //接收数据为8位
ucharTX_number;
uchar RX_number;
uchar hs=0;// 发送数据移位变量
uchar t;
uchar r;
uchar*ptr_T; //发送数据指针
uchar*ptr_R; //接收数据指针</P>
<P> voiddelay(uint);
voidTX_DATA();
voidRX_DATA();
void main (void)
{delay(9);
Tov=0;</P>
<P> *ptr_R=r;
// TX_number=10;</P>
<P> // t=0x11;</P>
<P> //t=0x12;
//t=0x13;
// t=0x14;
//t=0x15;
//t=0x25;
//t=0x26;
//t=0x27;
//t=0x28;
//t=0x29;
//TX_DATA();
RX_number=2;
RX_DATA();
delay(199);
nop;
nop;
while(1);</P>
<P> } //main
void TX_DATA(void)
{
ptr_T=t; //定义指针地址
hs=*ptr_T; //第一个数据送达数据移位单元
TR=On;//发送
Tend =0;
rede1=Off;//只发送状态
delay(9);</P>
<P>
T2CON=0x00;
TH2=0xfd; //bps 1200
TL2=0x23;
TR2=On; //开中断
ET2=On;
EA =On;
do{
PCON|=0x01;
nop;}
while(Tend==0);
rede1=On;
}</P>
<P> void RX_DATA(void)</P>
<P> {
ptr_R=r;
Rend= 0;
TR= 0;//接收标志
rede1= 1;</P>
<P> T2CON=0x08;//允许外部中断
ET2=1;
EA= 1;
}//RX_DATA</P>
<P> voidTimer2(void) interrupt 5 //timer interrupt
{
ucharRdata;</P>
<P> if(TR)
{//发送
TL2=0x23;//
TH2=0xfd; //bps 1200
TF2=0x00;</P>
<P> if (--Tb)
{if(Tb==9)
{nop;
nop;
nop;
TXDS=0;
}
else
{ TXDS=(bit)(hs&0x01) ;
hs=hs>>1;
}
}
else //if(Tb==0)
{nop;
nop;
Tb=10;
nop;
nop;
TXDS=1;
if(--TX_number!=0)
{ptr_T++;
hs=*ptr_T ;
}
else
{
Tend=1; //发完
T2CON=0;
}
}//Tb==0
} //TR=1
if (!TR)//接收
{
if(!EXF2)
{ TF2=0;
TL2=0x1c;//
TH2=0xfd;///bps=1200 ////TL2=0xc2; //bps9600
////TH2=0x0ff;
Rdata=(uchar)RXDS;
hs|=Rdata;
hs=_cror_(hs,1);
if(--Rb==0)
{//
*ptr_R=hs;
ptr_R++;
hs=0;</P>
<P> //;;;;;;;;;;
// TH0=0x0f0;//每收-每收到1字节,重新设置定时溢出超时时间4mS
//;;;;;;;;;;;;;;;;;;;
if(--RX_number)
{
T2CON=0x08;</P>
<P> }
else
{T2CON=0x00;
// Rend=1;
}
}//
}//EXF2
else if (EXF2)
{</P>
<P> EXF2=0;
TL2=0xef;//0xe6;//0x22;
TH2=0xfc;
TR2=1;
EXEN2=0;
ET2=1;
Rb=8;
}</P>
<P> }//TR==0</P>
<P>
}//end</P>
<P> void delay(uint delx)
{
uint i=0;
while(i<delx)
{
i++;
}
}
</P>
页:
[1]