📄 serial.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
*
* uCOS_51 for MCS-51
*
* File : serial.c
* By : Jean J. Labrosse
* From : yang yi
* Last modified by : QQ 591881218
*********************************************************************************************************
*/
#ifndef OS_MASTER_FILE
#include "..\ucos_51\ucos-ii\inc\includes.h"
#endif
unsigned char TxBuf[LenTxBuf],RxBuf[LenRxBuf];
unsigned char *inTxBuf,*outTxBuf,*inRxBuf,*outRxBuf;
bit TIflag=1;
void InitSerial(void) REENTRANT // 串口初始化
{
TMOD=TMOD&0x0F;
TMOD=TMOD|0x20; // 模式2(8位自动重装),仅受TR1控制
TH1=0xFD;TL1=0xFD, // CPU=22.1184MHz,波特率=19200,误差=0%
SCON=0x50;PCON=0x00; // 模式2,SM2=0,SMOD=0
TR1=1;
}
void InitSerialBuffer(void) REENTRANT // 串口缓冲区初始化
{
inTxBuf=TxBuf;outTxBuf=TxBuf; //为什么初始化的时候都指向这两个数组的其实地方
inRxBuf=RxBuf;outRxBuf=RxBuf; //为什么初始化的时候都指向这两个数组的其实地方
ES=1; // enable serial--ES
}
void Serial(void) REENTRANT // 串口中断服务子程序,中断在汇编中实现,去掉interrupt 4
{
unsigned char *t;
/* 循环缓冲区 */
if(TI){
TI=0;
if(inTxBuf==outTxBuf) {TIflag=1;return;} // TxBuf Empty inTxBuf到底指向哪里?数组末尾?开始?
SBUF=*outTxBuf;outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf) outTxBuf=TxBuf;
}
if(RI){
RI=0;
t=inRxBuf;t++;
if(t==RxBuf+LenRxBuf) t=RxBuf;
if(t==outRxBuf) return; // RxBuf Full outRxBuf到底指向哪里?指向数组的开始,末尾?
*inRxBuf=SBUF;
inRxBuf=t;
}
}
bit Getch(unsigned char *ch) REENTRANT // 从串口缓冲区读1字节数据
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_ENTER_CRITICAL();/* 进入临界区 */
if(inRxBuf==outRxBuf) {OS_EXIT_CRITICAL();/* 退出临界区 */return 0;} // RxBuf Empty
*ch=*outRxBuf;outRxBuf++;
if(outRxBuf==RxBuf+LenRxBuf) outRxBuf=RxBuf;
OS_EXIT_CRITICAL();/* 退出临界区 */
return 1;
}
void PrintChar(unsigned char ch) REENTRANT // 显示字符
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
unsigned char *t;
OS_ENTER_CRITICAL();/* 进入临界区 */
/*
#pragma ASM
PUSH IE; // 保存中断状态
CLR EA; // 关中断
#pragma ENDASM
*/
t=inTxBuf;t++;
if(t==TxBuf+LenTxBuf) t=TxBuf;
if(t==outTxBuf){
OS_EXIT_CRITICAL();/* 退出临界区 */
/*
#pragma ASM
POP IE; // 恢复之前中断状态
#pragma ENDASM
*/
return;
} // TxBuf Full
*inTxBuf=ch;
inTxBuf=t;
OS_EXIT_CRITICAL();/* 退出临界区 */
/*
#pragma ASM
POP IE; // 恢复之前中断状态
#pragma ENDASM
*/
if(TIflag){
OS_ENTER_CRITICAL();/* 进入临界区 */
TIflag=0;
OS_EXIT_CRITICAL();/* 退出临界区 */
TI=1; // 产生串口发送中断
}
}
void PrintStr(unsigned char *str) REENTRANT // 显示字符串
{
int i;
unsigned char j;
unsigned char ch;
/*
#pragma ASM
PUSH IE;
CLR EA;
#pragma ENDASM
*/
/* 本函数不需要临界保护 */
for(i=0;i<MaxLenStr;i++){
ch=*(str+i);
if(ch=='\0') break;
else if(ch=='\n'){PrintChar(10);PrintChar(13);}
else if(ch=='\t'){
for(j=0;j<TABNum;j++)
PrintChar(' ');
}
else PrintChar(ch);
}
/*
#pragma ASM
POP IE;
#pragma ENDASM
*/
}
void ClrScr(void) REENTRANT // 清屏
{
PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); // 25个回车换行清屏
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -