⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 C
字号:
#include "tdp.h"
#include <reg51.h>
#include <string.h>
#define TBUF_SIZE	256		/* 这两行不要改动 */
#define RBUF_SIZE	256		

static xdata unsigned char tbuf [TBUF_SIZE];
static xdata unsigned char rbuf [RBUF_SIZE];
static xdata unsigned char t_in = 0;
static xdata unsigned char t_out = 0;
static xdata unsigned char t_disabled = 0;
static xdata unsigned char r_in = 0;
static xdata unsigned char r_out = 0;

/* 串行口中断服务函数 */
static void com_isr (void) interrupt 4 using 2  {
if (RI != 0) {		/* 接收处理 */
	  RI = 0;	
	  if ((r_in + 1) != r_out)
	    rbuf [r_in++] = SBUF;
	}
	
	if (TI != 0) {      /* 发送处理 */
	  TI = 0;	
	  if (t_in != t_out)
	    SBUF = tbuf [t_out++];
	  else
	    t_disabled = 1;
}	
}

/* 串行口初始化函数 */
void com_initialize (void) {   
com_baudrate (57600);   /* 设定波特率 */
	INT_DISABLE;
	t_in = 0;			     /* 清零串行口缓冲器 */
	t_out = 0;
	t_disabled = 1;
	r_in = 0;
	r_out = 0;	
	SM0 = 0; SM1 = 1;		/* 设定串行口工作于方式1 */
	SM2 = 0;
	REN = 1;			        /* 允许接收 */	
	TI = 0;				    /* 清零串行口中断标志位 */
	RI = 0;					
	ES = 1;				    /* 允许串行口中断 */
	PS = 0;				    /* 设置串行口中断优先级 */	
	INT_ENABLE;
}

/* 波特率设置函数 */
void com_baudrate (unsigned baudrate) {
	INT_DISABLE;
	TI = 0;					/* 清零发送中断标志 */
	t_in = 0;				/* 清零发送缓冲区 */
	t_out = 0;
	t_disabled = 1;		    /* 禁止发送 */
	TR1 = 0;					/* 停止T1 */
	ET1 = 0;					/* 禁止T1中断 */
	PCON |= 0x80;			/* 设置SMOD=1: 波特率加倍 */	
	TMOD &= ~0xF0;			/* 设置T1工作于方式2 */
	TMOD |= 0x20;				
	TH1 = (unsigned char) (256 - (TCLK / (16L * 12L * baudrate)));	
	TR1 = 1;				/* start timer 1 */	
	INT_ENABLE;
}

/* 字符发送函数 */
char com_putchar (unsigned char c) {
if ((TBUF_SIZE - com_tbuflen ()) <= 2) /* 若缓冲区满,则返回出错标志 */
	  return (-1);
INT_DISABLE;
	tbuf [t_in++] = c;                     /* 数据送往发送缓冲区 */
	if (t_disabled)	{		
	  t_disabled = 0;
	  TI = 1;			
	}
	INT_ENABLE;
	return (0);
}

/* 字符串发送函数 */
char com_puts (char *s) {
if ((TBUF_SIZE - com_tbuflen ()) <= strlen (s))  
	  return (-1);
INT_DISABLE;
	for (; *s != '\0'; s++)
	  tbuf [t_in++] = *s;
	if (t_disabled)	{		
	  t_disabled = 0;
	  TI = 1;			
	}
	INT_ENABLE;	
	return (0);
}

/* 字符接收函数 */
int com_getchar (void) {
	xdata int c;
	if (com_rbuflen () == 0)
	  return (-1);	
	INT_DISABLE;
	c = rbuf [r_out++];
	INT_ENABLE;	
	return (c);
}

unsigned char com_rbuflen (void) { /* 计算接收缓冲区长度 */
		return (r_in - r_out);
}

unsigned char com_tbuflen (void) { /* 计算发送缓冲区长度 */
	    return (t_in - t_out);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -