查看: 2982|回复: 2

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

[复制链接]
  • TA的每日心情

    2015-5-17 22:38
  • 签到天数: 160 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-1-25 11:18:23 | 显示全部楼层 |阅读模式
    分享到:
    #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就会有问题,收到是数据就不对了。然后这也是需要断开电源以后,然后在通电就可以收到正确的数据了、这是为什么啊?
    回复

    使用道具 举报

  • TA的每日心情

    2015-5-17 22:38
  • 签到天数: 160 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-25 11:25:39 | 显示全部楼层
    为什么没有人回复我????
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2015-5-17 22:38
  • 签到天数: 160 天

    连续签到: 1 天

    [LV.7]常住居民III

     楼主| 发表于 2014-1-25 11:33:07 | 显示全部楼层
    求大神帮忙啊
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 11:57 , Processed in 0.138812 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.