單片機芯片型號:C8051F120,在調試串口時,遇到問題:
一、用串口轉USB,只接RXD和TXD(不接電源線)能正常能發送接收數據,如圖1、2接上電源線反而不能接收數據。
二、用RS232轉USB,同樣不接電源線可以發送和接收數據,但是接收的數據不對,如圖3、4。同樣接電源線不能接收數據。
1.jpg (2.89 MB, 下載次數: 45)
下載附件
圖1
2020-10-29 17:19 上傳
1 (1).jpg (61.06 KB, 下載次數: 33)
下載附件
圖2
2020-10-29 17:21 上傳
2.jpg (2.54 MB, 下載次數: 38)
下載附件
圖3
2020-10-29 17:22 上傳
4.png (33.63 KB, 下載次數: 54)
下載附件
圖4
2020-10-29 17:24 上傳
以下是例程:
//-----------------------------------------------------------------------------
#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
}
|