?? serial.c
字號:
/*****************************************************************************/
/* SERIAL.C: 應(yīng)用RTX-51 tiny的串行口中斷控制器 */
/*****************************************************************************/
#include <reg52.h> /* 8052單片機特殊功能寄存器定義 */
#include <rtx51tny.h> /* RTX-51 tiny 功能函數(shù)定義 */
#define OLEN 8 /* 定義串行口通信發(fā)送緩沖區(qū)的大小 */
unsigned char ostart; /* 串行口發(fā)送緩沖區(qū)起點 */
unsigned char oend; /* 串行口發(fā)送緩沖區(qū)終點 */
idata char outbuf[OLEN]; /* 串行口發(fā)送緩沖區(qū) */
unsigned char otask = 0xff; /* 輸出任務(wù)的任務(wù)號 */
#define ILEN 8 /* 定義串行口通信接收緩沖區(qū)大小 */
unsigned char istart; /* 串行口接收緩沖區(qū)起點 */
unsigned char iend; /* 串行口接收緩沖區(qū)終點 */
idata char inbuf[ILEN]; /* 串行口接收緩沖區(qū) */
unsigned char itask = 0xff; /* 輸入任務(wù)的任務(wù)號 */
#define CTRL_Q 0x11 /* 定義CTRL_Q代碼 */
#define CTRL_S 0x13 /* 定義CTRL_S代碼 */
bit sendfull; /* 發(fā)送緩沖區(qū)滿標(biāo)志 */
bit sendactive; /* 發(fā)送激活標(biāo)志 */
bit sendstop; /* XOFF 字符標(biāo)志 */
/******************************************************************************/
/* putbuf: 向SBUF 或發(fā)送緩沖區(qū)寫入字符函數(shù) */
/******************************************************************************/
putbuf (char c) {
if (!sendfull) { /* 僅當(dāng)緩沖區(qū)未滿時發(fā)送 */
if (!sendactive && !sendstop) { /* 如果發(fā)送器未處于活動態(tài):*/
sendactive = 1; /* 直接發(fā)送第一個字符 */
SBUF = c; /* 到SBUF,啟動發(fā)送 */
}
else { /* 否則: */
outbuf[oend++ & (OLEN-1)] = c; /* 向發(fā)送緩沖區(qū)傳送字符 */
if (((oend ^ ostart) & (OLEN-1)) == 0) sendfull = 1;
} /* 置位緩沖區(qū)滿標(biāo)志 */
}
}
/******************************************************************************/
/* putchar: 中斷控制器的putchar 函數(shù) */
/******************************************************************************/
char putchar (char c) {
if (c == '\n') { /* 擴展一行新字符: */
while (sendfull) { /* 等待發(fā)送緩沖區(qū)空 */
otask = os_running_task_id (); /* 置位輸出任務(wù)號 */
os_wait (K_SIG, 0, 0); /* RTX-51 調(diào)用: 等待信號 */
otask = 0xff; /* 清零輸出任務(wù)號 */
}
putbuf (0x0D); /* 在換行符LF之前發(fā)送回車符CR */
}
while (sendfull) { /* 等待發(fā)送緩沖區(qū)空 */
otask = os_running_task_id (); /* 置位輸出任務(wù)號 */
os_wait (K_SIG, 0, 0); /* RTX-51 調(diào)用: 等待信號 */
otask = 0xff; /* 清零輸出任務(wù)號 */
}
putbuf (c); /* 發(fā)送字符 */
return (c); /* 返回字符 */
}
/******************************************************************************/
/* _getkey: 中斷控制器函數(shù) _getkey */
/******************************************************************************/
char _getkey (void) {
while (iend == istart) {
itask = os_running_task_id (); /* 置位輸入任務(wù)號 */
os_wait (K_SIG, 0, 0); /* RTX-51 調(diào)用: 等待信號 */
itask = 0xff; /* 清零輸入任務(wù)號 */
}
return (inbuf[istart++ & (ILEN-1)]);
}
/******************************************************************************/
/* serial: 串行接收/發(fā)送中斷 */
/******************************************************************************/
serial () interrupt 4 using 2 { /* 中斷使用工作寄存器2區(qū) */
unsigned char c;
bit start_trans = 0;
if (RI) { /* 如果是接收中斷 */
c = SBUF; /* 讀字符 */
RI = 0; /* 清零中斷請求標(biāo)志 */
switch (c) { /* 字符處理 */
case CTRL_S:
sendstop = 1; /* 如果是CTRL_S 則停止發(fā)送 */
break;
case CTRL_Q:
start_trans = sendstop; /* 如果是CTRL_Q 則開始發(fā)送 */
sendstop = 0;
break;
default: /* 將其它字符讀入輸入緩沖區(qū) */
if (istart + ILEN != iend) {
inbuf[iend++ & (ILEN-1)] = c;
}
/* 如果是任務(wù)等待:信號就緒 */
if (itask != 0xFF) isr_send_signal (itask);
break;
}
}
if (TI || start_trans) { /* 如果是發(fā)送中斷 */
TI = 0; /* 清零中斷請求標(biāo)志 */
if (ostart != oend) { /* 如果輸入緩沖區(qū)接收到字符 */
if (!sendstop) { /* 且不是CTRL_S */
SBUF = outbuf[ostart++ & (OLEN-1)]; /* 發(fā)送字符 */
sendfull = 0; /* 清零sendfull 標(biāo)志 */
/* 如果是任務(wù)等待:信號就緒 */
if (otask != 0xFF) isr_send_signal (otask);
}
}
else sendactive = 0; /* 如果全部發(fā)送完則清零sendactive */
}
}
/******************************************************************************/
/* serial_init: 串行口初始化 */
/******************************************************************************/
serial_init () {
SCON = 0x50; /* 串行口方式1,8位 UART, 允許接收 */
TMOD |= 0x20; /* 定時器方式2,8位自動重裝 */
TH1 = 0xf3; /* 2400 波特率 */
TR1 = 1; /* 啟動定時器1 */
ES = 1; /* 允許串行口中斷 */
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -