• STC12C5A60S2单片机 串口调试


    用户在程序中如何具体使用串口1和独立波特率发生器BRT


    1、设置串口1的工作模式,SCON寄存器中的SM0和SM1决定串口1 的4中工作模式

    2、设置串口1的波特率,使用独立波特率发生器寄存器和相应的位;BRT,BRTx12位,SMOD位

    3、启动独立波特率发生器,让BRTR位为1,BRT独立波特率寄存器开始计数

    4、设置串口1的中断优先级,打开中断相应的控制位;

    5、如果串口1接收,将REN置1即可,如果发送,将数据送入SBUF即可,接收完成标志RI,发送完成标志TI,要由软件清0

    用户在程序中如何具体使用串口2


    1、设置串口2的工作模式,S2CON寄存器中的S2M0和S2M1决定串口1 的4中工作模式

    2、设置串口2的波特率,使用独立波特率发生器寄存器和相应的位;

      BRT,BRTx12位,S2SMOD位

    3、启动独立波特率发生器,让BRTR位为1,BRT独立波特率寄存器开始计数

    4、设置串口2的中断优先级,打开中断相应的控制位;PS2 PS2H ES2 EA

    5、如果串口2接收,将S2REN置1即可,如果发送,将数据送入S2BUF即可,接收完成标志S2RI,发送完成标志S2TI,要由软件清0

    串口波特率的计算方法:

    串口通信模式1和3,其波特率是可变的;

    模式1/3波特率 = 2SMOD /32x(定时器/计数器1的溢出率或BRT独立波特率发生器的溢出率)

    当T1x12 = 0时,定时器1的溢出率 = SYSCLK/12/(256-TH1);

    当T1x12 = 1时,定时器1的溢出率 = SYSCLK/(256-TH1);

    当BRTx12 = 0时,BRT独立波特率发生器的溢出率 = SYSCLK/12/(256-BRT);

    当BRTx12 = 1时,BRT独立波特率发生器的溢出率 = SYSCLK/(256-BRT);


     1 #ifndef _UART_H_  
     2 #define _UART_H_ 
     3  
     4 #define uchar   unsigned char  
     5 #define uint    unsigned int  
     6   
     7 //定义串口1口开关,关闭则不能接收数据  
     8 #define OpenUART1()     ES=1  
     9 #define CloseUART1()    ES=0  
    10 #define OpenUART2()     IE2|=0x01  
    11 #define CloseUART2()    IE2&=0xFE  
    12   
    13 //缓存串口1和串口2接收到的字符  
    14 extern uchar UART1_Recv_Val;  
    15 extern uchar UART2_Recv_Val;  
    16    
    17 void UART1_Init(uchar RELOAD, bit doubleBaud, bit timeMod);   
    18 void UART2_Init(uchar RELOAD, bit doubleBaud, bit timeMod);  
    19 void UART1_SendOneChar(uchar val);    
    20 void UART2_SendOneChar(uchar val);   
    21 void UART1_SendStr(uchar *str);   
    22 void UART2_SendStr(uchar *str);  
    23 #endif

    uar  1 #include <STC12C5A.H> //STC12C5A系列单 2 #include <intrins.h>  

      3 #include "UART.H"  
      4  
      5 #define uchar   unsigned char  
      6 #define uint    unsigned int  
      7   
      8 //缓存串口1和串口2接收到的字符  
      9 uchar UART1_Recv_Val = 0;  
     10 uchar UART2_Recv_Val = 0;  
       
     14 void UART1_Init(uchar RELOAD, bit doubleBaud, bit timeMod)  
     15 {  
     16     SCON |= 0x50;       //串口1方式1,接收充许  
     17   
     18     BRT = (256-FOSC/BAUD/32);       //波特率2400  
     23     AUXR |= 0x15;       //串口1使用独立波特率发生器,独立波特率发生器1T     36     PCON &= 0x7F;     //波特率不加倍  
     39     EA = 1;  
     40     ES = 1;             //充许串口1中断  
     41 }  
     
     45 void UART2_Init(uchar RELOAD, bit doubleBaud, bit timeMod)  
     46 {  
     47     //S2SM0  S2SM1   S2SM2   S2REN   S2TB8   S2RB8   S2TI     S2RI  
     48     S2CON |= 0x50;      //串口2,方式1,接收充许  
     49   
     50     BRT = RELOAD;  
     51   
     52     if (timeMod == 1)       //1T  
     53     {  
     54         //T0x12   T1x12   UM0x6   BRTR    S2SMOD  BRTx12  EXTRAM  S1BRS  
     55         AUXR |= 0x14;       //串口1使用独立波特率发生器,独立波特率发生器1T  
     56     }  
     57     else                    //12T  
     58     {  
     59         AUXR = (AUXR | 0x10) & 0xFB;  
     60     }  
     61   
     62     if (doubleBaud == 1)  
     63     {  
     64         AUXR |= 0x08;       //波特率加倍  
     65     }  
     66     else  
     67     {  
     68         AUXR &= 0xF7;       //波特率不加倍  
     69     }  
     70   
     71     EA = 1;   
     72     //-       -       -       -       -       -       ESPI    ES2  
     73     IE2 |= 0x01;            //充许串口2中断             
     74 }  
     78 void UART1_SendOneChar(uchar val)  
     79 {  
     80     //ES = 0;                   //关闭串口1中断  
     81   
     82     SBUF = val;  
     83     while(TI == 0);  
     84     TI = 0;  
     85   
     86     //ES = 1;                  //恢复串口1中断  
     87 }                            
     91 void UART2_SendOneChar(uchar val)  
     92 {  
     93     //IE2 = 0x00;                 //关闭串口2中断  
     94   
     95     S2BUF = val;      
     96     while ((S2CON & 0x02) == 0);  
     97     S2CON &= 0xFD;  
     98   
     99     //IE2 = 0x01;                //恢复串口2中断  
    100 }  
    
    104 void UART1_SendStr(uchar *str)  
    105 {  
    106     while( (*str)!='/0' )  
    107     {  
    108         UART1_SendOneChar(*str);  
    109         str++;  
    110     }  
    111 }  
    
    115 void UART2_SendStr(uchar *str)  
    116 {  
    117     while( (*str)!='/0' )  
    118     {  
    119         UART2_SendOneChar(*str);  
    120         str++;  
    121     }  
    122 }  
     
    126 void UART1_Int(void) interrupt 4  
    127 {  
    128     if (RI == 1)  
    129     {  
    130         RI = 0;  
    131         UART1_Recv_Val = SBUF;  
    132     }     
    133 }  
     
    137 void UART2_Int(void) interrupt 8  
    138 {  
    139     if ((S2CON & 0x01) == 1)  
    140     {  
    141         S2CON &= 0xFE;  
    142         UART2_Recv_Val = S2BUF;  
    143     }     
    144 }  
  • 相关阅读:
    [原创]RTX使用printf输出后进入hardfault中断的处理方法
    [原创]单片机 HexToStr and HexToBcd BcdToStr
    [原创]单片机-HexToStr or HexToAsc
    再看 AspriseOCR
    [源创] STM32F103ZET6 基于XMODEM 通讯的 BOOTLOADER案列IAP
    单片机串口——如何判定接收一帧数据的完成
    [原创] 关于步科eview人机界面HMI的使用
    [原创] STM32 定时器TIMx 编码器应用 函数 TIM_EncoderInterfaceConfig 分析
    单片机的 HexToStr HexToBcd BcdToStr 几个转换函数
    [转载] 全局键盘钩子(WH_KEYBOARD)
  • 原文地址:https://www.cnblogs.com/killer-xc/p/4651213.html
Copyright © 2020-2023  润新知