51单片机串口程序

#include //2005-6-1
/****************************************************************
函数功能:串行口发送函数
入口参数:使用函数传递,TxdData(data) 将一个数据放入到发送缓冲区
出口参数:RXDATA[] rxdcon
*****************************************************************/
#define TxDDATAMAX 10 //定义发送缓冲区长度
#define RXDDATAMAX 7 //定义接收缓冲区长度

struct
{
unsigned char txdconl,txdconh; //定义缓冲区指针
unsigned char txdflag,TxdDada[TxDDATAMAX]; //定义缓冲区指针
unsigned char rxdtime;
unsigned char temp[RXDDATAMAX];
}UARTDATA;
unsigned char RXDDATA[RXDDATAMAX]; //接收到的数据,向外传递数据用的
unsigned char RXDCON; //接收到的数据进行记录,数据接收标志
extern unsigned char TIME; //记录全过程的时间信息
static unsigned char Uart_dataup(unsigned char datain)
{
datain++;
if(datain >= TxDDATAMAX)
{
datain = 0;
}
return datain;
}
/****************************************************************
将数据按照一定的格式放入到发送缓冲区
*****************************************************************/
void Uart_Tx(unsigned char datain) //向发送数据的程序提供数据接口
{
UARTDATA.txdconh = Uart_dataup(UARTDATA.txdconh);
UARTDATA.TxdDada[UARTDATA.txdconh] = datain;
if(UARTDATA.txdflag == 0) //数据发送还没有启动
{
UARTDATA.txdflag = 1;
UARTDATA.txdconl = Uart_dataup(UARTDATA.txdconl);
SBUF = UARTDATA.TxdDada[UARTDATA.txdconl]; //发现有数据变化就发送数据
}
}
static Uart_ziyuan(void) //根据程序的状态向外发送数据,需要实时的执行
{
static unsigned char time;
if(time != TIME)
{
time = TIME;
if(UARTDATA.rxdtime > 0)
{
UARTDATA.rxdtime--;
}
}
}
/****************************************************************
mega48串行口0初始化
*****************************************************************/
void Uart_init(void)
{
//串行口初始化
SCON = 0x50; //串行工作方式1,多机通讯模式,允许接受
TB8 = 1;
PCON &= 0x7f; //串口波特率加倍为SMOD=0,关闭串行波特率加倍功能
EA = 1;
}
/****************************************************************
函数功能:串行口接收函数
入口参数:使用全局变量传递
出口参数:接收数据使用 RXDATA rxdcon
*****************************************************************/
void Uart_Isr(void) interrupt 4
{
unsigned char i;
static unsigned char con;
if(TI) //发码中断,只清硬件标志
{
TI = 0;
if(UARTDATA.txdconl != UARTDATA.txdconh ) //发行有差值即可启动数据发送
{
UARTDATA.txdconl = Uart_dataup(UARTDATA.txdconl);
SBUF = UARTDATA.TxdDada[UARTDATA.txdconl]; //发现有数据变化就发送数据
}
else
{
UARTDATA.txdflag=0;//数据发送完毕
}

}
if(RI)
{
RI = 0;
if(UARTDATA.rxdtime == 0)
{
con = 0;
}
UARTDATA.rxdtime = 10;
UARTDATA.temp[con] = SBUF;
con++;
if(con >= RXDDATAMAX)
{
con = 0;
for(i=0;iRXDCON++;
}
}
}
void Uart_Run(void) //根据程序的状态向外发送数据,需要实时的执行
{
Uart_ziyuan();
}
#undef TxDDATAMAX
#undef RXDDATAMAX

相关文档
最新文档