?? serial.c
字號:
// Serial.c
// 基于中斷的串口驅動及顯示程序
//**********************************************************************************
// 程序特點:
// 1.基于中斷,可并發執行
// 2.參數可配置(收發緩沖區大小,最大字符串長度,TAB鍵移動距離)
//**********************************************************************************
// 使用方法:(此范例自包含,獨立于其他程序。)
// 先配制收發緩沖區大小等可變參數(在serial.h中的宏定義)
// 1.開頭加入#include <reg51.h>語句,一定要有。
// 2.初始化串口 InitSerial();
// 3.初始化串口緩沖區 InitSerialBuffer();
// 4.使用顯示字節,字,長字,字符,字符串,清屏函數。
//
//**********************************************************************************
// 波特率計算公式:
// TH1=256-(2^SMOD/32*Fosc/12*1/Bound)
// 其中:SMOD=0,1;Fosc=晶體或晶振頻率;Bound=波特率
// 幾個經典值
//
//
//**********************************************************************************
//書寫風格:
// 3.多個單詞(2個及以上),每個單詞首字母大寫。(有時變量名第一個單詞首字母小寫)
// 4.采用內縮風格,每次縮進8個空格。
//**********************************************************************************
//建議:
// 你完全可以把該子程序當作函數庫使用,以便減少重復勞動,提高代碼質量。
//**********************************************************************************
#include "config.h"
uint8 SerialOutData[MAX_OUT_SIZE]; //收發緩沖區實體
uint8 SerialInData[MAX_IN_SIZE];
uint8 InRear, InFront, OutRear, OutFront; //收發緩沖區讀寫指針
uint8 SerialCanSend = 1; //Note:It must be 1.
void SerialInit() reentrant//串口初始化
{
SCON = 0x50;
// PCON |= 0x80; // baud x 2
TMOD = TMOD & 0x0f;
TMOD = TMOD | 0x20;
TH1 = 0xfd; // 晶振22.1184,波特率19200bps
TL1 = 0xfd;
TR1 = 1;
ES = 1;
// EA = 1;
}
// 串口緩沖區初始化
void SerialBufferInit(void) reentrant
{
InRear = 0;
InFront = 0;
OutRear = 0;
OutFront = 0;
}
// 從串口緩沖區讀1字節數據
uint8 SerialGetChar(uint8 *InData) reentrant
{
// ES=0;
if(InRear == InFront) //SerialInData Empty
{
ES=1;
return 0;
}
if(InRear == InFront)
return 0;
*InData = SerialInData[InRear];
InRear = (InRear + 1) % MAX_IN_SIZE;
// ES=1;
return 1;
}
void SerialSendChar (uint8 OutData) reentrant //顯示字符
{
EA = 0;
if (SerialCanSend)
{
SerialCanSend = 0;
SBUF = OutData;
}
else
{
if ((OutFront + 1) % MAX_OUT_SIZE == OutRear) //SerialOutData Full
{
return;
}
OutFront = (OutFront + 1) % MAX_OUT_SIZE;
SerialOutData[OutFront] = OutData;
}
EA = 1;
}
// 顯示字符串
void SerialSendStr(uint8 *Str) reentrant
{
while (*Str)
{
SerialSendChar(*Str);
Str++;
}
}
void SerialClear () reentrant //清屏
{
SerialSendStr("\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個回車換行清屏幕。
}
// 串口中斷處理
void SerialInt(void) reentrant interrupt 4
{
if (TI)
{
TI=0;
if(OutRear == OutFront) //SerialOutData Empty
{
SerialCanSend = 1;
return;
}
else
{
SBUF = SerialOutData[OutRear];
OutRear = (OutRear + 1) % MAX_OUT_SIZE;
}
}
if (RI)
{
RI = 0;
if (InRear == (InFront + 1) % MAX_IN_SIZE) return; //SerialInData Full
InRear = (InFront + 1) % MAX_IN_SIZE;
SerialInData[InFront] = SBUF;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -