📄 c8051f040_uart1.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 + -