关于C8051F340的串口0通讯问题---查明为硬件问题

2019-03-24 19:04发布

论坛里看了几篇关于C8051F340的串口通讯问题,发现都没能解决我目前的问题,不知是天热的原因还是本身过于急躁,越来越找不到串口通讯故障的原因了。
我用C8051F340的串口0进行通讯测试,使用串口中断的方式进行调试,上位机发送一串字符串共计18位,以‘@’起始,‘*’为结束符,内部12MHz的晶振,9600波特率;目前的现象是可以通过串口调试器进行接收数据,能看到指示灯的变化,知道接收是正常的,但是没有任何数据发送出来。程序贴上来请高手帮助分析一下,很着急,谢谢。

#include
//#include
#define uchar unsigned char
#define uint unsigned int

#define BAUDRATE        9600           // Baud rate of UART in bps
#define SYSTEMCLOCK     12000000           // SYSCLK frequency in Hz
//引脚定义

sbit LED1 = P2^2;
sbit LED2 = P2^3;
//全局变量
uchar UATR0_Buffer[20];      //从串口接收的数据
uchar com_dat1=0;             //串口接收的数据计数
uchar flag=0;                  //串口接收标志位
/*****************************************************************************
程序名称:delay()
功能介绍:延时程序
******************************************************************************/
void delay(uint i)
{
    uint j;
    for(i; i > 0; i--)
    {
       
        for(j = 550; j > 0; j--);
    }
}
/*****************************************************************************
程序名称:OSCILLATOR_Init()
功能介绍:晶振初始化
******************************************************************************/

void OSCILLATOR_Init (void)
{
   OSCICN |= 0x03;                     // Configure internal oscillator for
                                       // its maximum frequency (24.5 Mhz)
}
/*****************************************************************************
程序名称:UART0_Init()
功能介绍: 串口0的初始化配置 9600
******************************************************************************/
void UART0_Init (void)
{
   SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
   if (SYSTEMCLOCK/BAUDRATE/2/256 < 1)
   {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   }
   else if (SYSTEMCLOCK/BAUDRATE/2/256 < 4)
   {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   }
   else if (SYSTEMCLOCK/BAUDRATE/2/256 < 12)
   {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   }
   else
   {
      TH1 = -(SYSTEMCLOCK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   }

   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
}
/*****************************************************************************
程序名称:PORT_Init()
功能介绍:端口初始化;
         
参    数:
修改记录:
备    注:
日    期:20120719
******************************************************************************/
void PORT_Init (void)
{
     P0MDOUT |= 0x14;                    // Enable UTX as push-pull output
                                       // P0.0   digital   open-drain   SMBus SDA
                                      // P0.1   digital   open-drain   SMBus SCL

   P2MDOUT |= 0x08;                   // Make the LED (P2.3) a push-pull  output
                                      
   P1MDOUT = 0xff;                     // enable LEDs as push-pull outputs
   
   P0 |= 0x03;                            //漏极开
   P1 = 0x00;
    XBR0      = 0x05;
    XBR1      = 0x40;
    XBR2      = 0x01;
   

}
void putchar(uchar ch)
{

    ES0 = 0;
    SBUF0 = ch;
    while(!TI0);
    TI0 = 0;
    ES0 = 1;
}
void send_string(unsigned int Send_num,unsigned char data *Send_add)
{   
    unsigned int k=0;
    do
    {
         putchar(*(Send_add+k));
        k++;
       
    }while(k
}
/*****************************************************************************
程序名称:main()
功能介绍: 主函数
参    数:无
修改记录:
备    注:
日    期:20120719
******************************************************************************/
void main(void)
{
    PCA0MD &= ~0x40;                    // 禁止看门狗                    
    PORT_Init();                        // 设置P2口类型
    OSCILLATOR_Init ();                 // 设置内部12M晶振
    UART0_Init();
//    EA =1;
    while(1)
    {   
       
        if(flag==1)
        {
            com_dat1=0;
            flag=0;
            delay(1000);
            LED1=1;
            LED2=1;
            delay(1000);
            LED1=0;
            LED2=0;
            send_string(18,UATR0_Buffer);
        }
        else
        {
        putchar('#');
        delay(1000);
        LED1=1;
        LED2=0;
        delay(1000);
        LED1=0;
        LED2=1;   
        }
    }
}
void UART0_Interrupt (void) interrupt 4
{
  EA = 0;
  if(RI0 == 1)
  {   
     
     RI0 = 0;
     if(com_dat1==0)
     {
      UATR0_Buffer[0] = SBUF0;         //把从串口读出的数存到数组
      if(UATR0_Buffer[0]=='@') com_dat1++;
     }             
     else if(com_dat1<=17)
     {
         UATR0_Buffer[com_dat1] = SBUF0;
        if(UATR0_Buffer[com_dat1]=='*') flag=1;
        com_dat1++;
       
     }
     else
     {com_dat1=0;flag=0;}
     
     
  }
  if(TI0==1) TI0=0;
  EA = 1;
 
}
本程序是可用的,最后查明是硬件线路的问题 [ 本帖最后由 怕碎的瓶子 于 2012-7-21 09:17 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。