kamil 发表于 2011-11-17 13:33:03

C8051F020 UART通信问题

最近用C8051F020做一个项目,UART0一直调试不通,发不了也收不到,把程序贴出来,请高手指导

初始化是用Silicon Config2 自动生成的通过IO配置P0=TX0,P1=RX0,P0设为推挽输出。
外部晶振22.1184,波特率用Timer1产生9600的频率,中断允许,UART0优先。

/////////////////////////////////////
//Generated Initialization File//
/////////////////////////////////////

#include "C8051F020.h"

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Reset_Sources_Init()
{
    WDTCN   = 0xDE;
    WDTCN   = 0xAD;
}

void Timer_Init()
{
    CKCON   = 0x10;
    TCON      = 0x40;
    TMOD      = 0x20;
    TH1       = 0xB8;
}

void UART_Init()
{
    SCON0   = 0x50;
}

void Port_IO_Init()
{
    // P0.0-TX0 (UART0), Push-Pull,Digital
    // P0.1-RX0 (UART0), Open-Drain, Digital
    // P0.2-Unassigned,Open-Drain, Digital
    // P0.3-Unassigned,Open-Drain, Digital
    // P0.4-Unassigned,Open-Drain, Digital
    // P0.5-Unassigned,Open-Drain, Digital
    // P0.6-Unassigned,Open-Drain, Digital
    // P0.7-Unassigned,Open-Drain, Digital

    // P1.0-Unassigned,Push-Pull,Digital
    // P1.1-Unassigned,Push-Pull,Digital
    // P1.2-Unassigned,Push-Pull,Digital
    // P1.3-Unassigned,Push-Pull,Digital
    // P1.4-Unassigned,Push-Pull,Digital
    // P1.5-Unassigned,Push-Pull,Digital
    // P1.6-Unassigned,Push-Pull,Digital
    // P1.7-Unassigned,Push-Pull,Digital

    // P2.0-Unassigned,Open-Drain, Digital
    // P2.1-Unassigned,Open-Drain, Digital
    // P2.2-Unassigned,Open-Drain, Digital
    // P2.3-Unassigned,Open-Drain, Digital
    // P2.4-Unassigned,Open-Drain, Digital
    // P2.5-Unassigned,Open-Drain, Digital
    // P2.6-Unassigned,Open-Drain, Digital
    // P2.7-Unassigned,Open-Drain, Digital

    // P3.0-Unassigned,Open-Drain, Digital
    // P3.1-Unassigned,Open-Drain, Digital
    // P3.2-Unassigned,Open-Drain, Digital
    // P3.3-Unassigned,Open-Drain, Digital
    // P3.4-Unassigned,Open-Drain, Digital
    // P3.5-Unassigned,Open-Drain, Digital
    // P3.6-Unassigned,Open-Drain, Digital
    // P3.7-Unassigned,Open-Drain, Digital

    P0MDOUT   = 0x01;
    P1MDOUT   = 0xFF;
    P74OUT    = 0x33;
    XBR0      = 0x04;
    XBR2      = 0x40;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);// Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x08;
}

void Interrupts_Init()
{
    IE      = 0x90;
    IP      = 0x10;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    Reset_Sources_Init();
    Timer_Init();
    UART_Init();
    Port_IO_Init();
    Oscillator_Init();
    Interrupts_Init();
}
///////////////////////////////////////////////////////////////////////////

这里是主程序:
void main()
{
        Init_Device();
        LCD_Init();;
TI0 = 1; //声明TX0就绪,可以发送,这3句去掉加上都一样
TR0 = 1;
SBUF0 = 0x00;
        while(1)
    {
            SBUF0= 48;   
            while (TI0== 0);           //等待发送完毕
                      TI0= 0;   //清发送中断标志TI0
                if (recv)
      {
            ES0=0;
                        EA=0;
                        FillRect(0, 0, 8, 16, 0xFFFF);
            DrawAChar(0, 0, 0x0, &test);
            recv = 0;
            ES0=1;
                        EA=1;
      }
        }
}

void UART0_Interrupt() interrupt 4 using 1
{
    if (RI0 == 1)
    {
      RI0 = 0;    // 清接收中断标志RI0
      test = SBUF0;
            SBUF0=test;   
            while (TI0== 0);           //等待发送完毕
                      TI0= 0;   //清发送中断标志TI0
      recv = 1;
      //NMEAHandler(SBUF0);
    }
}
页: [1]
查看完整版本: C8051F020 UART通信问题