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

📄 main.c

📁 用虚拟串口仿真LPC2138(UART0)
💻 C
字号:
#include "config.h"


/* 定义串口模式设置数据结构 */

typedef struct UartMode

{
     uint8 datab;                          //字长度,5/6/7/8可选
     
     uint8 stopb;                          //停止位,1/2可选
     
     uint8 parity;                         //奇偶校验位,0:无校验;1:奇校验;2:偶校验
     
}UARTMODE;



uint8 rcv_buf[8];                          //UART0数据接收缓冲区

volatile uint8 rcv_new;                    //接收新数据标志


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

** 函数名称:IRQ_UART0()

** 函数功能:串口0接收中断服务程序

** 入口参数:无

** 出口参数:无

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

void __irq IRQ_UART0(void)

{
    uint8 i;
    
    
    if((U0IIR & 0x0F)==0x04)
    
        rcv_new = 1;                        //设置接收到新的数据标志
        
    for(i=0;i<8;i++)                        //FIFO使能时设为8字节长度
    
    {  
       rcv_buf[i] = U0RBR;                  //读取FIFO的数据,并清除中断
       
    }
    
    VICVectAddr = 0x00;                     //中断处理结束
    
}


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

** 函数名称:UART0_SendByte()

** 函数功能:向串口0发送1字节数据

** 入口参数:dat    要发送的数据

** 出口参数:无

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

void UART0_SendByte(uint8 dat)

{
     U0THR = dat;                             //要发送的数据
     
}


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

** 函数名称:UART0_SendBuf()

** 函数功能:向串口0发送8字节数据

** 入口参数:无

** 出口参数:无

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

void UART0_SendBuf(void)

{
     uint8 i;
     
     
   for(i=0;i<8;i++)
   
      UART0_SendByte(rcv_buf[i]);
      
   while((U0LSR & 0x20)==0);                     //等待数据发送完毕
   
}


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

** 函数名称:UART0_Init()

** 函数功能:串口初始化,设置工作模式和波特率

** 入口参数:baud     波特率

**           set      模式设置(UARTMODE)数据结构)

** 出口参数:1为初始化成功,0为失败

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

int8 UART0_Init(uint32 baud,UARTMODE set)

{
    uint32 bak;
    
    
    
    /* 参数过滤 */
    
    if((baud==0)||(baud>9600))   return(0);
    
    if((set.datab<5)||(set.datab>8))  return(0);
    
    if((set.stopb==0)||(set.stopb>2)) return(0);
    
    if(set.parity>4)  return(0);
    
    
    /* 设置串口波特率 */
    
    U0LCR = 0x80;                           //DLAB=1
    
    bak = (Fpclk>>4) / baud;
    
    U0DLM = bak>>8;
    
    U0DLL = bak & 0xFF;
    
    /*设置串口模式 */
    
    bak = set.datab - 5;                     //设置字长
    
    if(set.stopb == 2)     bak |= 0x04;      //判断是否为2位停止位
    
    
    if(set.parity != 0)
    
    {
        set.parity = set.parity - 1;
        
        bak |= 0x08;
        
    }
    
    bak |= set.parity<<4;                    //设置奇偶校验
    
    
    U0LCR = bak;
    
    
    return(1);
    
}


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

** 函数名称:main()

** 函数功能:从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示

** 调试说明:需要PC显示终端软件

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

int main(void)

{
   UARTMODE set;
   
   
   set.datab = 8;
   
   set.stopb = 1;
   
   set.parity = 0;
   
   
   
   rcv_new = 0;
   
   
   PINSEL0 = 0x00000005;                        //设置I/O连接到UART0
   
   
   UART0_Init(9600,set);                        //串口初始化
   
   U0FCR = 0x81;                                //使能FIFO,并设置触发点为8字节
   
   U0IER = 0x01;                                //允许RBR中断,即接收中断
   
   
   IRQEnable();                                 //使能IRQ中断
   
   /* 使能UART0中断 */
   
   VICIntSelect = 0x00000000;                   //设置所有通道为IQR中断
   
   VICVectCntl0 = 0x20|0x06;                    //UART0分配到IRQ slot0,即最高优先级
   
   VICVectAddr0 = (uint32)IRQ_UART0;            //设置UART0向量地址
   
   VICIntEnable = 1<<0x06;                      //使能UART0中断
   
   
   while(1)
   
   {
       if(rcv_new == 1)                         //如果有新数据
       
       {
          rcv_new = 0;                         //清除标志,以接收新数据
          
          UART0_SendBuf();
          
       }
       
   }
   
   return 0;
   
}



⌨️ 快捷键说明

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