单片机芯片型号:C8051F120,在调试串口时,遇到问题:
一、用串口转USB,只接RXD和TXD(不接电源线)能正常能发送接收数据,如图1、2接上电源线反而不能接收数据。
二、用RS232转USB,同样不接电源线可以发送和接收数据,但是接收的数据不对,如图3、4。同样接电源线不能接收数据。
以下是例程:
//-----------------------------------------------------------------------------
#include <c8051f120.h>
#include <stdio.h>
#include <intrins.h>
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void UART0_Init (void);
void SYSCLK_Init (void);
void PORT_Init (void);
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define BAUDRATE 9600 // Baud rate of UART in bps
#define SYSCLK 22118400 // SYSCLK frequency in Hz
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void uart_send_byte(unsigned char c);
void main(void){
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
SYSCLK_Init ();
PORT_Init ();
UART0_Init() ; // initialize crossbar and GPIO
while (1);
}
//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
SFRPAGE = CONFIG_PAGE; // 寄存器页配置
XBR0 = 0x04; // RART0: EN
XBR2 = 0x40; // 全局弱上拉使能
P0MDOUT |= 0x01;
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
unsigned int i; // delaynms counter
OSCXCN = 0x67; // start external oscillator with
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
}
//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x50; // SCON: mode 1, 8-bit UART, enable RX
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
PCON |= 0x80; // SMOD = 1
}
|