📄 pca_uart_device.c
字号:
#include <reg52.h>
#define BAUD_RATE 70000 // 用户定义的SW_UART波特率
#define SYSCLK 24014772 // 系统时钟取自外部18.432MHz晶体
#define TIMER_INI 0X49 //比较定时器初始化,也就是设置为软件定时器
#define NEG_CAP_INT 0x11 //下降沿捕捉中断
#define DISABLED_MODE 0x00 //禁止下降沿捕捉模式
#define FOSC12_MOD 0x09 //系统时钟的12分频
#define RELOAD 0xf3 //此为串口1,串口波特率重装数值。晶振:24M,12T模式,SMOD=0,
//串口波特率基准采用4800bps.
sbit RXD_PIN = P1^3; //接收数据端
sbit TXD_PIN = P1^4; //发送数据端
/*--------------------模块0的各种状态---------------*/
uint8 idata Rx_state;//接收状态
uint8 idata Rx_buffer;//接收缓存寄存器
uint8 idata Rx_shift;//作为接收使用的移位寄存器
uint8 idata Rx_count;//状态计数器
uint8 idata Rx_data_ready;//数据接收准备
uint8 idata Rx_data_error;//接收数据错误标志
uint16 idata Rx_time; //接收时的临时时间参数
//接收的4种状态
#define S_RX_START_EDGE 0X01//数据边缘状态
#define S_RX_START_BIT 0X02//数据起始接收状态
#define S_RX_DATA_BIT 0x03//数据状态
#define S_RX_STOP_BIT 0x04//停止位
#define RX_FULL_BIT SYSCLK/BAUD_RATE//此为接收一位时的计数次数,可以由用户自定义
#define RX_HALF_BIT (RX_FULL_BIT / 2) //1/2位的时间
/*--------------------模块1的各种状态---------------*/
uint8 idata Tx_state;//发送状态
uint8 idata Tx_buffer;//发送缓存寄存器
uint8 idata Tx_shift;//作为发送使用的移位寄存器
uint8 idata Tx_count;//发送状态计数器
uint8 idata Tx_data_ready;//发送数据准备标志
uint8 idata Tx_timer_en;//发送时间允许位
uint16 idata Tx_time; //接收时的临时时间参数
#define S_TX_START_BIT 0x01//发送起始状态
#define S_TX_DATA_BIT 0x02//发送数据状态
#define S_TX_STOP_BIT 0x03//发送停止位
#define S_TX_STOP_END 0x04//结束位
#define TX_FULL_BIT SYSCLK/BAUD_RATE //此为发送一位时的计数次数,可以由用户自定义,
//为了要和硬件串口(即串口1和串口2)实现发送和接收数据
/*--------------------函数原型---------------*/
void Transmit(void);
uint8 Rx_get_char(void); //接收处理函数
void Tx_put_char(uint8 idata send_data); //发送处理函数
void Rx_enable(void);
void Rx_disable(void);
void Pca_init(void);
void Receive(void);
void Display_LED(void);
void Delays(void);
void Serial_Port_Initial(void); //串口初始化原型
void Send_UART(uint8); //发送数据原型
void UART_Interrupt_Receive(void); //中断接收
void delay(uint16 idata In,uint16 idata Out);
/******************************************************************************
函数:main()
功能:程序开始执行位置
******************************************************************************/
void main(void)
{
Serial_Port_Initial();//初始化串口
Pca_init(); //初始化pca
Rx_disable(); //接收禁止
Rx_enable(); //接收使能
Rx_buffer=0x20;//发送一个字节数据
while(1)
{
if( 0x01 == Rx_get_char())
{
Tx_put_char(Rx_buffer); //发送处理函数
delay(10,5);
}
Delays();
}
}
/******************************************************************************
函数:Display_LED()
功能:LED灯闪烁
说明:LED灯闪烁,作为接收成功数据之后进行的闪烁
******************************************************************************/
void Display_LED(void)//LED灯闪烁
{
uint8 i=0;
for(i=0;i<5;i++)
{
P4_0=1;
Delays();
P4_0=0;
Delays();
}
}
/******************************************************************************
函数:Pca_init()
功能:PCA各个寄存器初始化
说明:进行PCA模块的初始化,这样对于之后的数据发送有一个准备过程,PCA初始为一切状态
******************************************************************************/
void Pca_init(void)
{
Rx_time = 0;//清0时间
Tx_time = 0;
CMOD = FOSC12_MOD;//采用12分频
CCON = 0X00;//清0,为初始状态
CL = 0X00;//计数器清0
CH = 0X00;
Rx_data_ready = 0;
Rx_data_error = 0;
CCAPM0 = DISABLED_MODE; //模块全为0,无此功能
Tx_data_ready = 1;//准备发送数据
Tx_timer_en = 0;//发送时间允许标志位
Tx_state = S_TX_START_BIT;//开始位
CCAPM1 = DISABLED_MODE; //模块全为1,无此功能
// EC = 1;
EA = 1;//开中断
CR = 1;//开始计数
}
/******************************************************************************
函数:Rx_get_char()
功能:接收处理函数
说明:此函数进行的接收处理,0时表示没有收到数据,1时为收到数据
******************************************************************************/
uint8 Rx_get_char(void) //接收处理函数
{
if( Rx_data_ready == 0 )//是否接收到数据
{
return 0; //没有收到数据
}
else
{
Rx_data_ready = 0;
return 1; //收到数据
}
}
/******************************************************************************
函数:Serial_Port_Initial()
功能:串口初始化
说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
采用4800bps传输速率。
******************************************************************************/
void Serial_Port_Initial(void)//串口初始化
{
SCON=0x50; //采用串口方式1。
BRT=RELOAD; //装入重装数
//AUXR 8Eh Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
AUXR|=0x11; //00010001;开启BRTR即启动Serial,开启S1BRS即使用独立波特率发生器作
//为波特率发生器
ES=1; //允许串口中断
EA=1; //开启总中断
}
/******************************************************************************
函数:Send_UART()
功能:串口发送数据
说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
采用4800bps传输速率。
******************************************************************************/
void Send_UART(uint8 i)//发送数据
{
ES=0;
TI=0;
SBUF=i;
while(TI==0);
TI=0;
ES=1;
}
/******************************************************************************
函数:UART_Interrupt_Receive()
功能:串口接收数据
说明:串口采用串口1,方式1来传送接收数据,使用独立波特率发生器作为波特率发生器
采用4800bps传输速率。
******************************************************************************/
void UART_Interrupt_Receive(void) interrupt 4//中断接收
{
uint8 k=0;
if(RI==1)
{
RI=0;
k=SBUF;
Send_UART(k+1);
}
else TI=0;
}
/******************************************************************************
函数:Delays()
功能:软件延时
说明:本函数采用软件延时一定的时间
******************************************************************************/
void Delays(void)//延时
{
unsigned short j=0;
unsigned short g=0;
for(j=0;j<100;j++)
{
for(g=0;g<5000;g++)
{
;
}
}
}
/******************************************************************************
函数:Tx_put_char()
功能:发送处理函数
说明:进行发送前的准备,以进行数据发送,目的就是定时一段时间得到中断,之后进行数据发送
当然也可以强制进入中断,不过有一个过渡过程更为自然。
******************************************************************************/
void Tx_put_char(uint8 idata send_data) //发送处理函数
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -