2022-07-23 18:08:23 +08:00

197 lines
5.5 KiB
C

/*
* UART1.c
*
* Created on: 2022年03月15日
* Author: User
*/
#include <main.h>
#ifdef MYDEBUG
uint8_t Tx3_read; //发送读指针
uint8_t Rx3_write; //接收写指针
uint8_t idata buf3[RX_Lenth]; //接收缓冲
// uint8_t idata buftest[2] = {1, 2};
uint16_t RxTimeOut;
bit B_RxOk; //接收结束标志
//===================== 模拟串口相关===========================
// #define P_RX3 P30; //定义模拟串口接收IO
// #define P_TX3 P31; //定义模拟串口发送IO
sbit P_RX3 = P3 ^ 0; //定义模拟串口接收IO
sbit P_TX3 = P3 ^ 1; //定义模拟串口发送IO
uint8_t Tx3_DAT; // 发送移位变量, 用户不可见
uint8_t Rx3_DAT; // 接收移位变量, 用户不可见
uint8_t Tx3_BitCnt; // 发送数据的位计数器, 用户不可见
uint8_t Rx3_BitCnt; // 接收数据的位计数器, 用户不可见
uint8_t Rx3_BUF; // 接收到的字节, 用户读取
uint8_t Tx3_BUF; // 要发送的字节, 用户写入
bit Rx3_Ring; // 正在接收标志, 低层程序使用, 用户程序不可见
bit Tx3_Ting; // 正在发送标志, 用户置1请求发送, 底层发送完成清0
bit RX3_End; // 接收到一个字节, 用户查询 并清0
//=============================================================
void UART_Init(void);
void UART_Rec(void);
void UART_Send(uint8_t *buftest, uint8_t len);
UART_t UART = {
UART_Init,
UART_Rec,
UART_Send
};
void UART_Rec(void)
{
if (RX3_End)
{ // 检测是否收到一个字节
RX3_End = 0; // 清除标志
buf3[Rx3_write] = Rx3_BUF; // 写入缓冲
if (++Rx3_write >= RX_Lenth)
Rx3_write = 0; // 指向下一个位置, 溢出检测
RxTimeOut = 1000; //装载超时时间
}
if (RxTimeOut != 0)
{ // 超时时间是否非0?
if (--RxTimeOut == 0)
{ // (超时时间 - 1) == 0?
B_RxOk = 1;
AUXR &= ~(1 << 4); // Timer2 停止运行
INT_CLKO &= ~(1 << 6); //禁止INT4中断
T2H = (65536 - UART3_BitTime) / 256; //数据位
T2L = (65536 - UART3_BitTime) % 256; //数据位
AUXR |= (1 << 4); // Timer2 开始运行
}
}
if (B_RxOk)
{ // 检测是否接收OK?
if (!Tx3_Ting)
{ // 检测是否发送空闲
if (Tx3_read != Rx3_write)
{ // 检测是否收到过字符
Tx3_BUF = buf3[Tx3_read]; // 从缓冲读一个字符发送
Tx3_Ting = 1; // 设置发送标志
if (++Tx3_read >= RX_Lenth)
Tx3_read = 0; // 指向下一个位置, 溢出检测
}
else
{
B_RxOk = 0;
AUXR &= ~(1 << 4); // Timer2 停止运行
INT_CLKO |= (1 << 6); //允许INT4中断
}
}
}
}
void UART_Send(uint8_t *buftest, uint8_t len)
{
EA = 0; //关闭总中断
INT_CLKO &= ~(1 << 6); //禁止INT4中断
T2H = (65536 - UART3_BitTime) / 256; //数据位
T2L = (65536 - UART3_BitTime) % 256; //数据位
AUXR |= (1 << 4); // Timer2 开始运行
// Tx3_BitCnt = 0;
Tx3_BUF = buftest[Tx3_read]; // 从缓冲读一个字符发送
Tx3_Ting = 1; // 设置发送标志
if (++Tx3_read > len)
{
Tx3_read = 0; // 指向下一个位置, 溢出检测
AUXR &= ~(1 << 4); // Timer2 停止运行
}
EA = 1; //打开总中断
}
// 描述: UART初始化程序.
void UART_Init(void)
{
Tx3_read = 0;
Rx3_write = 0;
Tx3_Ting = 0;
Rx3_Ring = 0;
RX3_End = 0;
Tx3_BitCnt = 0;
RxTimeOut = 0;
B_RxOk = 0;
AUXR &= ~(1 << 4); // Timer2 停止运行
T2H = (65536 - UART3_BitTime) / 256; // 数据位
T2L = (65536 - UART3_BitTime) % 256; // 数据位
INT_CLKO |= (1 << 6); // 允许INT4中断
IE2 |= (1 << 2); // 允许Timer2中断
AUXR |= (1 << 2); // 1T
}
// 描述: Timer2中断处理程序.
void timer2_int(void) interrupt 12
{
if (Rx3_Ring)
{ //已收到起始位
if (--Rx3_BitCnt == 0)
{ //接收完一帧数据
Rx3_Ring = 0; //停止接收
Rx3_BUF = Rx3_DAT; //存储数据到缓冲区
RX3_End = 1;
AUXR &= ~(1 << 4); // Timer2 停止运行
INT_CLKO |= (1 << 6); //允许INT4中断
}
else
{
Rx3_DAT >>= 1; //把接收的单b数据 暂存到 RxShiftReg(接收缓冲)
if (P_RX3)
Rx3_DAT |= 0x80; // shift RX data to RX buffer
}
}
if (Tx3_Ting)
{ // 不发送, 退出
if (Tx3_BitCnt == 0)
{ //发送计数器为0 表明单字节发送还没开始
P_TX3 = 0; //发送开始位
Tx3_DAT = Tx3_BUF; //把缓冲的数据放到发送的buff
Tx3_BitCnt = 9; //发送数据位数 (8数据位+1停止位)
}
else
{ //发送计数器为非0 正在发送数据
if (--Tx3_BitCnt == 0)
{ //发送计数器减为0 表明单字节发送结束
P_TX3 = 1; //送停止位数据
Tx3_Ting = 0; //发送停止
}
else
{
Tx3_DAT >>= 1; //把最低位送到 CY(益处标志位)
P_TX3 = CY; //发送一个bit数据
}
}
}
}
/********************* INT4中断函数 *************************/
void Ext_INT4(void) interrupt 16
{
AUXR &= ~(1 << 4); // Timer2 停止运行
T2H = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) / 256; //起始位 + 半个数据位
T2L = (65536 - (UART3_BitTime / 2 + UART3_BitTime)) % 256; //起始位 + 半个数据位
AUXR |= (1 << 4); // Timer2 开始运行
Rx3_Ring = 1; //标志已收到起始位
Rx3_BitCnt = 9; //初始化接收的数据位数(8个数据位+1个停止位)
INT_CLKO &= ~(1 << 6); //禁止INT4中断
T2H = (65536 - UART3_BitTime) / 256; //数据位
T2L = (65536 - UART3_BitTime) % 256; //数据位
}
#endif
/********************************************************
End Of File
********************************************************/