DS5250串口1,2的使用

头文件:
.#ifndef UART1_H
.#define UART1_H

.#include “main.h”

.#define SCON_1 SCON1
.#define SMD_1 WDCON
.#define PR_1 TH1
.#define SBUF_1 SBUF1

.#define SEI_1 IE
.#define SEI_1_BIT 0X40

.#define SCON_0 SCON0
.#define SMD_0 PCON
.#define PRL_0 TL2
.#define PRH_0 TH2
.#define SBUF_0 SBUF0

.#define SEI_0 IE
.#define SEI_0_BIT 0X10

// SMOD register bits
.#define SERIAL_SMOD 0x80

// SCON register bits
//SCON的位
.#define SERIAL_RI 0x01
.#define SERIAL_TI 0x02
.#define SERIAL_RB8 0x04
.#define SERIAL_TB8 0x08
.#define SERIAL_REN 0x10
.#define SERIAL_SM2 0x20
.#define SERIAL_SM1 0x40
.#define SERIAL_SM0 0x80

//串口号
enum
{
SERIAL0=0,
SERIAL1,
SERIAL
};
//波特率
enum
{
BAUD_RATE_1200=0 ,
BAUD_RATE_2400 ,
BAUD_RATE_9600 ,
BAUD_RATE_19200 ,
BAUD_RATE_38400 ,
BAUD_RATE_57600 ,
BAUD_RATE_115200 ,
NUM_BAUD_RATES
};

unsigned char UART_send_byte(unsigned char serialId,unsigned char dat);
void Uart12_Init(char uartnum);
// UART_Init(SERIAL1, BAUD_RATE_9600); //串口1 P12,P13
// UART_Init(SERIAL0, BAUD_RATE_115200); //串口0 P30,P31
.#endif

C文件
#include “uart1.h”
#include “reg5240.h”
//#include “cmd.h”
//#include “des.h”

//#define DEBUG_UART SERIAL1 //Debug的串口号
//uchar ENABLE_DEBUG = 1; //Debug的使能

#define Usart0_en 1
#define Usart1_en 1

#define uchar unsigned char

#define FOSC 22118400L //System frequency
#define BAUD 115200 //UART baudrate

//volatile uchar cmd_buf_encry[USART_CMD_LEN]; //加解密暂存数组
//volatile UART_Typedef UART0; //串口1结构体
//volatile UART_Typedef UART1; //串口2结构体

/*
* system clk is 22.1184MHz
* Reload = 256 - (SYSCLK*2^SMOD)/(384*Baud rate)
*/
unsigned char UART1_baud[NUM_BAUD_RATES]=
{
0XA0, /* 1200 */
0XD0, /* 2400 */
0XF4, /* 9600 */
0XFA, /* 19200 */
0XFD, /* 38400 */
0XFE, /* 57600 */
0XFF, /* 115200 */
};

/*
* system clk is 22.1184MHz
* RCAP2H,RCAP2L = 65536 - (SYSCLK/(32*Baud rate))
*/
unsigned int UART0_baud[NUM_BAUD_RATES]=
{
0XFDC0, /* 1200 */
0XFEE0, /* 2400 */
0XFFB8, /* 9600 */
0XFFDC, /* 19200 */
0XFFEE, /* 38400 */
0XFFF4, /* 57600 */
0XFFFD, /* 115200 */
};

//********************************
//函数功能:串口初始化
//入口参数:串口号 波特率
//返回值 :无
//********************************
unsigned char UART_Init(unsigned char serialId, unsigned char br)
{
unsigned char pr;
unsigned int pr0;
if( br >= NUM_BAUD_RATES )
br = BAUD_RATE_19200;

if( serialId == SERIAL1 )
{
    #if Usart1_en
    pr = UART1_baud[br];
    SEI_1  &= (~SEI_1_BIT);            //设置IE &= (~0X40);  //关闭中断  ET1 = 0; 

    SMD_1  |= SERIAL_SMOD;          //WDCON 波特率倍频 WDCON =0x80

    SCON_1 &= 0X0F;             //清除高四位              //SCON1:串口1控制寄存器
    SCON_1  = SERIAL_SM1 | SERIAL_REN;          //SCON1 模式1  
    SCON_1 &= (~SERIAL_TI);            //清除接收标志                                    SCON1=0x50
    /*
     *  Time1,mode 2 (8-bit reload)
     */
    TMOD &= 0x0F;       //清除定时器1模式位
    TMOD |= 0x20;
    /**
     *  enable Timer1 to run and for uart's baud rate
     */

// CKCON |= 0x10; //定时器1T模式

    TCON |= 0x40;
    ET1 = 0;                                        //禁止定时器1中断
    TL1 = pr;
    TH1 = pr;                                       //自动重装载值
    SEI_1  |= SEI_1_BIT;                //设置IE |= 0X40; 开启中断    

    #endif
}
else
{  //正常

// SEI_0 &= (~SEI_0_BIT);

// T2CON |= 0X30;
// RCAP2L = (UART0_baud[br] >> 0) & 0X00FF;
// RCAP2H = (UART0_baud[br] >> 8) & 0X00FF;
// TL2 = (UART0_baud[br] >> 0) & 0X00FF;
// TH2 = (UART0_baud[br] >> 8) & 0X00FF;
//
// SCON_0 = SERIAL_SM1 | SERIAL_REN;
// SEI_0 |= SEI_0_BIT;
// SCON_0 &= (~SERIAL_TI);
// TR2 = 1;

    #if Usart0_en
    pr0 = 0xFFFF - ( 576 / 96 ) + 1;  //12500

    SEI_0  &= (~SEI_0_BIT);             //IE   &=(~0x10)
    T2CON  |= 0X30;                       //T2CON |= 0x30; 

    RCAP2L   = (pr0 >> 0) & 0X00FF;     //RCAP2L
    RCAP2H   = (pr0 >> 8) & 0X00FF;     //RCAP2H
    TL2      = (pr0 >> 0) & 0X00FF;     //TL2   
    TH2      = (pr0 >> 8) & 0X00FF;     //TH2   

    SCON_0  = SERIAL_SM1 | SERIAL_REN;  //SCON0 = 0x50;

    SEI_0  |= SEI_0_BIT;                //IE |= 0x10;

    SCON_0 &= (~SERIAL_TI);             //IE &= (~0x02);

    TR2     = 1;                        //TR2

    #endif
}

return 0;

}

