#include"STC11.h"
#include"USART.h"
sbit TXB = P1^1; //RXD,单片机接收数据
sbit RXB = P1^0; //TXD,单片机发送数据
uchar TBUF,RBUF; //相当于串口中的SBUF
uchar TDAT; //中间变量,TDAT负责将TBUF依次送到管脚上
uchar RDAT; //中间变量,RDAT将串口数据接收下来,送给RBUF
uchar TCNT,RCNT; //配合定时器,判断管脚状态
uchar TBIT,RBIT; //发送或接收时用来记录字节的位数
bit TING,RING; //发送和接收的开始标志位
bit TEND,REND; //类似于TI和RI,所以TEND的初始化值是1
void usart_init() //串口初始化
{
AUXR |= 0x80; //定时器时钟1T模式
// TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0=(BAUD>>8);
TL0= BAUD;
TR0= 1;
PT0=1;
ET0=1;
TING=0;
RING=0;
TEND=1;
REND=0;
TCNT=0;
RCNT=0;
}
void RXD_DEAL() //串口接收处理函数,相当于串口中断里面if(RI){;}的内容
{
if(RING)
{
if(--RCNT==0)
{
RCNT=3;
if(--RBIT==0)
{
RBUF=RDAT;
RING=0;
REND=1;
}
else
{
RDAT>>=1;
if(RXB)
{
RDAT|=0X80;
}
}
}
}
else if(!RXB)
{
RING=1;
RCNT=4;
RBIT=9;
}
}
void TXD_DEAL() //串口接收处理函数,相当于串口中断里面if(TI){;}的内容
{
if(--TCNT==0)
{
TCNT=3;
if(TING)
{
if(TBIT==0)
{
TXB=0;
TDAT=TBUF;
TBIT=9;
}
else
{
TDAT>>=1;
if(--TBIT==0)
{
TXB=1;
TING=0;
TEND=1;
}
else
{
TXB=CY;
}
}
}
}
}
void put_char(uchar send_data) //串口发送函数:单字节
{
while(!TEND);
TEND=0;
TBUF=send_data;
TING=1;
}
|