⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca_uart_device.c

📁 STC单片机基本程序和模块的介绍和源代码
💻 C
📖 第 1 页 / 共 2 页
字号:


#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 + -