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