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

📄 c8051f340uart1中断接收.c

📁 c8051f340双串口通信源码/
💻 C
字号:
#include <c8051f340.h>
#include <intrins.h>
#include <ABSACC.h>
#define uchar unsigned char
#define uint unsigned int

void UART1_Init (void);
void Port_IO_Init(void);
uchar fshc;
/////////////////////////////////////////////////////////////////////
bit uart0bz;   //串口0标志
bit uart1bz;   //串口1标志
uint uart0js;//串口0接收计数
uint uart1js;//串口1接收计数
uint tim0js;//timer0计数
uint tim2js;//timer2计数
uchar xdata rxbuf1[20];
uchar xdata rxbuf0[20];

////////////////////////////////////////////////////////////////////
sfr16 TMR2RL = 0xCA;                   // Timer2 Reload Register
sfr16 TMR2 = 0xCC;                     // Timer2 Register
#define SYSCLK               12000000  // SYSCLK in Hz (12 MHz internal
#define TIMER_PRESCALER            12  // Based on Timer2 CKCON and TMR2CN
#define LED_TOGGLE_RATE            50  // LED toggle rate in milliseconds
#define TIMER_TICKS_PER_MS  SYSCLK/TIMER_PRESCALER/1000
#define AUX1     TIMER_TICKS_PER_MS*LED_TOGGLE_RATE
#define AUX2     -AUX1
#define TIMER2_RELOAD            AUX2  // Reload value for Timer2
sbit LED=P2^1;
sbit DYKG=P2^3;  //0开 1关
sbit PWG=P2^2;  //1关,0开






/*****************************************************************
*
*初始化计数器0
*****************************************************************/
void timer0_init(void)
{


 CKCON   &=0xf7; //定时器0的计数源选择系统脉冲的12分频
 TMOD  =0X01;  //定时器0,方式1
 TH0  =0X3C;
 TL0  =0XB0;
 IE    |=0x82;
 TCON   |=0X10;  //启动定时器0
 TR0  =1;

}
/*****************************************************************
*
*初始化计数器2
*****************************************************************/
void Timer2_Init(void)
{
   CKCON &= ~0x60;                     // Timer2 uses SYSCLK/12
   TMR2CN &= ~0x01;

   TMR2RL = TIMER2_RELOAD;             // Reload value to be used in Timer2
   TMR2 = TMR2RL;                      // Init the Timer2 register

   TMR2CN = 0x04;                      // Enable Timer2 in auto-reload mode
   ET2 = 1;                            // Timer2 interrupt enabled
}

/****************************************************************
*
*UART0初始化程序
*****************************************************************/
void UART0_Init (void)
{
   SCON0    |= 0x10;    //8位 UART,允许接收
   CKCON    = 0x01;    //系统时钟的/12
   TH1       = 0x64;      //波特率为9600
   TL1       = TH1;
   TMOD      = 0x20;
   TR1       = 1;
 ES0       = 1;
 EA        = 1;
}

/****************************************************************
*
*UART1初始化
*****************************************************************/
void UART1_Init (void)
{
    SBRLL1    =0XCC;
    SBRLH1    =0XFf;        //波特率 9600 内部12M 晶振
    SCON1    =0X30;        //允许接收,准备好接收
    SMOD1    =0X6C;        //8位数据位,无奇偶校验,一位停止位;
    SBCON1    =0X43;        //使能UART1,1分频
    EIE2   =0x02;        //不允许中断
}


void System_Init(void)
{
  EMI0CF    = 0x43;
 PCA0MD    &= ~0x40; //关闭看门狗定时器
 OSCICN    |= 0x03; //内部高频振荡器使能且振荡器按编程频率来运行
 Port_IO_Init();
 timer0_init();
 Timer2_Init();
 UART1_Init ();
 UART0_Init ();

}

/*****************************************************************
*
*端口初始化函数
*****************************************************************/

void Port_IO_Init(void)
{



    P0SKIP    = 0xCF;
    P1SKIP    = 0xFF;
    P2SKIP    = 0xFF;

    XBR2      = 0x01; //uart1 使能 p3.0,p3.1
    XBR0      = 0x01; //P0.4 P0.5接到串口0上uart0
    XBR1      = 0x40; //交叉开关 XBARE 使能
    P2MDOUT=0xff;
}


/*****************************************************************
*功能:定时器0 中断服务函数
*资源:寄存器组2
*****************************************************************/
void T0_Interrupt(void) interrupt 1 using 1  ///2ms
{


 TH0=0X3C;
 TL0=0XB0;
TR0=1;



}
/*****************************************************************
*功能:定时器2 中断服务函数
*资源:寄存器组2
*****************************************************************/


void Timer2_ISR (void) interrupt 5
{



   TF2H = 0;                           // Reset Interrupt
}
/*****************************************************************
*功能:串行接收 uart0中断服务函数
*资源:寄存器组2
*****************************************************************/
void UART0_Interrupt(void) interrupt 4 using 2
{
 if(RI0){
    ES0=0;
    RI0=0;
     rxbuf0[uart0js]=SBUF0;
    uart0js++;

    uart0bz=1;
    ES0=1;




    }



}
/*****************************************************************
*功能:串行接收 uart1中断服务函数
*资源:寄存器组3
*出口:Interput_Char
*****************************************************************/
void UART1_Interrupt(void) interrupt 16 using 3
{
  if (SCON1&0x01){
      SCON1              = 0x30;        //RI1、TI1=0
      EIE2              &= 0xfD;

      uart1js++;
      rxbuf1[uart1js]=SBUF1;
       if (uart1js==10){
         uart1js=0;
        uart1bz=1;

             }

        }


  EIE2|= 0x02;


}

/***************************************************************///UART0单字节发送
void UART0TX(uchar com){

ES0=0;
SBUF0=com;
while(TI0==0);
TI0=0;
ES0=1;


}







void main(void){

System_Init();

uart1bz=0;




while(1){
if(uart0bz){

UART0TX(rxbuf0[0]);
   uart0js=0;
   uart0bz=0;


  }
if (uart1bz){
         uart1js=0;
         uart1bz=0;
         SBUF1 = rxbuf1[9];
 while (!(SCON1 & 0x02));      // wait until UART1 is ready to transmit
         SCON1 &= ~0x02;               // clear TI1 interrupt flag






}



}


}

⌨️ 快捷键说明

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