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

📄 uart51.c

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

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

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

//----Timer1-Init-----------------------------
  TMOD = (TMOD&0x0f)+0x20; //TIMER1,MODE2

  if(bd_rate>28800)
  {
    bd_rate = bd_rate/2;
	PCON |= 0x80;  //SMOD = 1;
  }else
    PCON &= 0x7F;  //SMOD = 0; 
		 
  timerval = 0x00 - 28800/bd_rate; //BD_RATE = (fosc/(12*(256-N)))/32;
  TR1 = 0; 
  TH1 = (unsigned char)timerval;   
  TL1 = (unsigned char)timerval;  
  TR1 = 1;  
//----Uart0-Init-----------------------------    
  if(mode<=3)
  {    
    SCON = (mode<<6) | 0x10;  //SERIAL0 MODE=mode ; REN=1; SM2=0
  }

  #if SERIAL_INT_EN==1
    ES = 1;  
  #else
    ES = 0;
  #endif 
 
  EA = 1; //开总中断 (注意串行中断的ISR)
}

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

  #if SERIAL_INT_EN==1
    ES = 0; //关中断
  #endif

  for(i=0; i<num; i++)
  { 
    SBUF = buf[i];	 //Uart
    while(!TI);  //wait for send
    TI = 0;
  }
  #if SERIAL_INT_EN==1
    ES = 1; //开中断
  #endif	
}

/******************************************************************************
* 名称:Uart_Send_Str()
* 功能:Uart顺序发送字符串子程序
* 入口参数:bit uart_no --选择串口(无效)
*           unsigned char *str_dat ----字符串指针
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Send_Str(bit uart_no, unsigned char *str_p)
{
  unsigned char i;

  #if SERIAL_INT_EN==1
    ES = 0; //关中断
  #endif 

  while((*str_p)!=0)
  {
    SBUF = (*str_p++);	 //uart
    while(!TI);  //wait for send
    TI = 0;
  }
  #if SERIAL_INT_EN==1
    ES = 1; //开中断
  #endif 
}

/******************************************************************************
* 名称:Uart_Rev_Byte()
* 功能:Uart等待接收 N Byte子程序
* 入口参数:bit uart_no --选择串口(无效)
*           unsigned char buf[] --接收缓冲区
*			unsigned char num --接收字节数
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Rev_Byte(bit uart_no, unsigned char buf[], unsigned char num)
{
  unsigned char i;
    
  #if SERIAL_INT_EN==1
    ES = 0; //关中断
  #endif 

  for(i=0; i<num; i++)
  { 
    while(!RI);  //uart0
    buf[i] = SBUF;   //receive data
    RI = 0;
  }
  #if SERIAL_INT_EN==1
    ES = 1; //开中断
  #endif    
}


#if SERIAL_INT_EN==1

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

#endif

⌨️ 快捷键说明

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