C8051F350通信没有用到循环,只发送两个数据但是在串口调试助手中却却一直在不停地发数据,而且数据还是错的,波特率是对的
#include
#include
//----------------------------------------------------------------------
#define SYSTEMCLOCK 24500000 //系统时钟
#define BAUDRATE 9600 // 波特率
//-----------------------------------------------------------------------------
// 函数声明
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void UART0_Init (void);
void PORT_Init (void);
void Timer2_Init (int);
void UART_TX(unsigned char);
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
#define UART_BUFFERSIZE 64
unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char UART_Buffer_Size = 0;
unsigned char UART_Input_First = 0;
unsigned char UART_Output_First = 0;
unsigned char TX_Ready =1;
static char Byte;
//-----------------------------------------------------------------------------
// 主函数
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40; // 禁止看门狗定时器
PORT_Init(); // I/O初始化
SYSCLK_Init (); // 振荡器初始化
UART0_Init();
EA = 1; //开全局中断
UART_TX(0x56);
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
UART_TX(0x76);
}
// Configure the Crossbar and GPIO ports.
//
// P0.4 digital push-pull UART TX
// P0.5 digital open-drain UART RX
//
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
P0MDOUT |= 0x10; // P0.4 - TX 推挽式输出,P0.5 - RX 开漏
XBR0 = 0x01; // RX,TX引脚使能
XBR1 = 0x40; // 交叉开关使能
}
//-----------------------------------------------------------------------------
//系统时钟初始化
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // 系统内部时钟24.5M不分频
RSTSRC = 0x04; // 使能丢失时钟检测器,检测到时钟丢失时出发复位
}
void UART0_Init (void)
{
SCON0 = 0x10; // 波特率可编程的8位UARt
// 停止位逻辑电平被忽略
// 接收使能
// 第九位0
// 请RI0和TI0中断标志
TH1 = -(SYSTEMCLOCK/BAUDRATE/2/12); // TH1=0x96 Baud rate=9600bps
CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 系统时钟12分频
TL1 = TH1;
TMOD &= ~0xf0; //定时器1,8位自动装初值
TMOD |= 0x20;
TR1 = 1; // 启动定时器
TX_Ready = 1; //标志位表明UARt能够传输
IP |= 0x10; // 串口处于高优先级
}
void UART_TX(unsigned char TX_DATA)
{
SBUF0 = TX_DATA;
while(!TI0);
TI0 = 0;
}
1. UART_TX中断子程序写的貌似不对吧,也不需要函数声明
void UART0_Interrupt (void) interrupt 4
{
if (TI0 == 1)
{
TI0 = 0;
SBUF0 = TX_DATA;
}
}
2. 定义全局变量unsigned char TX_DATA
3. 主程序中发送数据不是采用调用子程序的方法UART_TX(0x56);
可以改成
TX_DATA = 0x56; //赋值
TI0 = 1; //开串口中断