?? uart.c
字號(hào):
//#include "ML-330.H"
//#define SYSCLK 24500000
#include <string.h>
#include "c8051F330.h"
//#include "const.h"
#include "uart.h"
//串口讀寫驅(qū)動(dòng)程序
#define SYSCLK 22118400
#define MAX_LEN 128
#define MAX_SEND_LEN 256
volatile bit readFlag0 = 0; //Uart0中斷接收處理標(biāo)志
volatile bit readFlag1 = 0; //Uart1中斷接收處理標(biāo)志
volatile bit sendFlag0 = 0; //Uart0中斷發(fā)送處理標(biāo)志
volatile bit sendFlag1 = 0; //Uart1中斷發(fā)送處理標(biāo)志
volatile unsigned char xdata PRead0 = 0; //uart0接收緩沖讀指針
volatile unsigned char xdata PWrite0 = 0; //uart0接收緩沖寫指針
volatile unsigned char xdata PRead1 = 0; //uart1接收緩沖讀指針
volatile unsigned char xdata PWrite1 = 0; //uart1接收緩沖寫指針
volatile unsigned char xdata PSendRead0 = 0; //uart0發(fā)送緩沖讀指針
volatile unsigned char xdata PSendWrite0 = 0; //uart0發(fā)送緩沖寫指針
volatile unsigned char xdata PSendRead1 = 0; //uart1發(fā)送緩沖讀指針
volatile unsigned char xdata PSendWrite1 = 0; //uart1發(fā)送緩沖寫指針
unsigned char xdata BufData0[MAX_LEN]; //uart0接收緩沖
unsigned char xdata BufSend0[MAX_SEND_LEN]; //uart0發(fā)送緩沖
unsigned char xdata BufData1[MAX_LEN]; //uart1接收緩沖
unsigned char xdata BufSend1[MAX_SEND_LEN]; //uart1發(fā)送緩沖
unsigned char xdata SendCount0 = 0; //uart0發(fā)送字節(jié)數(shù)
unsigned char xdata SendCount1 = 0; //uart0發(fā)送字節(jié)數(shù)
void Uart0_Init(unsigned long BAUDRATE)
{
SCON0 = 0x10;//允許接收
if (SYSCLK/BAUDRATE/2/256 < 1) {
TH1 = 255-(SYSCLK/BAUDRATE);
CKCON &= ~0x0B; // T1M = 1; SCA1:0 = xx
CKCON |= 0x08;
} else if (SYSCLK/BAUDRATE/2/256 < 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x09;
} else if (SYSCLK/BAUDRATE/2/256 < 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10
CKCON |= 0x02;
}
/*TH1 = 63;
CKCON &= ~0x0B;
CKCON |= 0x08;*/
TL1 = TH1;
TMOD &= ~0xf0;
TMOD |= 0x20;
TR1 = 1;
// TI0 = 1;
}
//串口接收函數(shù)
unsigned char UART_Read(const unsigned char ComPort,
unsigned char *Buffer)
{
unsigned char xdata BufferStr[MAX_LEN];
int xdata readCounts = 0; //已經(jīng)讀取的字符個(gè)數(shù),與MAX_LEN比較
unsigned char xdata temp = 0;
unsigned char xdata BufLen = 0;
if ((PRead0!=PWrite0) & (ComPort == 0))
{
temp = PWrite0;
readCounts = (int)temp - (int)PRead0;
if (readCounts > 0)
{
memcpy( BufferStr, BufData0 + PRead0 , readCounts);
PRead0 = temp;
memcpy(Buffer,BufferStr,readCounts);
BufLen = readCounts;
}
else if ( readCounts < 0)
{
memcpy( BufferStr, BufData0 + PRead0 , MAX_LEN-PRead0);
memcpy( BufferStr+MAX_LEN-PRead0, BufData0 , temp);
PRead0 = temp;
memcpy(Buffer,BufferStr,MAX_LEN+readCounts);
BufLen = MAX_LEN+readCounts;
}
readFlag0 = 1;
}
else if ((PRead1!=PWrite1) & (ComPort == 1))
{
temp = PWrite1;
readCounts = (int)temp - (int)PRead1;
memset( BufferStr, 0, MAX_LEN );
if (readCounts > 0)
{
memcpy( BufferStr, BufData1 + PRead1 , readCounts);
PRead1 = temp;
memcpy(Buffer,BufferStr,readCounts);
BufLen = readCounts;
}
else if ( readCounts < 0)
{
memcpy( BufferStr, BufData1 + PRead1 , MAX_LEN-PRead1);
memcpy( BufferStr+MAX_LEN-PRead1, BufData1 , temp);
PRead1 = temp;
memcpy(Buffer,BufferStr,MAX_LEN+readCounts);
BufLen = MAX_LEN+readCounts;
}
readFlag1 = 1;
}
return BufLen;
}
void Send_Char(const unsigned char com,unsigned char ch)
{
switch (com)
{
case 0:
//SFRPAGE = UART0_PAGE;
SBUF0 = ch;
break;
case 1:
//SFRPAGE = UART1_PAGE;
//SBUF1 = ch;
break;
default:
break;
}
}
//串口發(fā)送函數(shù)
void UART_Send(const unsigned char ComPort,
const unsigned char *Data,
const unsigned char DataSize)
{
unsigned int k = 0;
int i;
if ((DataSize > 0)&(DataSize< MAX_SEND_LEN))
{
switch (ComPort)
{
case 0:
//將需要發(fā)送的數(shù)據(jù)放入相應(yīng)的發(fā)送緩沖內(nèi)
for (i=0;i<DataSize;i++)
{
BufSend0[PSendWrite0] = Data[i];
PSendWrite0++;
if (PSendWrite0 == MAX_SEND_LEN)
{
PSendWrite0 = 0;
}
}
//判斷中斷服務(wù)程序是否完成發(fā)送(發(fā)送標(biāo)志位是否為0)
if (sendFlag0 == 0)
{
sendFlag0 = 1; //置發(fā)送標(biāo)志位為1
Send_Char(ComPort,*Data);//調(diào)用發(fā)送字符函數(shù),發(fā)送第一個(gè)字節(jié),觸發(fā)發(fā)送中斷
}
break;
case 1:
//將需要發(fā)送的數(shù)據(jù)放入相應(yīng)的發(fā)送緩沖內(nèi)
for (i=0;i<DataSize;i++)
{
BufSend1[PSendWrite1] = Data[i];
PSendWrite1++;
if (PSendWrite1 == MAX_SEND_LEN)
{
PSendWrite1 = 0;
}
}
//判斷中斷服務(wù)程序是否完成發(fā)送(發(fā)送標(biāo)志位是否為0)
if (sendFlag1 == 0)
{
sendFlag1 = 1; //置發(fā)送標(biāo)志位為1
Send_Char(ComPort,*Data);//調(diào)用發(fā)送字符函數(shù),發(fā)送第一個(gè)字節(jié),觸發(fā)發(fā)送中斷
}
break;
default:
break;
}
}
}
//UART0中斷服務(wù)程序. 接收字符
void UART0_ISR(void) interrupt 4
{
unsigned char rxch;
readFlag0 = 0; //中斷處理標(biāo)志
//SFRPAGE = UART0_PAGE;
if(RI0) //中斷標(biāo)志 RI0=1 數(shù)據(jù)完整接收
{
RI0 = 0; //軟件清零
rxch = SBUF0; //讀緩沖
if(PWrite0==MAX_LEN)
{
PWrite0 = 0;
}
BufData0[PWrite0] = rxch;
PWrite0++;
readFlag0 =1;
}
if (TI0)
{ // handle transmit function
TI0 = 0; // 清除發(fā)送完成標(biāo)志
//將緩沖尾指針加1
PSendRead0++;
if (PSendRead0 == MAX_SEND_LEN)
{
PSendRead0 = 0;
}
if (PSendWrite0!=PSendRead0) //判斷緩沖內(nèi)的首尾指針是否相同
{
SBUF0 = BufSend0[PSendRead0]; //如果不同,發(fā)送尾指針?biāo)诘淖止?jié)
}
else
{
sendFlag0 = 0; //如果相同,置發(fā)送標(biāo)志為0
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -