xys9190 发表于 2020-11-12 17:48

【赛元微单片机专题】源程序讲解[4] UART

本帖最后由 xys9190 于 2020-11-12 17:52 编辑

SC92F8463通常会提供一个UART0以及SPI/TWI/UART三选一串行接口SSI,主要用于驱动模块电路或者其他UART通信接口的驱动芯片。
模式0,8位半双工同步通信模式。
模式1,10位全双工异步通信,由1个起始位,8个数据位和1个停止位组成,通信波特率可变。
模式3,11位全双工异步通信,由1个起始位,8个数据位,一个可编程的第9位和1个停止位组成,通信波特率可变。
模式1与模式3可选择定时器1及定时器2作为TX和RX的波特时钟源。
BaudRate = fsys/;
对应的GPIOTX,RX 设置为带上拉输入模式。

源程序:
//UART ok
SCON = 0x50;                                                //10位模式
//UART0
TMCON = TMCON | 0x04;         //
T2MOD = 0;                                                      //时钟输入
//TL2 = 0x83;
//TH2 = 0x06;
RCAP2L = 0x83;                                        //16000000/1667 = 9600
RCAP2H = 0x06;
T2CON |= 0x30;                                        //T2作为UART波特率发生器存在0x34
TR2 = 0;
ET2 = 0;
EUART = 1;


我们采用中断的方式来发送数据,发送数据前对前局变量赋值
void TrUart(unsigned char instruct,unsigned char cdata)
{
      trIntruct = instruct,
      trCdata = cdata;
      
      trData = 0x55;
      SBUF = trData;

}
当发送完成触发中断执行,下面中断函数,以发送和接收数据
void RevUart0() interrupt 4
{
      if(RI)                      //中断接收
      {
                REN = 0;
                rcvUartdata = SBUF;                                                                                                                                                                //接收数据到缓存
      
                if((rcvUartCount % 5 == 0)&&(rcvUartdata != 0x55))                              //检测帧头
                {
                        rcvUartdata = 0;
                }
                else if((rcvUartCount % 5 == 1)&&(rcvUartdata != 0xaa))
                {
                        rcvUartdata = 0;
                        rcvUartdata = 0;
                        rcvUartCount = rcvUartCount - 1;
                }
                else if((rcvUartCount % 5 == 4)&&(rcvUartdata != 0xfa))                //检测帧尾
                {
                        rcvUartdata = 0;
                        rcvUartdata = 0;
                        rcvUartdata = 0;
                        rcvUartdata = 0;
                        rcvUartdata = 0;
                        rcvUartCount = rcvUartCount - 4;
                }
                else
                {
                        if(rcvUartCount % 5 == 4)
                        {
                              revOk** = 1;
                        }
                        rcvUartCount ++;
                }
               
                if(rcvUartCount == 20)
                {
                        rcvUartCount = 0;
                }
                RI = 0;
                REN = 1;
      }
      

      if(TI)                              //中断发送
      {
                TI = 0;
                uartTx0** = 1;
                trStep++;
                if(trStep == 1)
                {
                        trData = 0xaa;
                        SBUF = trData;
                }
                else if(trStep == 2)
                {
                        SBUF = trIntruct;
                }
                else if(trStep == 3)
                {
                        SBUF = trCdata;
                }
                else if(trStep == 4)
                {
                        trData = 0xfa;
                        SBUF = trData;
                }
                else if(trStep == 5)
                {
                        trStep = 0;      
                }
      }
}



//uart数据处理--------------------------------------------------------------------------------------------------
if(revOk**)                //接收完成数据 检查数据帧内容是否正确接收。
{
      for(arrayCount = 0;arrayCount < 20; arrayCount += 5)
      {
                if((rcvUartdata == 0x55)&&(rcvUartdata == 0xaa)&&(rcvUartdata == 0xfa))
                {
                        instruct      = rcvUartdata;
                        ctrolData= rcvUartdata;
                        crcData = rcvUartdata;      
                                                
                        switch(instruct)
                        {
                              case 0x10:      lackWaterState = ctrolData;                              //缺水 标志
                                                                                                                break;
                              case 0x20:      slaveState = ctrolData;                                                //1 EN 0 dis 开/关机
                                                                                                                break;
                              default:      break;
                        }
                        instruct = 0;
                        ctrolData = 0;
                        crcData = 0;
                                                      
                        rcvUartdata = 0;      
                        rcvUartdata = 0;      
                        rcvUartdata = 0;
                        rcvUartdata = 0;      
                        rcvUartdata = 0;
                }
      }
      revOk** = 0;
}
有什么问题直接加群主询问                              
                        





页: [1]
查看完整版本: 【赛元微单片机专题】源程序讲解[4] UART