?? sio.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;
/******************************* 中斷處理函數(shù) ***************************
* 功能:完成數(shù)據(jù)得的接收合發(fā)送
************************************************************************/
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) { // 發(fā)送
TI = 0;
if (t_in != t_out)
SBUF = tbuf [t_out++];
else
t_disabled = 1;
}
}
/***************************** 串行口初始化函數(shù) **************************
* 功能:初始化單片機的串行口
*************************************************************************/
void com_initialize (void) {
com_baudrate (1200); // 利用定時器T1作為波特率發(fā)生器
EA = 0; // 關中斷
t_in = 0; // 清除接收和發(fā)送緩沖區(qū)
t_out = 0;
t_disabled = 1;
r_in = 0;
r_out = 0;
SM0 = 0; SM1 = 1; // 串行口方式1
REN = 1; // 允許接收
TI = 0; // 清除發(fā)送中斷標志
RI = 0; // 清除接收中斷標志
ES = 1; // 允許串行口中斷
PS = 0; // 設置串行口中斷為低優(yōu)先級
EA = 1; // 開中斷
}
/**************************** 波特率發(fā)生器函數(shù) ***************************
* 功能:利用定時器T1產(chǎn)生由參數(shù)baudrate指定的波特率
*************************************************************************/
void com_baudrate (unsigned baudrate) {
EA = 0; // 關中斷
TI = 0; // 清除發(fā)送中斷標志
t_in = 0; // 清除發(fā)送緩沖區(qū)
t_out = 0;
t_disabled = 1; // 禁止發(fā)送
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; // 開中斷
}
/************************** 串行口字符輸出函數(shù) ***************************
* 功能:從串行口輸出一個字符c
**************************************************************************/
char com_putchar (unsigned char c) {
if ((TBUF_SIZE - com_tbuflen ()) <= 2)
return (-1); // 如果發(fā)送緩沖區(qū)滿則返回 -1
EA = 0; // 關中斷
tbuf [t_in++] = c; // 將數(shù)據(jù)加入到發(fā)送緩沖區(qū)并開中斷
if (t_disabled) {
t_disabled = 0;
TI = 1;
}
EA = 1;
return (0); // 串行口輸出正確,返回0
}
/************************* 串行口字符輸入函數(shù) ****************************
* 功能:從串行口輸入一個字符
**************************************************************************/
int com_getchar (void) {
int c;
if (com_rbuflen () == 0)
return (-1); // 如果接收緩沖區(qū)長度為0(未收到字符),返回 -1
EA = 0;
c = rbuf [r_out++];
EA = 1;
return (c); // 串行口輸入正確,返回輸入的字符
}
/************************* 計算接收緩沖區(qū)長度 ****************************
* 功能:計算接收緩沖區(qū)長度并返回給主調(diào)函數(shù)
**************************************************************************/
unsigned char com_rbuflen (void) {
return (r_in - r_out);
}
/************************* 計算發(fā)送緩沖區(qū)長度 ****************************
* 功能:計算發(fā)送緩沖區(qū)長度并返回給主調(diào)函數(shù)
**************************************************************************/
unsigned char com_tbuflen (void) {
return (t_in - t_out);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -