#include "uart.h"
#define RELOAD_COUNT 0xFA //宏定義波特率發生器的載入值 9600
void UART_Init(void)
{
SCON=0X50; //設置為工作方式1
TMOD=0X20; //設置計數器工作方式2
PCON=0X80; //波特率加倍
TH1=RELOAD_COUNT; //計數器初始值設置
TL1=TH1;
ES=1; //關閉接收中斷
EA=1; //打開總中斷
TR1=1; //打開計數器
TI=1; //發送中斷標記位,如果使用printf函數的必須設置
}
void UART_Cmd(FunctionalState ensta)
{
ES=ensta;
}
void UART_SendData(u8 dat)
{
ES=0; //關閉串口中斷
TI=0; //清發送完畢中斷請求標志位
SBUF=dat; //發送
while(TI==0); //等待發送完畢
TI=0; //清發送完畢中斷請求標志位
ES=1; //允許串口中斷
}
void UART_SendString(u8 *pbuf)
{
while(*pbuf!='\0') //遇到空格跳出循環
{
UART_SendData(*pbuf);
delay_10us(5);
pbuf++;
}
}
u8 UART_RX_BUF[UART_REC_LEN]; //接收緩沖,最大UART_REC_LEN個字節.
//接收狀態
//bit15, 接收完成標志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節數目
u16 UART_RX_STA=0; //接收狀態標記
void UART_IRQn() interrupt 4
{
u8 r;
if(RI)
{
RI=0;
r=SBUF;//讀取接收到的數據
if((UART_RX_STA&0x8000)==0)//接收未完成
{
if(UART_RX_STA&0x4000)//接收到了0x0d
{
if(r!=0x0a)UART_RX_STA=0;//接收錯誤,重新開始
else UART_RX_STA|=0x8000; //接收完成了
}
else //還沒收到0X0D
{
if(r==0x0d)UART_RX_STA|=0x4000;
else
{
UART_RX_BUF[UART_RX_STA&0X3FFF]=r ;
UART_RX_STA++;
if(UART_RX_STA>(UART_REC_LEN-1))UART_RX_STA=0;//接收數據錯誤,重新開始接收
}
}
}
}
}
|