微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于pic单片机串口初始化,有一段代码,求大神解释啊

关于pic单片机串口初始化,有一段代码,求大神解释啊

时间:10-02 整理:3721RD 点击:

  1. void serial_setup(void)
  2. {
  3.         /* relates crystal freq to baud rate - see above and PIC16F87x data sheet under 'USART async. modes'

  4.         BRGH=1, Fosc=3.6864MHz                BRGH=1, Fosc=4MHz      BRGH=1, Fosc=8MHz    BRGH=1, Fosc=16MHz
  5.         ----------------------          -----------------      -----------------    ------------------
  6.         Baud                SPBRG             Baud                SPBRG          Baud                SPBRG         Baud                SPBRG
  7.         1200                191               1200                207.3          1200                415.7         9600    103
  8.         2400                95                2400                103.2          2400                207.3         19200                51
  9.         4800                47                4800                51.1           4800                103.2         38400   25
  10.         9600                23                9600                25.0           9600                51.1          57600   16
  11.         19200                11                19200                12.0           19200        25.0          115200  8
  12.         38400                5                 38400                5.5            38400        12.0
  13.         57600                3                 57600                3.3            57600        7.7
  14.         115200        1                 115200        1.2            115200        3.3

  15.         */

  16.         /*
  17.          * Comms setup:
  18.          */

  19.         #define BAUD 19200
  20.         #define divIDER ((PIC_CLK/(16UL * BAUD) -1))
  21.         #define HIGH_SPEED 1

  22.         //you can comment these #assert statements out if you dont want error checking
  23.         #if PIC_CLK==3686400 && BAUD==19200
  24.                 #assert divIDER==11
  25.         #elif PIC_CLK==4000000 && BAUD==19200
  26.                 #assert divIDER==12
  27.         #elif PIC_CLK==16000000 && BAUD==19200
  28.                 #assert divIDER==51
  29.         #elif PIC_CLK==20000000 && BAUD==19200
  30.                 #assert divIDER==64
  31.         #endif

  32.         SPBRG=divIDER;
  33.         BRGH=HIGH_SPEED;        //data rate for sending
  34.         SYNC=0;                                                //asynchronous
  35.         SPEN=1;                                                //enable serial port pins
  36.         CREN=1;                                                //enable reception
  37.         SREN=0;                                                //no effect
  38.         TXIE=0;                                                //disable tx interrupts
  39.         RCIE=0;                                                //disable rx interrupts
  40.         TX9=0;                                                //8-bit transmission
  41.         RX9=0;                                                //8-bit reception
  42.         TXEN=0;                                                //reset transmitter
  43.         TXEN=1;                                                //enable the transmitter
  44. }

复制代码

百度了一下  assert  但是看不太明白啊
还有那个  divIDER 宏定义  

大概是如果条件成立则编译时打印出相应信息
#define divIDER ((PIC_CLK/(16UL * BAUD) -1))
这里16UL是长整形数16,BAUD 是波特率,计算分频数据的,应该跟数据手册上公式对应,时钟频率除以16倍波特率再减一

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top