?? serial.c
字號(hào):
#include "tdp.h"
#include <reg51.h>
#include <string.h>
#define TBUF_SIZE 256 /* 這兩行不要改動(dòng) */
#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;
/* 串行口中斷服務(wù)函數(shù) */
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 (57600); /* 設(shè)定波特率 */
INT_DISABLE;
t_in = 0; /* 清零串行口緩沖器 */
t_out = 0;
t_disabled = 1;
r_in = 0;
r_out = 0;
SM0 = 0; SM1 = 1; /* 設(shè)定串行口工作于方式1 */
SM2 = 0;
REN = 1; /* 允許接收 */
TI = 0; /* 清零串行口中斷標(biāo)志位 */
RI = 0;
ES = 1; /* 允許串行口中斷 */
PS = 0; /* 設(shè)置串行口中斷優(yōu)先級(jí) */
INT_ENABLE;
}
/* 波特率設(shè)置函數(shù) */
void com_baudrate (unsigned baudrate) {
INT_DISABLE;
TI = 0; /* 清零發(fā)送中斷標(biāo)志 */
t_in = 0; /* 清零發(fā)送緩沖區(qū) */
t_out = 0;
t_disabled = 1; /* 禁止發(fā)送 */
TR1 = 0; /* 停止T1 */
ET1 = 0; /* 禁止T1中斷 */
PCON |= 0x80; /* 設(shè)置SMOD=1: 波特率加倍 */
TMOD &= ~0xF0; /* 設(shè)置T1工作于方式2 */
TMOD |= 0x20;
TH1 = (unsigned char) (256 - (TCLK / (16L * 12L * baudrate)));
TR1 = 1; /* start timer 1 */
INT_ENABLE;
}
/* 字符發(fā)送函數(shù) */
char com_putchar (unsigned char c) {
if ((TBUF_SIZE - com_tbuflen ()) <= 2) /* 若緩沖區(qū)滿,則返回出錯(cuò)標(biāo)志 */
return (-1);
INT_DISABLE;
tbuf [t_in++] = c; /* 數(shù)據(jù)送往發(fā)送緩沖區(qū) */
if (t_disabled) {
t_disabled = 0;
TI = 1;
}
INT_ENABLE;
return (0);
}
/* 字符串發(fā)送函數(shù) */
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);
}
/* 字符接收函數(shù) */
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) { /* 計(jì)算接收緩沖區(qū)長(zhǎng)度 */
return (r_in - r_out);
}
unsigned char com_tbuflen (void) { /* 計(jì)算發(fā)送緩沖區(qū)長(zhǎng)度 */
return (t_in - t_out);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -