久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6175|回復: 0
收起左側

pic32單片機RS485通信程序

[復制鏈接]
ID:401765 發表于 2018-9-24 11:11 | 顯示全部樓層 |閱讀模式
pic32單片機485通信程序分享給大家

0.png

pic32源程序如下:

  1. /********************************************************************************************************
  2. *********************************************************************************************************
  3. *
  4. * File                : RS485.c
  5. * Hardware Environment:        easyPIC pro v2
  6. * Build Environment   : MPLAB V8.66 + PIC32 V2.01
  7. * Microcontroller     : PIC32MX795F512L
  8. * Version             : V1.0
  9. * By                  : JEFF
  10. * DATE                                  : 20150320
  11. *
  12. * Hardware Connection:


  13.   CN5(0~5)-----RB8~RB13, Segment LED Connetion
  14.   CN6(0~7)-----RD0~RD7

  15.   RE/DE------RB15
  16.   RO   ------RF4
  17.   DI   ------RF5
  18. *
  19. *(c) Copyright 2010-2018, Logifind Tech CO.,LTD
  20. *http://www.logifind.com
  21. *All Rights Reserved
  22. *
  23. *********************************************************************************************************
  24. ********************************************************************************************************/
  25. //
  26. // 實驗描述:串口助手發送數據,接收16 Byte數據,RS485 發出16Byte數據
  27. //           LED及數碼管 顯示緩沖區數據.
  28. //
  29. // 頭 文 件:C:\Program Files\Microchip\MPLAB C32 Suite\pic32-libs\include\proc
  30. //
  31. // 配 置 位:菜單欄 -> Help -> Topics.. -> PIC32MX Config Setting
  32. //
  33. // 波 特 率:9600  N 8 1
  34. //
  35. // 注意事項:每次必須累積 16Byte 數據,單片機才回傳數據
  36. //
  37. //-------------------------------------------------------------------------------

  38. #include <plib.h>                    //調用通用頭文件

  39. //-------------------------------------------------------------------------------
  40. // POSCMOD = XT, FNOSC = PRIPLL, FWDTEN = OFF
  41. // PLLIDIV = DIV_2, PLLMUL = MUL_20
  42. // PBDIV = 4 (default)
  43. // Main clock = 4MHz /2 * 20    =  40MHz
  44. // Peripheral clock = 40MHz /4  =  10MHz
  45. // SYSCLK = 40 MHz (4MHz Crystal/FPLLIDIV * FPLLMUL / FPLLODIV)
  46. // PBCLK  = 10 MHz

  47. #pragma config POSCMOD  = XT         //主振蕩器  
  48. #pragma config FNOSC    = PRIPLL     //倍頻模式
  49. #pragma config FPLLIDIV = DIV_2      //輸入分頻 1:2
  50. #pragma config FPLLMUL  = MUL_20     //PPL 倍頻 1:20
  51. #pragma config FPLLODIV = DIV_1      //輸出分頻 1:1
  52. #pragma config FPBDIV   = DIV_4      //外設時鐘
  53. #pragma config FWDTEN   = OFF        //關閉看門狗
  54. //#pragma config ICESEL   = ICS_PGx1   //調試端口1
  55. #pragma config ICESEL   = ICS_PGx2   //調試端口2

  56. #define SysLED     _LATB5                       //CPU LED
  57. #define SPEKAK     _LATD8                       //蜂嗚器
  58. #define RELAY      _LATD8                       //繼電器
  59. #define bctl_485   _LATB15                      //485控制端


  60. #define Smg_a    0xFE                           //定義段碼
  61. #define Smg_b    0xFD
  62. #define Smg_c    0xFB
  63. #define Smg_d    0xF7
  64. #define Smg_e    0xEF
  65. #define Smg_f    0xDF
  66. #define Smg_g    0xBF
  67. #define Smg_dp   0x7F

  68. #define Bmp0Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f
  69. #define Bmp1Map          Smg_b & Smg_c
  70. #define Bmp2Map          Smg_a & Smg_b & Smg_d & Smg_e & Smg_g
  71. #define Bmp3Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_g
  72. #define Bmp4Map          Smg_b & Smg_c & Smg_f & Smg_g
  73. #define Bmp5Map          Smg_a & Smg_c & Smg_d & Smg_f & Smg_g
  74. #define Bmp6Map          Smg_a & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
  75. #define Bmp7Map          Smg_a & Smg_b & Smg_c
  76. #define Bmp8Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
  77. #define Bmp9Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_f & Smg_g
  78. #define BmpAMap          Smg_a & Smg_b & Smg_c & Smg_e & Smg_f & Smg_g
  79. #define BmpBMap          Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
  80. #define BmpCMap          Smg_a & Smg_d & Smg_e & Smg_f
  81. #define BmpDMap          Smg_b & Smg_c & Smg_d & Smg_e & Smg_g
  82. #define BmpEMap          Smg_a & Smg_d & Smg_e & Smg_f & Smg_g
  83. #define BmpFMap          Smg_a & Smg_e & Smg_f & Smg_g




  84. const unsigned char SegCode[] =                //顯示段碼表
  85. {
  86.         Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,Bmp6Map,Bmp7Map,
  87.         Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,BmpCMap,BmpDMap,BmpEMap,BmpFMap
  88. };

  89. unsigned char DpyNum[6] = {Smg_g,Smg_g,Smg_g,Smg_g,Smg_g,Smg_g}; //顯示緩沖區   

  90. unsigned char RxBuffer[16] = {0,0,0,0};        //串口接收緩沖區
  91. unsigned char SysTick = 0;                     //系統時基
  92. unsigned char COM2_RecvCnt  = 0;               //計數清零
  93. unsigned char COM2_RecvFlag = 0;               //接收標志
  94. unsigned char COM2_SendDatCnt = 0;             //發送計數        
  95. unsigned char COM2_SendDatLength = 0;          //發送長度

  96. //-------------------------------------------------------------------------------
  97. //  延時函數
  98. //-------------------------------------------------------------------------------
  99. void Delay_xmS(unsigned int i)               
  100. {
  101.         unsigned int j;
  102.         for(;i>0;i--)
  103.         {
  104.                 Nop();
  105.                 for(j=0;j<255;j++)
  106.                 {
  107.                         Nop();
  108.                         ClearWDT();
  109.                 }
  110.         }       
  111. }

  112. //-------------------------------------------------------------------------------
  113. //  串口2初始化函數
  114. //-------------------------------------------------------------------------------
  115. void UART2_Init(void)
  116. {
  117.         bctl_485 = 0;                    // 接收模式
  118.         U2MODEbits.SIDL  = 0;            // IDLE工作
  119.         U2MODEbits.IREN  = 0;            // 禁止IrDA
  120.         U2MODEbits.UEN   = 0;            // 使能RX TX引腳
  121.         U2MODEbits.WAKE  = 0;            // 禁止喚醒
  122.         U2MODEbits.ABAUD = 0;            // 禁止自動BUD
  123.         U2MODEbits.RXINV = 0;            // 空閑狀態為1
  124.         U2MODEbits.BRGH  = 0;            // 16x標準波特率
  125.         U2MODEbits.PDSEL = 0;            // 8位無奇偶校驗
  126.         U2MODEbits.STSEL = 0;            // 1個停止位
  127.        
  128.         U2STAbits.ADM_EN   = 0;          // 關自動地址檢測
  129.         U2STAbits.UTXISEL1 = 0;          // 發送完所有字符后中斷
  130.         U2STAbits.UTXISEL0 = 1;
  131.         U2STAbits.UTXINV   = 0;          // 空閑狀態為1
  132.         U2STAbits.URXEN    = 1;          // 接收器使能       
  133.        
  134.         U2STAbits.UTXBRK   = 0;          // 禁止發送間隔位
  135.         U2STAbits.UTXEN    = 1;          // 發送器使能
  136.                                                        
  137.         U2STAbits.URXISEL1 = 0;          // 接收1個字符中斷
  138.         U2STAbits.URXISEL0 = 0;
  139.        
  140.         U2BRG = 64;                      // PBCLK 10MHz  N 8 1 9600 BRG = 64;
  141.        
  142.         IPC8bits.U2IP   = 4;             // 主優選級
  143.         IPC8bits.U2IS   = 1;             // 次優選級
  144.        
  145.         IEC1bits.U2RXIE = 1;             // 接收中斷
  146.         IEC1bits.U2TXIE = 0;             // 發送中斷
  147.        
  148.         U2MODEbits.ON   = 1;             // 串口使能
  149. }

  150. //-------------------------------------------------------------------------------
  151. //  串口2中斷函數  注意中斷編號
  152. //-------------------------------------------------------------------------------
  153. void __attribute__((vector(32)))__attribute__((interrupt(IPL4)))_UART2Interrupt(void)
  154. {
  155.         if(IFS1bits.U2RXIF == 1)              //接收中斷  
  156.         {       
  157.                 RxBuffer[COM2_RecvCnt++] = U2RXREG; //儲存
  158.                 if(COM2_RecvCnt == 16)              //接收計數
  159.                 {
  160.                         COM2_RecvCnt = 0;
  161.                         COM2_RecvFlag = 1;
  162.                 }
  163.                 IFS1bits.U2RXIF = 0;
  164.         }

  165.         if(IFS1bits.U2TXIF & IEC1bits.U2TXIE) //發送中斷         
  166.         {
  167.                 IFS1bits.U2TXIF = 0;              //清中斷標志
  168.                 if(COM2_SendDatCnt != COM2_SendDatLength)  //發送未完成?
  169.                 {
  170.                         U2TXREG = RxBuffer[COM2_SendDatCnt++]; //裝載數數據
  171.                 }
  172.                 else                              //發送完成
  173.                 {
  174.                         if(U2STAbits.TRMT == 1)       //移位寄存器空
  175.                         {
  176.                             bctl_485 = 0;             //接收模式
  177.                                 IEC1bits.U2TXIE = 0;      //禁止中斷
  178.                         }   
  179.             }
  180.         }
  181. }

  182. //---------------------------------------------------------------------------------
  183. //  TMR1初始化
  184. //---------------------------------------------------------------------------------
  185. void Timer1_Init(void)
  186. {
  187.         T1CON = 0;              // Timer1 清零
  188.        
  189.         IFS0bits.T1IF = 0;      // Timer1 清除標志位
  190.         IEC0bits.T1IE = 1;      // Timer1 中斷允許
  191.         IPC1bits.T1IP = 4;      // Timer1 中斷優選級
  192.         IPC1bits.T1IS = 1;      // Timer1 次優選級
  193.         TMR1=  0x0000;          // Timer1 給定初值
  194.         PR1 = 0x9C3F;           // Timer1 周期寄存器
  195.        
  196.         T1CONbits.TON = 1;      // Timer1 啟動計數
  197. }

  198. //---------------------------------------------------------------------------------
  199. //  數碼管驅動
  200. //---------------------------------------------------------------------------------
  201. void SegDisplay(void)
  202. {
  203.         static unsigned char step = 0;
  204.         LATD = (LATD&0xFF00)|DpyNum[step];  //顯示緩沖
  205.         switch(step)                        //片選
  206.         {
  207.                 case 0: _LATB8 = 0;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
  208.                 case 1: _LATB8 = 1;_LATB9 = 0;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
  209.                 case 2: _LATB8 = 1;_LATB9 = 1;_LATB10 = 0;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
  210.                 case 3: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 0;_LATB12 = 1;_LATB13 = 1;break;
  211.                 case 4: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 0;_LATB13 = 1;break;
  212.                 case 5: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 0;break;
  213.                 default:break;
  214.         }
  215.         if(step < 5) step ++;         //掃描
  216.         else               step = 0;
  217. }
  218.        
  219. //---------------------------------------------------------------------------------
  220. //  TMR1 中斷函數
  221. //---------------------------------------------------------------------------------
  222. void __attribute__ ((vector(4)))__attribute__((interrupt(IPL4)))_T1Interrupt(void)
  223. {       
  224.         IFS0bits.T1IF = 0;
  225.         SegDisplay();                 //數碼管掃描
  226.         SysTick = 1;                  //系統 Tick
  227. }

  228. //---------------------------------------------------------------------------------
  229. //  主函數
  230. //---------------------------------------------------------------------------------
  231. int main(void)
  232. {
  233.         unsigned char temp = 0;       //臨時變量
  234.         unsigned char Delay = 0;      
  235.        
  236.         AD1PCFG = 0xFFFF;             //引腳為數字I/O
  237.         TRISB  = 0x40DF;              //RB5 RB8-RB13輸出
  238.         TRISG  = 0xFFFF;              //G端口輸出
  239.         TRISE  = 0x0000;              //E端口輸出
  240.         TRISD  = 0xFE00;              //RD0-RD7 RD8 輸出
  241.        
  242.         LATD = 0x00FF;                //關閉蜂嗚器
  243.         Timer1_Init();                //TMR1初始化
  244.         UART2_Init();                 //UART初始化
  245.        
  246.         INTEnableSystemMultiVectoredInt(); //使能中斷多向量表
  247.                
  248.         LATE = 0x00FF;                //點亮 D0 - D7
  249.         Delay_xmS(400);
  250.         LATE = 0x0000;                //關閉 D0 - D7
  251.         Delay_xmS(400);
  252.         LATE = 0x00FF;                //點亮 D0 - D7
  253.         Delay_xmS(400);
  254.         LATE = 0x0000;                //關閉 D0 - D7
  255.         Delay_xmS(200);

  256.         while(1)
  257.         {
  258.                 //----------------------LCD顯示-------------------------
  259.                 if(COM2_RecvFlag == 1)
  260.                 {
  261.                         bctl_485 = 1;            //發送模式
  262.                         COM2_RecvFlag = 0;       //清標志
  263.                         COM2_SendDatCnt = 0;     //準備發送
  264.                            COM2_SendDatLength = 16; //數據長度
  265.                         IEC1bits.U2TXIE = 1;     //啟動發送
  266.                 }
  267.                 if(SysTick == 1)             //系統顯示延時
  268.                 {
  269.                         SysTick = 0;
  270.                         Delay ++;
  271.                 }       
  272.                 if(Delay > 120)              //刷新顯示
  273.                 {
  274.                         Delay = 0;
  275.                            DpyNum[0] = SegCode[temp/10];             //LCD 分段      
  276.                         DpyNum[1] = SegCode[temp%10];
  277.                         DpyNum[2] = Smg_g;
  278.                         DpyNum[3] = Smg_g;
  279.                         DpyNum[4] = SegCode[RxBuffer[temp]>>4];   //顯示接收數據高4位
  280.                         DpyNum[5] = SegCode[RxBuffer[temp]&0x0F]; //顯示接收數據低4位
  281.                        
  282.                         LATE = RxBuffer[temp];                    //LED顯示當前數據
  283.                        
  284.                         temp = (temp + 1)&0x0F;                   //循環顯示
  285.                         SysLED = !SysLED;                         //CPU LED
  286.                 }
  287.                
  288.                 //------------------------------------------------------
  289.         }
  290. }



  291. //---------------------------------------------------------------------------------
