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

📄 c8051f040_uart1.c

📁 实现了C8051F040串口的收发 相当实用
💻 C
字号:
下面的范例程序你可以参考一下

/******************************************************************************
UART0用定时器2和UART1用定时器1作为波特率发生器,

上位机发送数到UART0或UART1,能够接收到
*******************************************************************************/
/******************************************************************************/
#include <c8051f120.h>                 // SFR declarations
#include <stdio.h>
#include <INTRINS.H>

//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------

sfr16 DP       = 0x82;                 // data pointer
sfr16 TMR3RL   = 0x92;                 // Timer3 reload value
sfr16 TMR3     = 0x94;                 // Timer3 counter
sfr16 ADC0     = 0xbe;                 // ADC0 data
sfr16 ADC0GT   = 0xc4;                 // ADC0 greater than window
sfr16 ADC0LT   = 0xc6;                 // ADC0 less than window
sfr16 RCAP2    = 0xca;                 // Timer2 capture/reload
sfr16 T2       = 0xcc;                 // Timer2
sfr16 RCAP4    = 0xe4;                 // Timer4 capture/reload
sfr16 T4       = 0xf4;                 // Timer4


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

unsigned char temp;
unsigned char temp1;
bit ReceiveBit=0;

void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void delay(void);

//void Tuart1 (void);
//-----------------------------------------------------------------------------
/////////main
//-----------------------------------------------------------------------------
void main (void) {

   WDTCN = 0xde;                       // disable watchdog timer
   WDTCN = 0xad;


   SYSCLK_Init ();                     // initialize oscillator
   PORT_Init ();                       // initialize crossbar and GPIO
   UART0_Init ();
   EA=1;
   while(1)
   { SFRPAGE   =0x00;
     while(RI0==1){
      
      RI0 = 0;      
      temp = SBUF0;
     
          }
//--------------------
 
      SFRPAGE   =0x01;
       ReceiveBit=SCON1&0X1;
      while( ReceiveBit== 1)
   {
      
   SCON1 &=0XFE;
      
      temp1 = SBUF1;

      ReceiveBit= 0;
      
     }
     
   EA=1; }


}

//-----------------------------------------------------------------------------
// SYSCLK配置
//-----------------------------------------------------------------------------
// 配置系统时钟使用外部晶振22.1184MHz

void SYSCLK_Init (void)
{
   int i;                              // delay counter
 SFRPAGE   = CONFIG_PAGE;
   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal
   for (i=0; i < 3000; i++) ;           // XTLVLD blanking interval (>1ms)

  while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   CLKSEL    = 0x01;

}

//-----------------------------------------------------------------------------
// PORT配置
//-----------------------------------------------------------------------------
void PORT_Init (void)
{ 
SFRPAGE   = 0x0f;
   XBR0    = 0x04;                     // Enable UART0

   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups
   
   P0MDOUT |= 0x01;                    // enable TX0 as a push-pull output
   P1MDOUT |= 0x01;
   P2MDOUT  = 0xe0;                    // P2口设为推挽方式
   P3MDOUT  = 0xff;                    // P2口设为推挽方式
}

//-----------------------------------------------------------------------------
// UART0配置
//-----------------------------------------------------------------------------
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
void UART0_Init (void)
{ SFRPAGE   = UART1_PAGE;

    SCON1   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
    SFRPAGE   = UART0_PAGE;

    SCON0   = 0x50;
    SSTA0     = 0x05;
                     
   SFRPAGE   = TIMER01_PAGE;
   TR1    = 1;                         // start Timer1
   SFRPAGE   = 0x00;
                     
   PCON  |= 0x90;                      // SMOD00 = 1
   TI0    = 1;  
   SCON0|=0x12;                                    // Indicate TX0 ready
   SFRPAGE   = 0x01;
   SCON1 |= 0x12;                       // Indicate TX1 ready

    SFRPAGE   = TIMER01_PAGE;
    TCON      = 0x40;
    TMOD      = 0x20;// TMOD: timer 1, mode 2, 8-bit reload
    CKCON     = 0x10; // Timer1 uses SYSCLK as time base
    TH1       = 0x40;
    SFRPAGE   = TMR2_PAGE;
    TMR2CN    = 0x04;
    TMR2CF    = 0x0A;
    RCAP2L    = 0xE8;
    RCAP2H    = 0xFF;
    IP        = 0x08;

}

//-----------------------------------------------------------------------------
void delay(void)
{
 int a=1000;
 while(a!=0)
 {

  a--;
 }
 }

⌨️ 快捷键说明

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