找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4027|回复: 0
打印 上一主题 下一主题
收起左侧

C8051F020通过UART0中断接收字符串,再通过UART1发送出去。但是UART1只能发出一个字符

[复制链接]
跳转到指定楼层
楼主
ID:73541 发表于 2015-2-11 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 爱宰恩 于 2015-2-11 15:43 编辑

我的初始化程序应该好用,我通过UART0中断接收,再通过UART0发送数据,程序运行正确;

                                             通过UART1中断接收,再通过UART1发送数据,程序运行也正确。

但是,我如果通过UART0中断接收数据,再通过UART1发送出去,就不对了。跪求帮助。

下面是我的代码:



//将UART1 和UART0 初始化,交叉开关设置为P0.0  P0.1 为UART0//                                          P1.0  P1.1 为UART1
//-----------------------------------------------------------------------------------------------//Includes//-----------------------------------------------------------------------------------------------
#include <c8051f020.h>#include <stdio.h>                         //标准输入输出头文件
//-----------------------------------------------------------------------------------------------
//Global Constants//-----------------------------------------------------------------------------------------------
#define BAUDRATE_0   115200       //  UART0的波特率#define BAUDRATE_1   9600
//-----------------------------------------------------------------------------------------------
//SYSTEMCLOCK  =System  clock  frequency  in  Hz
//-----------------------------------------------------------------------------------------------
#define  SYSTEMCLOCK      22118400    //系统时钟为22.1184MHz
#define  MAX_LEN          3           //接收数据的最大长度
//-----------------------------------------------------------------------------------------------
#define uchar  unsigned char#define uint  unsigned int
//-----------------------------------------------------------------------------------------------
uchar readCounts;  uchar senlen;
uchar trdata[MAX_LEN];
uchar message[]={"Receive Buf is full"};
bit  readFlag;
bit  frameFlag;
//-----------------------------------------------------------------------------------------------
//初始化函数
//-----------------------------------------------------------------------------------------------
void SYSCLK_Init(void);                 //系统时钟初始化函数
void PORT_Init(void);               
void UART0_Init(void);                 //

//-----------------------------------------------------------------------------------------------
//           SYSCLK_Init()
//-----------------------------------------------------------------------------------------------  
void SYSCLK_Init(void)
{         int i;
           OSCXCN= 0x67;                     //外部振荡器控制寄存器         ,使能外部振荡器                    
          for(i=0;i<256;i++);                                //等待至少1ms                
         while(!(OSCXCN&0x80));                        //等待外部晶体稳定起振
           OSCICN=0x88;                                                //用外部晶振作为系统时钟,并使能时钟丢失检测     
   }
//------------------------------------------------------------------------------------------------
//               PORT_Init()
//------------------------------------------------------------------------------------------------
  void PORT_Init()
{        
     XBR0  =0x06;                //  使能UART0 ,UART0 的TX连到P0.0 ,UART0 的RX 连到 P0.1         
     XBR1  =0x00;         
     XBR2  =0x46;                                   //  弱上拉全局使能,交叉开关使能                 
     P0MDOUT |=0x01;                           //  TX作为推挽输出,RX作为漏极开路      
     P1MDOUT |=0x01;         
     EMI0CF =0x10;         
     P1MDIN =0xFF;
}
//-------------------------------------------------------------------------------------------------
//      UART0_Init()
//------------------------------------------------------------------------------------------------
void UART0_Init()
  {   
     SCON0  =0x50;               
     TMOD   =0x20;        
     TH1    =        256-(SYSTEMCLOCK/BAUDRATE_0/16);   //设置定时器1用作波特率的重载值    TL1保持计数值,而TH0保持重载值。               
     TR1=1;                                                                //定时器1用系统时钟作为时基      
     CKCON  |=0x10;                       //系统采用系统时钟,不分频      
     PCON   |=0x80;                                                    //电源控制寄存器,禁止UART0波特率1/2功能
}
//-----------------------------------------------------------------------------------------------------
//       UART1_Init()
//-----------------------------------------------------------------------------------------------------
void UART1_Init()
{   
    SCON1 =0x50;      
    T4CON =0x34;   
     CKCON |=0x40;      
     PCON  |=0x10;        
     RCAP4H =(65536-SYSTEMCLOCK/BAUDRATE_1/32)/256;      
     RCAP4L =(65536-SYSTEMCLOCK/BAUDRATE_1/32)%256;      
     T4CON |=0x04;     
     SCON1 &=0xFE;        
     SCON1 &=0xFD;
}
                           
                              

