📄 5_uart_sst.c
字号:
PCA_TEMP = (CH* 0x100)+CL+TIME_COUNT; // 将PCA计数器的值读到PCA_TEMP
CCAP4L = PCA_TEMP; // 将更新后的匹配值存到
CCAP4H = (PCA_TEMP/ 0x100);// 模块1捕捉比较寄存器
CCAPM4 = TIME_INIT; //0x48; // 允许模块1软件定时器
UART4_TX_STATE++; // 更新TX状态变量
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
UART4_TX = (UART4_SBUF & 0x01); // 将UART4_SBUF的LSB输出到UART4_TX引脚
UART4_SBUF >>= 1; // UART4_SBUF右移一位
UART4_SBUF |= 0x80; // 将一个'1'移入UART4_SBUF的MSB
PCA_TEMP = (CCAP4H * 0x100)+CCAP4L+TIME_COUNT;// 将模块1内容读到PCA_TEMP
CCAP4L = PCA_TEMP; // 用新值恢复CCAP1L
CCAP4H = (PCA_TEMP / 0x100);// 和CCAP1H
UART4_TX_STATE++; // 更新TX状态变量
break;
case 10:
UART4_TI = 1; // 表示发送完成
UART4_TX_STATE = 0; // 复位TX状态
UART4_RX_STATE = 0; // 复位RX状态变量
UART4_TX = 1; // UART4_TX应保持高电平
CCAPM4 = NEG_CAP_INT; // 发送完一个字节,便立即回到接收的状态
UART4_RX_FLAG = 1; //发送完一个字节,便立即回到接收的状态
break;
}
}
}
}
//==================UART1通道的函数======================================
//--------------------------------------------------------------------
// UART1_INIT: UART1初始化子程序
// 初始化UART1
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART1_INIT(void)
{
CMOD = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1
//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
CCON= 0X0;
CL = 0X0; //PCA计数器初设为00
CH = 0X0;
//----------UART1通道变量的初始化------------------------------------------
CCAPM1 = DISABLE_MODE ; //禁止PCA0的操作
CCF1 = 0; // 清除被挂起的PCA模块0和模块1
UART1_RI = 0; // 清除接收完成标志
UART1_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
UART1_TX = 1; // TX线初始化为高电平
UART1_RX_FLAG = 1; //初始置UART1置于接收状态,只有发送时才置为发送状态
UART1_TX_STATE = 0; // UART1 TX状态变量
UART1_RX_STATE = 0; // UART1 RX状态变量
UART1_RX_SHIFT=8; // UART1 RX移位寄存器
CR = 1; // 启动PCA计数器
PPC = 1; //置PCA中断为最高级
IPH |= 0x40;//highest PRI //置PCA中断为最高级
EC = 1; //PCA中断允许
EA = 1; // 全局中断允许
}
//--------------------------------------------------------------------
// UART1_ENABLE: UART1接收允许子程序
// 允许UART1
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART1_RX_ENABLE(void)
{
CCAPM1=NEG_CAP_INT; //置为下降沿捕捉中断方式
UART1_RX_FLAG = 1; //置接收标志
}
//--------------------------------------------------------------------
// UART1_ENABLE: UART1发送允许子程序
// 允许UART1
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART1_SEND_OUT(unsigned char data_send)
{
while (~UART1_TI); //上次的数据已经发送完毕
UART1_TI = 0; //如果发送完成,清除发送标志,UART1_TI这个标志在发送完一个字节后会自动置1
UART1_SBUF =data_send; //将发送的数据放入UART1发送寄存器中
CCAPM1=TIME_INIT; //01001001 //置为软件定时器中断方式
UART1_RX_FLAG = 0; //置发送标志
}
//==================UART2通道的函数======================================
//--------------------------------------------------------------------
// UART2_INIT: UART2初始化子程序
// 初始化UART2
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART2_INIT(void)
{
CMOD = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1
//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
CCON= 0X0;
CL = 0X0; //PCA计数器初设为00
CH = 0X0;
//----------UART2通道变量的初始化------------------------------------------
CCAPM2 = DISABLE_MODE ; //禁止PCA0的操作
CCF2 = 0; // 清除被挂起的PCA模块0和模块1
UART2_RI = 0; // 清除接收完成标志
UART2_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
UART2_TX = 1; // TX线初始化为高电平
UART2_RX_FLAG = 1; //初始置UART2置于接收状态,只有发送时才置为发送状态
UART2_TX_STATE = 0; // UART2 TX状态变量
UART2_RX_STATE = 0; // UART2 RX状态变量
UART2_RX_SHIFT=8; // UART2 RX移位寄存器
CR = 1; // 启动PCA计数器
PPC = 1; //置PCA中断为最高级
IPH |= 0x40;//highest PRI //置PCA中断为最高级
EC = 1; //PCA中断允许
EA = 1; // 全局中断允许
}
//--------------------------------------------------------------------
// UART2_ENABLE: UART2接收允许子程序
// 允许UART2
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART2_RX_ENABLE(void)
{
CCAPM2=NEG_CAP_INT; //置为下降沿捕捉中断方式
UART2_RX_FLAG = 1; //置接收标志
}
//--------------------------------------------------------------------
// UART2_ENABLE: UART2发送允许子程序
// 允许UART2
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART2_SEND_OUT(unsigned char data_send)
{
while (~UART2_TI); //上次的数据已经发送完毕
UART2_TI = 0; //如果发送完成,清除发送标志,UART2_TI这个标志在发送完一个字节后会自动置1
UART2_SBUF =data_send; //将发送的数据放入UART2发送寄存器中
CCAPM2=TIME_INIT; //01001001 //置为软件定时器中断方式
UART2_RX_FLAG = 0; //置发送标志
}
//==================UART3通道的函数======================================
//--------------------------------------------------------------------
// UART3_INIT: UART3初始化子程序
// 初始化UART3
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART3_INIT(void)
{
CMOD = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1
//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
CCON= 0X0;
CL = 0X0; //PCA计数器初设为00
CH = 0X0;
//----------UART3通道变量的初始化------------------------------------------
CCAPM3 = DISABLE_MODE ; //禁止PCA0的操作
CCF3 = 0; // 清除被挂起的PCA模块0和模块1
UART3_RI = 0; // 清除接收完成标志
UART3_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
UART3_TX = 1; // TX线初始化为高电平
UART3_RX_FLAG = 1; //初始置UART3置于接收状态,只有发送时才置为发送状态
UART3_TX_STATE = 0; // UART3 TX状态变量
UART3_RX_STATE = 0; // UART3 RX状态变量
UART3_RX_SHIFT=8; // UART3 RX移位寄存器
CR = 1; // 启动PCA计数器
PPC = 1; //置PCA中断为最高级
IPH |= 0x40;//highest PRI //置PCA中断为最高级
EC = 1; //PCA中断允许
EA = 1; // 全局中断允许
}
//--------------------------------------------------------------------
// UART3_ENABLE: UART3接收允许子程序
// 允许UART3
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART3_RX_ENABLE(void)
{
CCAPM3=NEG_CAP_INT; //置为下降沿捕捉中断方式
UART3_RX_FLAG = 1; //置接收标志
}
//--------------------------------------------------------------------
// UART3_ENABLE: UART3发送允许子程序
// 允许UART3
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART3_SEND_OUT(unsigned char data_send)
{
while (~UART3_TI); //上次的数据已经发送完毕
UART3_TI = 0; //如果发送完成,清除发送标志,UART3_TI这个标志在发送完一个字节后会自动置1
UART3_SBUF =data_send; //将发送的数据放入UART3发送寄存器中
CCAPM3=TIME_INIT; //01001001 //置为软件定时器中断方式
UART3_RX_FLAG = 0; //置发送标志
}
//==================UART4通道的函数======================================
//--------------------------------------------------------------------
// UART4_INIT: UART4初始化子程序
// 初始化UART4
// - 配置PCA: 模块0为负沿捕捉方式模块1为软件定时器方式
// PCA时基= SYSCLK/4禁止PCA中断禁止PCA计数器
// - 清除被挂起的PCA模块0和模块1中断
// - 复位TX和RX状态变量
//
void UART4_INIT(void)
{
CMOD = 0x03 ; //CIDL=0,WDTE=0,CPS1 CPS0=01 Fosc/12 ,/ECF=1
//TBY20060223:改为PCA采用4分频的时钟,以提高波特率为4800*3=11400
CCON= 0X0;
CL = 0X0; //PCA计数器初设为00
CH = 0X0;
//----------UART4通道变量的初始化------------------------------------------
CCAPM4 = DISABLE_MODE ; //禁止PCA0的操作
CCF4 = 0; // 清除被挂起的PCA模块0和模块1
UART4_RI = 0; // 清除接收完成标志
UART4_TI = 1; // 置发送完成标志,初始认为已经没有数据向外发了,这样有利于发前查询上次发送的标志,节省等待时间
UART4_TX = 1; // TX线初始化为高电平
UART4_RX_FLAG = 1; //初始置UART4置于接收状态,只有发送时才置为发送状态
UART4_TX_STATE = 0; // UART4 TX状态变量
UART4_RX_STATE = 0; // UART4 RX状态变量
UART4_RX_SHIFT=8; // UART4 RX移位寄存器
CR = 1; // 启动PCA计数器
PPC = 1; //置PCA中断为最高级
IPH |= 0x40;//highest PRI //置PCA中断为最高级
EC = 1; //PCA中断允许
EA = 1; // 全局中断允许
}
//--------------------------------------------------------------------
// UART4_ENABLE: UART4接收允许子程序
// 允许UART4
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART4_RX_ENABLE(void)
{
CCAPM4=NEG_CAP_INT; //置为下降沿捕捉中断方式
UART4_RX_FLAG = 1; //置接收标志
}
//--------------------------------------------------------------------
// UART4_ENABLE: UART4发送允许子程序
// 允许UART4
// - 允许PCA模块0中断
// - 允许PCA模块1中断
// - 启动PCA计数器
//--------------------------------------------------------------------
void UART4_SEND_OUT(unsigned char data_send)
{
while (~UART4_TI); //上次的数据已经发送完毕
UART4_TI = 0; //如果发送完成,清除发送标志,UART4_TI这个标志在发送完一个字节后会自动置1
UART4_SBUF =data_send; //将发送的数据放入UART4发送寄存器中
CCAPM4=TIME_INIT; //01001001 //置为软件定时器中断方式
UART4_RX_FLAG = 0; //置发送标志
}
// 文件结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -