⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sci.c

📁 本人s12的一部分机器人巡线程序
💻 C
字号:
uchar sci0_rcv_data;
uchar sci0_rcv;
uchar sci0_sent_data[20];
uchar sci0_sent;
uchar sci1_rcv_data;
uchar sci1_rcv;
uchar sci1_sent; 
uchar sci1_sent_data[20];

/*********************************************************************/
/*********************************************************************/

/* SCI.c   ------------ Hardware related functions                   

		uart0_init_bode();
		uart0_init_int();
		uart0_string_int(unsigned char ch);

**********************************************************************/
/*********************************************************************
SCI0CR2:TIE TCIE RIE ILIE TE RE RWU SBK
TIE:发送中断允许,TCIE:发送完成中断允许,RIE:接收寄存器满中断允许,ILIE:线路空闲中断允许
TE:发送允许,RE:接收允许,RWU:接收唤醒允许,SBK:发送13或14位全0信号
SCI0CR1:LOOPS SCISWAI RSRC M WAKE ILT PE PT
LOOPS:自发自收方式,SCISWAI:允许在WAIT模式下停止,RSRC:LOOP方式的输入,WAKE:唤醒方式位,=0线路空闲唤醒,=1接收字符高位=1唤醒
M:数据格式,=0为8位传送,=1为9位传送,ILT:全1空闲字符位计算方式位,ILT:=0从起始位计算空闲字符位数,=1从停止位计算空闲字符位数
PE:校验允许位,=0无校验,PT:校验类型位,=1奇校验,=0偶校验
*********************************************************************/
/*****************uart0_init_bode()***********************/
void uart0_init_bode(uchar sci0_cr2,uint sci0_bode) //初始化设置波特率和打开接收中断
  {
    SCI0CR2|=sci0_cr2;
    SCI0BD=sci0_bode;
    SCI0CR1=0;
  }
/******************uart0_init_rog()****************/
/*********************************************************************
SCI0SR1:TDRE TC RDRF IDLE OR NF PF PF
TDRE:发送数据寄存器空,TC:发送完成,RDRF:接收寄存器满,IDLE:线路空闲,OR:溢出错误
NF:因噪声出错,PE:格式错,PF:奇偶校验错
*********************************************************************/
 /**********uart0_string_rog()****************/
 /***********查询发送中断接收方式下发送字符串或者数组*************/
void uart0_string_int(uchar var_string[],uchar num)
  {
    uchar n;
    for(n=0;n<num;n++)
      {
        sci0_sent_data[n]=var_string[n];//存放数据
      }
    SCI0DRL=sci0_sent_data[0];//发送第一个数据
    SCI0CR2|=0x6C;//TIE=0,TICE=0,RIE=1,ILIE=0,TE=1,RE=1,RWU=0,SBK=0
  }
 
/*********************************************************************/
/*中断发送中断接收方式串口通讯*/
/*********************************************************************/

/*********************************************************************/

/* SCI.c   ------------ Hardware related functions                   
    uart1_init_bode()
		uart1_init_rog();
		uart1_putchar_rog(unsigned char ch);

**********************************************************************/ 
/*********************************************************************
SCI1CR2:TIE TCIE RIE ILIE TE RE RWU SBK
TIE:发送中断允许,TCIE:发送完成中断允许,RIE:接收寄存器满中断允许,ILIE:线路空闲中断允许
TE:发送允许,RE:接收允许,RWU:接收唤醒允许,SBK:发送13或14位全0信号
SCI1CR1:LOOPS SCISWAI RSRC M WAKE ILT PE PT
LOOPS:自发自收方式,SCISWAI:允许在WAIT模式下停止,RSRC:LOOP方式的输入,WAKE:唤醒方式位,=0线路空闲唤醒,=1接收字符高位=1唤醒
M:数据格式,=0为8位传送,=1为9位传送,ILT:全1空闲字符位计算方式位,ILT:=0从起始位计算空闲字符位数,=1从停止位计算空闲字符位数
PE:校验允许位,=0无校验,PT:校验类型位,=1奇校验,=0偶校验
*********************************************************************/
/*****************uart1_init_bode()***********************/
void uart1_init_bode(uchar sci1_cr2,uchar sci1_bode) //初始化设置波特率和打开接收中断
  {
    SCI1CR2|=sci1_cr2;
    SCI1BD=sci1_bode;
    SCI1CR1=0;
  }

/**********uart1_putchar_rog()****************/
/********发送查询接收中断方式下发送字符数据**************/
/*********************************************************************
SCI1SR1:TDRE TC RDRF IDLE OR NF PF PF
TDRE:发送数据寄存器空,TC:发送完成,RDRF:接收寄存器满,IDLE:线路空闲,OR:溢出错误
NF:因噪声出错,PE:格式错,PF:奇偶校验错
*********************************************************************/
/**************发送查询接收中断方式下发送字符串或者数组***************/  
/**********uart1_string_rog()****************/
void uart1_string_int(uchar *var_string,uchar num)
  {
    uint n;
    for(n=0;n<num;n++)
      {
        sci1_sent_data[n]=*var_string++;//存放数据
      }
    SCI1DRL=sci1_sent_data[0];//发送第一个数据
    SCI1CR2|=0xAC;//TIE=0,TICE=0,RIE=1,ILIE=0,TE=1,RE=1,RWU=0,SBK=0
  }
 



/********************************************************************/
/* SCI Interrupt in receive串口接收中断
注意:这里的中断同时需要处理接收和发送产生的中断(如果同时开了接收发送中断)
在操作系统中最好的方法就是设置2个信号量,表示发送完成中断,在中断里面
只要读取SCI0SR1的状态判断是接收中断还是发送中断,再置位相对的信号量,要是是
接收中断就在中断中读取接收寄存器数据,并置位收到一个数据标志.要是是发送中断
就置位发送完成标志的发送完成信号量,退出中断后由任务根据信号量执行相应的操作
(再次发送数据或者关闭发送中断这时候应该是有必要保持接收中断打开的),这样可以
尽量减少中断处理时间--提议者:赵签
BOOLEAN sci0_rcv;//串口0接收到数据信号量
BOOLEAN sci0_sent;//串口0发送完成信号量
BOOLEAN sci1_rcv;//串口1接收到数据信号量
BOOLEAN sci1_sent;//串口1发送完成信号量
uchar sci0_rcv_data;//串口0接收数据
uchar sci1_rcv_data;//串口1接收数据

SCI1SR1:TDRE TC RDRF IDLE OR NF PF PF
TDRE:发送数据寄存器空,TC:发送完成,RDRF:接收寄存器满,IDLE:线路空闲,OR:溢出错误
NF:因噪声出错,PE:格式错,PF:奇偶校验错

*/
/********************************************************************/
const uchar sci0_sent_size =26;
const uchar sci1_sent_size =1;
#pragma CODE_SEG NON_BANKED//
#pragma TRAP_PROC//
uchar sci0_data_count=0;
/*This Program is used to answer the SCI0 Interrupt */
void sci0_isr(void)
{ 
  
  unsigned char rc;
  rc = SCI0SR1; /* dummy read to clear flags */
  if(rc&0x20)//是接收中断
    {
      sci0_rcv_data= SCI0DRL; /* data read */
      sci0_rcv=TRUE; //置接收到数据信号量
    }
   else if(rc&0x40)
    {
      sci0_data_count++;//计数加1
      if(sci0_data_count!=sci0_sent_size)//发送没有完成
        {
          SCI0DRL=sci0_sent_data[sci0_data_count];
        }
      else
        {
          sci0_data_count=0;
          SCI0CR2=0x24;//关发送中断TIE=0,TICE=0,RIE=1,ILIE=0,TE=1,RE=1,RWU=0,SBK=0
          sci0_sent=TRUE; //置发送完成信号量         
        }
    }
}

/*This Program is used to answer the SCI1 Interrupt */
uint sci1_data_count;
void sci1_isr(void)
{ 
  
  unsigned char rc;
  rc = SCI1SR1; /* dummy read to clear flags */
  if(rc&0x20)//是接收中断
    {
      sci1_rcv_data= SCI1DRL; /* data read */
      sci1_rcv=TRUE; //置接收到数据信号量
    }
   else if(rc&0x40)
    {
      sci1_data_count++;//计数加1
      if(sci1_data_count!=sci1_sent_size)//发送没有完成
        {
          SCI0DRL=sci1_sent_data[sci1_data_count];
        }
      else
        {
          sci1_data_count=0;
          SCI1CR2=0x24;//关发送中断TIE=0,TICE=0,RIE=1,ILIE=0,TE=1,RE=1,RWU=0,SBK=0
          sci1_sent=TRUE; //置发送完成信号量         
        }
    }
}

#pragma CODE_SEG DEFAULT//

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -