51单片机串口程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机串口程序
#include
/**************************************************************** 函数功能:串行口发送函数
入口参数:使用函数传递,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;