N76E003串口1、串口0,中断程序(模式0)

关于串口1,串口0中断的相关寄存器配置请看N76E003双串口中断配置、问题及解决方法
完整代码已在本文中贴出,如出现无法编译的问题,可以考虑下载本文的工程文件
工程文件在此下载

这里写图片描述
这里写图片描述
串口1控制寄存器与串口0命名上后置”_1”再次不再赘述,官方技术手册表述如下

N76E003包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口。由于两个串口的控制位是
一样的,为了区分两个串口控制位,串口1的控制位以“ _1”结尾(例如SCON_1)

此外,请注意debug与串口1不可同时使用

N76E003 UART1 pin also occupied by debug pin,
please remove Nu-link or not in debug mode to test UART1 function.
External UART1 connect also disturb debug download

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int


uchar IRCOM[7];
uchar ZTJ=0,flag=0,count=0;
uchar UART0_RX_BUF[2],UART1_RX_BUF[2];//串口0,串口1数据接收缓冲区
uchar UART0_RX_STA=0,UART1_RX_STA=0;//串口0,串口1接收计数器
bit riflag;



void delay(uchar x)
{
    uchar y;
    while(x--)
    {
          for(y = 0; y<158; y++)
            {
             _nop_();

            }
    }
}

/**********************************************************/
//等待延时程序,注意如果使用官方延时程序,可能会与其他中断程序冲突
void delay1(int ms)
{
 unsigned char y;
  while(ms--)
 {
  for(y = 0; y<250; y++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}

/******************************************************************/
int main()
{
     Set_All_GPIO_Quasi_Mode;


 //——————串口0,串口1引脚初始化-------------- 
    set_P02;
    set_P06;
    set_P07;     
    set_P16;             

//----------串口1、串口0配置----------------   
     IE = 0x90;//允许总中断中断,串口0中断
     set_ES_1;//开启串口1中断使能
     InitialUART0_Timer1(9600);
     InitialUART1_Timer3(9600); 
//在不配置SM1,SM2寄存器的情况下,默认工作在模式0(半双工)   
//---------输入你自己的代码-------------------
        while(1)
        {        
        }
} 


/******************中断服务程序*****************************/

/****************串口0中断服务程序***************************/
void Uart0_test() interrupt 4
{
    if(RI)//串口0接收中断标志(有数据时,硬件置1)
    {
            RI=0;//软件置0
            UART0_RX_BUF[UART0_RX_STA]=SBUF ;//从SBUF缓存中读取接收到的数据
            UART0_RX_STA++ ;                //计算接收长度
//          if(){}//进行数据校验,通过RX_BUF&RX_STA
            UART0_RX_STA=0;//清空接收计数器
//          Send_Data_To_UART0();//发送函数,该函数自动对TI清空(TI寄存器在发送完成后硬件置位)
    }
}

/****************串口1中断服务程序***************************/
void Uart1_test() interrupt 15
{
    if(RI_1)//进中断
    {
            RI_1=0;
            UART1_RX_BUF[UART1_RX_STA]=SBUF ;//从SBUF缓存中读取接收到的数据
            UART1_RX_STA++ ;                //计算接收长度
//          if(){}//进行数据校验,通过RX_BUF&RX_STA
            UART1_RX_STA=0;//清空接收计数器
//          Send_Data_To_UART1();//发送函数,该函数自动对TI_1清空
    }
}

猜你喜欢

转载自blog.csdn.net/u014798590/article/details/82692920
今日推荐