void Uart12_Init(char uartnum)
{
static char Lock = 0;
unsigned int pr = 0;

if(Lock == 0)
{
      Lock = 1;  //开机有效一次
        TA=0xAA;
      TA=0x55;      //解锁时序

      DPX  = 0x01;  //DXP置01,表示SRAM区从10000开始
      MXAX = 0x01;
      MXAH = 0x00;
      DPL1 = 0x00;  //置T1不为波特率
   CKCON = 0x00;  //12分频
}

//*****************************************************

if(uartnum == 0)//COM0 //定时器2 //
{
#if 0
pr = 0xFFFF - ( 576 / 96 ) + 1; //12500

    SEI_0  &= (~SEI_0_BIT);             //IE   &=(~0x10)
    T2CON  |= 0X30;                       //T2CON |= 0x30; 

    RCAP2L   = (pr >> 0) & 0X00FF;     //RCAP2L
    RCAP2H   = (pr >> 8) & 0X00FF;     //RCAP2H
    TL2      = (pr >> 0) & 0X00FF;     //TL2   
    TH2      = (pr >> 8) & 0X00FF;     //TH2   

    SCON_0  = SERIAL_SM1 | SERIAL_REN;  //SCON0 = 0x50;

    SEI_0  |= SEI_0_BIT;                //IE |= 0x10;

    SCON_0 &= (~SERIAL_TI);             //IE &= (~0x02);

    TR2     = 1;                        //TR2

#else

    pr = 0xFFFF - ( 576 / 96 ) + 1;  //12500
    SCON0 =0x50;

    PCON  =0x80;   //COM0波特率加倍
    T2CON =0x30;   //T2作为波特率发生器     

    RCAP2L   = (pr >> 0) & 0X00FF;
    RCAP2H   = (pr >> 8) & 0X00FF;
    TL2      = (pr >> 0) & 0X00FF;
    TH2      = (pr >> 8) & 0X00FF;

    TR2  = 1 ;    //定时器2启动
    #endif      

}else{//COM1  //定时器1
    #if 0

    SEI_1  &= (~SEI_1_BIT);            //设置IE &= (~0X40);  //关闭中断  ET1 = 0; 

    SMD_1  |= SERIAL_SMOD;          //WDCON 波特率倍频 WDCON =0x80

    SCON_1 &= 0X0F;             //清除高四位              //SCON1:串口1控制寄存器
    SCON_1  = SERIAL_SM1 | SERIAL_REN;          //SCON1 模式1  
    SCON_1 &= (~SERIAL_TI);            //清除接收标志                                    SCON1=0x50
    /*
     *  Time1,mode 2 (8-bit reload)
     */
    TMOD &= 0x0F;       //清除定时器1模式位
    TMOD |= 0x20;
    /**
     *  enable Timer1 to run and for uart's baud rate
     */
    CKCON |= 0x10;   //定时器1T模式

    TCON |= 0x40;
    ET1 = 0;                                        //禁止定时器1中断
    TL1 = 0xF4;
    TH1 = 0xF4;                                     //自动重装载值
    SEI_1  |= SEI_1_BIT;                //设置IE |= 0X40; 开启中断    

    #else
    IE &= (~0X40);  //关闭中断  ET1 = 0; 

    TMOD |=0x20;   //8位自动重载
    SCON1 = 0x50;

// CKCON |=0x10;
TCON |=0x40;
PS1 = 1; //串口1中断优先级提升
WDCON = 0x80; //COM1波特率加倍

// ET1 = 0 ; //禁止定时1中断
TL1 = 0xF4;
TH1 = 0xF4;

    IE |= 0x40;     //开启中断      ES1 = 1;        //串口1中断允许
    #endif      
} 

}

//********************************
//函数功能:发送一个字节到串口
//入口参数:串口号 发送的数据
//返回值 :
//********************************
unsigned char UART_send_byte(unsigned char serialId,unsigned char dat)
{
if( serialId == SERIAL1 )
{
//SCON_1 &= (~SERIAL_TI);
#if Usart1_en
SBUF_1 = dat;

    while((SCON_1&SERIAL_TI) == 0);

    SCON_1 &= (~SERIAL_TI);    
    #endif
}
else
{  //正常
    //SCON_0 &= (~SERIAL_TI);  
    #if Usart0_en
    SBUF_0 = dat;

    while((SCON_0&SERIAL_TI) == 0);

    SCON_0 &= (~SERIAL_TI);    
    #endif
}

return 0;

}

//中断0 //中断号
#if Usart0_en
void UART0_isr(void) interrupt 4
{
uchar temp = 0;

if(SCON_0 & SERIAL_RI)
{
    temp = SBUF_0;
    SCON_0 &= (~SERIAL_RI);        
}

}
#endif
#if Usart1_en
void UART1_isr(void) interrupt 7
{
uchar temp = 0;

if(SCON_1 & SERIAL_RI)
{
    temp = SBUF_1;
    SCON_1 &= (~SERIAL_RI);
}

}
#endif

猜你喜欢

转载自blog.csdn.net/wekic/article/details/80178075