//-------------------------------------------------------------------------------------------------
//UART0串口中断服务程序          (需要完成:1.检测是否是接收中断,2.如果是接收,保存数据,)
//                                           (3.判断接收的数据与保存的数据是否一样,4.如果一样,通过TX端发送出去一组数据)
//-------------------------------------------------------------------------------------------------
void UART0_ISR (void)         interrupt 4  using 1
  {         
     uchar rxch;                
     if(RI0)                     //若中断标志RI0=1,则是接收中断,进行数据完整接收      
             {      
               RI0=0;                 //RI0软件清零              
               rxch=SBUF0;     //将缓冲寄存器中的数值保存到字符rxch中              
               if (readCounts>=MAX_LEN)           
                 {                   
                     readCounts=0;                    
                     readFlag=1;    //如果接收到的数据已经超过了规定的长度,那说明这个数据是无用的,                                                      
                                            //设一个标志位readFlag=1,然后当readFlag=1的时候,就让主程序发送一个提示
                 }         
             trdata[readCounts]=rxch;//存入数组内,供发送              
             readCounts++;           //记录已经存入几个数据
            
            if(rxch==0x66)                         //检测,如果是最后一个字符,说明已经成功接收一组字符串了,   
              {                                                 //设一个标志位frameFlag=1,然后当frameFlag=1的时候,就让主程序发送这组数据给串口了   
                  frameFlag=1;         
                 senlen=readCounts;                  
                  readCounts=0;               
               }        
        }
}
//----------------------------------------------------------------------------------------------------
//   发送单个字符给UART1
//----------------------------------------------------------------------------------------------------
void  Send_char(uchar ch)  
{                  SBUF1=ch;       //将发送的数据送入缓存区               
while((SCON1&0x02)==0);   //在发送数据结束时,TI0置位               
SCON1&=~0x02;            //软件清零      
  }
//----------------------------------------------------------------------------------------------------
//     发送单个字符给UART0
//----------------------------------------------------------------------------------------------------
/*void  Send_char(uchar ch)  
{                  SBUF0=ch;        //将发送的数据送入缓存区               
while(TI0==0);   //在发送数据结束时,TI0置位      
         TI0=0;            //TI1软件清零      
}*/     
   //---------------------------------------------------------------------------------------------------
//      向串口发送一个字符串,strlen为该字符串的长度
//----------------------------------------------------------------------------------------------------   
void send_string_com(uchar *str,uint strlen)
  {        
          uint k=0;            
          do            
           {   
           Send_char(*(str+k));         
            k++;            
            } while(k<strlen);      
  }
//---------------------------------------------------------------------------------------------------
// 主程序(实现功能 UART0处有中断,是接收中断,接收到一组数值,如果数值是我们想要的,就再通过TX端发送出去)
//---------------------------------------------------------------------------------------------------   
    main()
{                  
     WDTCN  =  0xde;     
     WDTCN  =  0xad;         
     SYSCLK_Init();        
     PORT_Init();      
     UART0_Init();     
     UART1_Init();   
     EA=1;      
     ES0=1;      
     EIE2 =0x40;      
    do      
    {             
      
            if(readFlag==1)            
                  {                    
                      readFlag=0;                     
                     send_string_com(message,sizeof(message));                 
                  }               
               else if(frameFlag==1)            
                   {               
                        frameFlag=0;               
                       send_string_com(trdata,senlen);            
                   }        

       }while(1);  


}                                                              
            















分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表