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