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

📄 sio.c

📁 这是《Keil Cx51 V7.0单片机高级语言编程与uVision2应用实践》教材各章中列出的全部程序例子。
💻 C
字号:
#include <reg51.h>
#include <string.h>
#include "sio.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 (1200);		 // 利用定时器T1作为波特率发生器

EA = 0;                      // 关中断
t_in = 0;					// 清除接收和发送缓冲区
t_out = 0;
t_disabled = 1;
r_in = 0;
r_out = 0;

SM0 = 0; SM1 = 1;			// 串行口方式1
REN = 1;						// 允许接收

TI = 0;						// 清除发送中断标志
RI = 0;						// 清除接收中断标志
ES = 1;						// 允许串行口中断
PS = 0;						// 设置串行口中断为低优先级
EA = 1;                     // 开中断
}

/**************************** 波特率发生器函数 ***************************
* 功能:利用定时器T1产生由参数baudrate指定的波特率
*************************************************************************/
void com_baudrate (unsigned baudrate) {
EA = 0;                     // 关中断
TI = 0;				    		// 清除发送中断标志
t_in = 0;			   		// 清除发送缓冲区
t_out = 0;
t_disabled = 1;			 	// 禁止发送

TR1 = 0;			    			// 停止定时器T1
ET1 = 0;			    			// 禁止T1中断
PCON |= 0x80;			    // 波特率加倍
TMOD &= ~0xF0;			    // 设置T1工作于方式2
TMOD |= 0x20;			    
TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));
TR1 = 1;			    			// 启动T1
EA = 1;                     // 开中断
}

/************************** 串行口字符输出函数 ***************************
* 功能:从串行口输出一个字符c
**************************************************************************/
char com_putchar (unsigned char c) {
if ((TBUF_SIZE - com_tbuflen ()) <= 2)   
   return (-1);					// 如果发送缓冲区满则返回 -1

EA = 0;                        	// 关中断
tbuf [t_in++] = c; 				// 将数据加入到发送缓冲区并开中断
if (t_disabled)	{
  t_disabled = 0;
  TI = 1;			
}
EA = 1;                         
return (0);						// 串行口输出正确,返回0
}

/************************* 串行口字符输入函数 ****************************
* 功能:从串行口输入一个字符
**************************************************************************/
int com_getchar (void) {
int c;
if (com_rbuflen () == 0)
  	return (-1); 			// 如果接收缓冲区长度为0(未收到字符),返回 -1
EA = 0;                 
c = rbuf [r_out++];
EA = 1;                 
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 + -