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

📄 uart1.c

📁 C8051F020双串口使用程序
💻 C
字号:
//-----------------------------------------------------------------------------
// WUART0.c
//-----------------------------------------------------------------------------
//
// 作者: LILU
// DATE: 2008年12月22号
//
// Target: C8051F02x
// Tool chain: KEIL C51
//
// 描述:
//    
//
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------

#include <c8051f020.h>              // SFR声明
#include <intrins.h>

//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------

#define SYSCLK          22118400          // SYSCLK frequency in Hz
#define BAUDRATE        9600              // Baud rate of UART in bps

bit sendbit0;
bit sendbit1;
unsigned char tempr0,tempr1,tempt0,tempt1;

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------

void main (void);
void SYSCLK_Init (void);              
void PORT_Init (void);
void UART0_Init (void);
void UART0_ISR (void);
void UART1_Init (void);
void UART1_ISR (void);
void delay (unsigned int x);//unsigned int m
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------

void main (void) 
{ 
    char bdata i;
    WDTCN = 0xde;                    // 禁止看门狗定时器
    WDTCN = 0xad;
	
    SYSCLK_Init ();
	PORT_Init ();
    UART0_Init ();
	UART1_Init ();
    EA = 1;                          // 允许全局变量
    ES0 = 1;                         // UART0 中断允许
	EIE2 |= 0x40;                     // UART1 中断允许

	tempt0 = 0x03;
	tempt1 = 0x55;

	sendbit0 = 0;
	sendbit1 = 0;


    while(1)
	{ 
	  if(sendbit0)
	  {
	  
	    SBUF0 = tempt0;
		
	  }
	  if(sendbit1)
	  {
	    
        SBUF1 = tempt1;
		 
	  }
	}
	
	_nop_();

}
//-----------------------------------------------------------------------------
// 初始化程序
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//
// 该程序初始化系统时钟,使用22.1184MHz的晶振作为时钟源
//
void SYSCLK_Init (void)
{
   int i;                           // 延时计数器

   OSCXCN = 0x67;                   // 启动外部振荡器使用
                                    // 22.1184MHz 的晶体

   for (i=0; i < 256; i++) ;        // 等待振荡器起振
 
   while (!(OSCXCN & 0x80)) ;       // 等待晶体振荡器稳定

   OSCICN = 0x88;                   // 选择外部振荡器作为系统时钟源并允许时钟丢失检测器
                                    

}



//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置交叉开关和GPIO端口
//
void PORT_Init (void)
{
   XBR0     = 0x07;                 // 允许UART0
   XBR1     = 0x00;
   XBR2     = 0x44;                 // 允许交叉开关和弱上拉,允许UART1,P1.0(TX1),P1.1(RX1)
   P0MDOUT |= 0x01;                 // 使能TX0作为推拉输出
   P1MDOUT |= 0x01;                 // 使能TX1作为推拉输出
}
//-----------------------------------------------------------------------------
// UART0_Init(串口通信扩展用)
//-----------------------------------------------------------------------------
//
// 配置UART0使用Timer1, 波特率为<baudrate>,桢格式为8-N-1.
//
void UART0_Init (void)
{
   SCON0   = 0x50;                  // SCON0: mode 1, 8-bit UART, enable RX
   TMOD    = 0x20;                  // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = 244;  // set Timer1 reload value for baudrate:-(SYSCLK/BAUDRATE/16)
   TL1    = TH1;
   TR1    = 1;                      // start Timer1
//   CKCON |= 0x10;                   // Timer1 uses SYSCLK as time base
   PCON  |= 0x90;                   // SMOD0 = 1,SMOD1 = 1
//   TI0 = 1;                      // Indicate TX0 ready
}

//-----------------------------------------------------------------------------
// UART1_Init(串口通信扩展用)
//-----------------------------------------------------------------------------
//
// 配置UART1使用Timer4, 波特率为<baudrate>,桢格式为8-N-1.
//
void UART1_Init (void)
{
   
//   RCAP4L = 0xB8;                  //set value for baudrater:-(65536-SYSCLK/BAUDRATE)/32,(=1976) 
//   RCAP4H = 0x07;
//   TL4 = 0xB8;
//   TH4 = 0x07;
//   T4CON = 0x34;                   //T4CON: timer4, mode 3,UART1 tx/rx rate;Indicate TR4 ready
   SCON1 = 0x50;                  // SCON1: mode 1, 8-bit UART, enable RX
}



//-----------------------------------------------------------------------------
// UART0_ISR(串口中断0子程序)
//-----------------------------------------------------------------------------
//
void UART0_ISR (void) interrupt 4
{
    if(RI0)// 接收中断
	{
      RI0 = 0;// 清接收标志位
      tempr0 = SBUF0;
	 	 	  
    }
}


//-----------------------------------------------------------------------------
// UART1_ISR(串口中断1子程序)
//-----------------------------------------------------------------------------
//
void UART1_ISR (void) interrupt 20
{
    if(SCON1 == 0x55)// 接收中断
	{
      SCON1 = 0x50;// 清接收志位
      tempr1 = SBUF1; 
	  tempt1 = tempr1;
	  sendbit1 = 1;

    }
}


void delay(unsigned int x)
{
	int i;
	for(i=0;i<=x;i++);
}

⌨️ 快捷键说明

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