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    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值