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

📄 uart.c

📁 基于51平台的串口一扩五芯片GM8125的测试程序
💻 C
字号:
/********************************************************************************
* 文件:uart.c
* 功能:UART0和UART1基本操作程序库
* 作者:宋智宁
* 日期:2005.3.8
* 备注:支持P89C669,中断服务程序由用户来修改
*********************************************************************************/
#include "config.h"

/******************************************************************************
* 名称:Uart_Init()
* 功能:UART初始化子程序
* 入口参数:bit uart_no --选择串口(0或1)
*           unsigned char mode--串口模式
*			unsigned int bd_rate--常用波特率
* 出口参数:无
* 使用全局变量:无
* 说明:(1) CPU:P89C669
* 		(2) 晶振频率:11.0592 MHz
*		(3) 机器周期:0.54 us
*		(4) UART0: 用TIMER1 ; UART1: 用BRG	
*		(5) 注意串口工作方式和中断的开启
******************************************************************************/
void Uart_Init(bit uart_no, unsigned char mode, unsigned int bd_rate)
{
 unsigned int timerval;

 EA = 0; //初始化时关总中断

 if(!uart_no) //uart0
 {
//----Timer1-Init-----------------------------
  TMOD = (TMOD&0x0f)+0x20; //TIMER1,MODE2

  timerval = 0x00 - 57600/bd_rate; //BD_RATE = (fosc/(6*N))/32;
  TR1 = 0; 
  TH1 = (unsigned char)timerval;
  TL1 = (unsigned char)timerval;  
  TR1 = 1;  
//----Uart0-Init-----------------------------
  PCON &= 0xBF;  //SMOD0 = 0;  
  if(mode<=3)
  {    
    S0CON = (mode<<6) | 0x10;  //SERIAL0 MODE=mode ; REN=1; SM2=0
  }

  #if SERIAL_INT_EN==1
    ES0 = 1;  
  #else
    ES0 = 0;
  #endif
 }
 else  //uart1
 {
//----BRG-Init-------------------------------   
  timerval = (57600/bd_rate)*32*6 - 16;   //bd_rate = fosc/(brate+16);
  BRGCON &= 0xFE; //BRGEN = 0;
  BRGR1 = (unsigned char)(timerval>>8);
  BRGR0 = (unsigned char)timerval; 
  BRGCON |= 0x01; //BRGEN = 1;
//----Uart1-Init-----------------------------  
  PCON &= 0x7F;  // SMOD1 = 0;
   if(mode<=3)
  {    
    S1CON = (mode<<6) | 0x10;  //SERIAL1 MODE=mode ; REN=1; SM2=0
  }
   
  #if SERIAL_INT_EN==1
    ES1 = 1;  
  #else
    ES1 = 0;
  #endif
 } 
 EA = 1; //开总中断 (注意串行中断的ISR)
}

/******************************************************************************
* 名称:Uart_Send_Byte()
* 功能:Uart发送 N Byte子程序
* 入口参数:bit uart_no --选择串口(0或1)
*           unsigned char buf[] --发送数据指针
*			unsigned char num --发送字节数
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Send_Byte(bit uart_no, unsigned char buf[], unsigned char num)
{
  unsigned char i; 

  if(!uart_no)  //uart0
  {
    #if SERIAL_INT_EN==1
      ES0 = 0; //关中断
	#endif
	for(i=0; i<num; i++)
    { 
      S0BUF = buf[i];	 //Uart
      while(!TI_0);  //wait for send
      TI_0 = 0;
	}
	#if SERIAL_INT_EN==1
      ES0 = 1; //开中断
	#endif
  }
  else    //uart1
  {
    #if SERIAL_INT_EN==1
      ES1 = 0; //关中断
	#endif
    for(i=0; i<num; i++)
    { 
      S1BUF = buf[i];	 //Uart
      while(!TI_1);  //wait for send
      TI_1 = 0;
	}
    #if SERIAL_INT_EN==1
      ES1 = 1; //开中断
	#endif
  }

}
/******************************************************************************
* 名称:Uart_Send_Str()
* 功能:Uart顺序发送字符串子程序
* 入口参数:bit uart_no --选择串口(0或1)
*           unsigned char *str_dat ----字符串指针
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Send_Str(bit uart_no, unsigned char *str_p)
{
  if(!uart_no)  //uart0
  {	    
    #if SERIAL_INT_EN==1
      ES0 = 0; //关中断
	#endif 
    while((*str_p)!=0)
    {
      S0BUF = (*str_p++);	 //uart0
      while(!TI_0);  //wait for send
      TI_0 = 0;
    }
	#if SERIAL_INT_EN==1
      ES0 = 1; //开中断
	#endif
  }
  else    //uart1
  {
    #if SERIAL_INT_EN==1
      ES1 = 0; //关中断
	#endif
    while((*str_p)!=0)
    {
      S1BUF = (*str_p++);	 //uart1
      while(!TI_1);  //wait for send
      TI_1 = 0;
    }    
	#if SERIAL_INT_EN==1
      ES1 = 1; //开中断
	#endif 
  }
}
/******************************************************************************
* 名称:Uart_Rev_Byte()
* 功能:Uart等待接收 N Byte中断子程序
* 入口参数:bit uart_no --选择串口(0或1)
*           unsigned char buf[] --接收缓冲区
*			unsigned char num --接收字节数
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Rev_Byte(bit uart_no, unsigned char buf[], unsigned char num)
{
  unsigned char i;
    
  if(!uart_no)  //uart0
  {
    #if SERIAL_INT_EN==1
      ES0 = 0; //关中断
	#endif 
	for(i=0; i<num; i++)
    { 
      while(!RI_0);  //uart0
      buf[i] = S0BUF;   //receive data
      RI_0 = 0;
    }
	#if SERIAL_INT_EN==1
      ES0 = 1; //开中断
	#endif 
  }
  else    //uart1
  {
    #if SERIAL_INT_EN==1
      ES1 = 0; //关中断
	#endif 
	for(i=0; i<num; i++)
    { 
      while(!RI_1);  //uart1
      buf[i] = S1BUF;   //receive data
      RI_1 = 0; 
	}
	#if SERIAL_INT_EN==1
      ES1 = 1; //开中断
	#endif 
  }
}


#if SERIAL_INT_EN==1

/******************************************************************************
* 名称:ISR_Uart0_Rev()
* 功能:Uart0接收数据中断服务程序
* 入口参数:无
* 出口参数:无
* 使用全局变量:unsigned char buf[]--接收缓冲区
* 说明:本函数由用户根据需要修改
******************************************************************************/
void ISR_Uart0_Rev(void) interrupt 4
{
  //GM8125_Byte_Rev(); //GM8125数据接收子程序(供中断服务程序调用)
}

/******************************************************************************
* 名称:ISR_Uart1_Rev()
* 功能:Uart1接收数据中断服务程序
* 入口参数:无
* 出口参数:无
* 使用全局变量:unsigned char buf[]--接收缓冲区
* 说明:本函数由用户根据需要修改
******************************************************************************/
void ISR_Uart1_Rev(void) interrupt 10
{
  if(TI_1) //发送中断
  {
    TI_1 = 0;
	return; 
  }
  if(RI_1) //接收中断
  {
    RI_1 = 0;
    GM8125_Byte_Rev(S1BUF); //GM8125数据接收处理子程序(供中断服务程序调用)
  }
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -