当前位置:文档之家› 51单片机串口程序

51单片机串口程序

51单片机串口程序
51单片机串口程序

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;i

RXDCON++;

}

}

}

void Uart_Run(void) //根据程序的状态向外发送数据,需要实时的执行{

Uart_ziyuan();

}

#undef TxDDATAMAX

#undef RXDDATAMAX

相关主题
文本预览
相关文档 最新文档