头文件:
.#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 OK */
0XD0, /* 2400 OK */
0XF4, /* 9600 OK */
0XFA, /* 19200 OK */
0XFD, /* 38400 OK */
0XFE, /* 57600 Err 丢数据 */
0XFF, /* 115200 Err 对数据 */
};
/*
* 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
DS5250串口1,2的使用
最新推荐文章于 2022-06-27 09:40:49 发布