2回答

1收藏

[求助] c8051F340的串口问题。求大神帮助!!!

51单片机 51单片机 3760 人阅读 | 2 人回复 | 2014-01-25

#include <c8051f340.h>                 // SFR declarations

void SYSCLK_Init (void);
void UART0_Init (void);
void PORT_Init (void);
void Timer2_Init (int);
void UART_Send_Byte(unsigned char);

static char Byte;

void delayus(unsigned int time)
{
        while(time--);
}

void main (void)
{
        PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer
                                   // enable)
        PORT_Init();                        // Initialize Port I/O
        SYSCLK_Init ();                     // Initialize Oscillator
        UART0_Init();
       
        EA = 1;
       
        while(1)
        {
                UART_Send_Byte(0x30);
                UART_Send_Byte(0x31);
                //delayus(20);
        }
}

void PORT_Init (void)
{
   P0MDOUT |= 0x10;                    // Enable UTX as push-pull output
   XBR0     = 0x01;                    // Enable UART on P0.4(TX) and P0.5(RX)
   XBR1     = 0x40;                    // Enable crossbar and weak pull-ups
}

void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                     // Configure internal oscillator for
                                       // its maximum frequency
   RSTSRC  = 0x04;                     // Enable missing clock detector
}

void UART0_Init (void)
{
        SCON0 = 0x10;                       
        TH1 = 0x64;                                                  // 9600
        CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
        CKCON |=  0x01;
        TL1 = TH1;                          // init Timer1
        TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
        TMOD |=  0x20;
        TR1 = 1;                            // START Timer1
        IP |= 0x10;                         // Make UART high priority
        ES0 = 1;                            // Enable UART0 interrupts
}       

void UART_Send_Byte(unsigned char mydata)       
{
        SBUF0=mydata;
        while(!TI0);
        TI0=0;
}

void UART0_Interrupt (void) interrupt 4
{
        if(RI0==1)
        {
                RI0=0;
                Byte = SBUF0;                      // Read a character from UART
                SBUF0 = Byte;
        }
        /*if (TI0 == 1)                   // Check if transmit flag is set
        {
                TI0=0;
        }*/
}

上面是我的串口程序,开发板没有复位模块。把程序下载进单片机以后,连续发出的数据每次都不对,比如这个程序。一直在发0和1,但是串口调试助手收到的不是0和1(别说我把以十六进制数显示打勾了)。然后,我把电源断开以后,在通电就会收到正确的数据。求大神说明原因?
void UART0_OutPut(unsigned char *buf,unsigned char len)
{
    unsigned char  val;       

        TI0=0;

        for(val=0;val<len;val++)
        {
                SBUF0= buf[val];
                while(!TI0);
            TI0=0;
        }
}

可是我使用上面这个函数,当参数len大于2的时候,就可以,不会出错。但是小于2就会有问题,收到是数据就不对了。然后这也是需要断开电源以后,然后在通电就可以收到正确的数据了、这是为什么啊?
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

wmh19910511

发表于 2014-1-25 11:25:39 | 只看该作者

为什么没有人回复我????
板凳

wmh19910511

发表于 2014-1-25 11:33:07 | 只看该作者

求大神帮忙啊
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条