C8051F350通信

2019-03-24 18:39发布

C8051F350通信没有用到循环,只发送两个数据但是在串口调试助手中却却一直在不停地发数据,而且数据还是错的,波特率是对的


#include <c8051f350.h>               
#include<intrins.h>
//----------------------------------------------------------------------
#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条回答
zi_wu_shu
2019-03-24 23:53
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;                      //开串口中断

一周热门 更多>