復制代碼

所有資料51hei提供下載:
RS485.rar (163.55 KB, 下載次數: 38)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品自拍一区 | 日韩黄色小视频 | 久久aⅴ乱码一区二区三区 91综合网 | 黄色激情毛片 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 色综合一区二区三区 | 成人在线视频免费播放 | 精品欧美一区二区三区免费观看 | 精品视频一区二区 | 欧美精品一区二区三区在线 | 中文字幕一区二区三区日韩精品 | 日韩在线视频一区二区三区 | 国产日韩一区二区三免费高清 | 影音先锋男 | 人人澡人人射 | 精品久久久久香蕉网 | 男人午夜视频 | 国产高清视频在线观看播放 | 亚洲精品68久久久一区 | 特级丰满少妇一级aaaa爱毛片 | 天堂av中文在线 | 日韩一区二区三区在线播放 | 色婷婷av一区二区三区软件 | 成人黄色电影在线播放 | 亚洲国产激情 | 99久久精品免费看国产四区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 另类 综合 日韩 欧美 亚洲 | av大片 | 国产视频中文字幕在线观看 | 91视频在线看 | www.99热.com| 国产乱码精品一区二区三区av | 91精品国产91综合久久蜜臀 | 亚洲福利在线观看 | 人人艹人人 | 99热99| 情侣av| 美女视频黄的 | 国产综合视频 | 北条麻妃99精品青青久久 |