#include "uart.h"
//UART_BUFFER,实际构造了一个循环队列:
//新收到的字符存放在队首,当需要Scanf需要getkey()时,从队尾读取。
//没有加溢出检测……
#define UART_BUF_SIZE 10
static uchar uart_rx_wp; //buffer对首指针
static uchar uart_rx_rp; //buffer队尾指针
static uchar uart_rx_cnt; //buffer里面的字符数量
static uchar idata uart_rx[UART_BUF_SIZE];
/***************************串口1初始化函数**********************/
/*函数原型:char UART1Init(char smod,char brtx12,unsigned char reload)
/*函数功能:串口1初始化
/*输入参数: smod smod位 0/1
brtx12 brtx12位 0/1
reload reload寄存器数值 0-255
/*输出参数: -1 smod位错误,没有写入0/1
-2 brtx12位错误,没有写入0/1
0
/*备注:串口设置位独立波特率提供波特率,和串口2使用同一个波特率,也可以使用定时器1来提供波特率
(!!!!!!!!!!!!!晶振为11.0592M!!!!!!!!!!!!!!!!!!!!)
// UART1_Init(0,0,232);//初始化串口,设置波特率1200
// UART1_Init(0,1,184);//初始化串口,设置波特率4800 b8
// UART1_Init(0,1,220);//初始化串口,设置波特率9600 dc
// UART1_Init(0,1,232);//初始化串口,设置波特率14400 e8
// UART1_Init(0,1,247);//初始化串口,设置波特率38400 f7
// UART1_Init(0,1,250);//初始化串口,设置波特率57600 fa
UART1_Init(0,1,253);//初始化串口,设置波特率115200 fd-----有乱码!!估计22.1184可能有所改善……
(!!!!!!!!!!!!!晶振为11.0592M!!!!!!!!!!!!!!!!!!!!)
// UART2_Init(0,0,232);//初始化串口,设置波特率1200
// UART2_Init(0,1,184);//初始化串口,设置波特率4800 b8
// UART2_Init(0,1,220);//初始化串口,设置波特率9600 dc
// UART2_Init(0,1,232);//初始化串口,设置波特率14400 e8
// UART2_Init(0,1,247);//初始化串口,设置波特率38400 f7
// UART2_Init(0,1,250);//初始化串口,设置波特率57600 fa
UART2_Init(0,1,253);//初始化串口,设置波特率115200 fd-----有乱码!!估计22.1184可能有所改善……
/********************************************************************/
char UART1_Init(char smod,char brtx12,unsigned char reload)
{
SCON = 0X50;//8位可变波特率,无奇偶位(SM0=0,SM1=1),使能串口接收模块(REN=1)
BRT = reload;//设置独立波特率发生器波特率
if(smod == 1)
{
PCON |= SMOD; //SMOD = 1;//波特率倍速位
}
else if(smod == 0)
{
PCON &= (~SMOD); //SMOD = 0;//取消波特率倍速位
}
else
{
return -1;
}
if(brtx12 == 1)
{
AUXR |= BRTx12;//BRTx12 = 1;1T模式
}
else if(brtx12 == 0)
{
AUXR &= (~BRTx12);//BRTx12 = 0;12T模式
}
else
{
return -2;
}
AUXR |= S1BRS;//串口1设置为使用独立波特率发生器
AUXR |= BRTR;//开启波特率发生器
//设置串口1中断优先级
if (UART1_PRIO & 0x02)
{
IPH |= PSH;
}
else
{
IPH &= ~PSH;
}
if (UART1_PRIO & 0x01)
{
PS = 1;
}
else
{
PS = 0;
}
uart_rx_wp = uart_rx_rp = 0;
uart_rx_cnt = 0;
ES = 1; //开串口中断
EA = 1; //开总中断
return 0;
}
/***************************串口1发送函数**********************/
/*函数原型:void UART1SendHex(char i)
/*函数功能:串口1发送函数
/*函数功能:串口1发送函数,发送单一数据
/*输入参数:数据
/*输出参数:无
/**************************************************************/
void hal_uart_putchar(char i)
{
ES = 0;
TI = 0; //清空发送完中断请求标志位
SBUF = i; //将数据放入寄存器发送
while(TI == 0);//等待发送完毕,发送完毕 TI == 1
TI = 0; //清空发送完中断请求标志位
ES = 1;
}
char hal_uart_getchar(void)
{
uchar ch;
//Wait until a character is available:
while(uart_rx_cnt == 0);
ES = 0;
ch = uart_rx[uart_rx_rp];
uart_rx_rp = (uart_rx_rp + 1) % UART_BUF_SIZE;
uart_rx_cnt--;
ES = 1;
return ch;
}
void UART1InterruptReceive(void) interrupt 4
{
ES=0;//关串行口中断
if(RI)
{
RI=0;//接收中断信号清零,表示将继续接收
if(uart_rx_cnt < UART_BUF_SIZE)
{
uart_rx[uart_rx_wp] = SBUF;
uart_rx_wp = (uart_rx_wp + 1) % UART_BUF_SIZE;
uart_rx_cnt++;
}
}
ES=1;//开串行口中断
}
//重定向
char putchar(char c)
{
hal_uart_putchar(c);
return c;
}
char _getkey () {
return hal_uart_getchar();
}
- 1
- 2
- 3
前往页