×
单片机 > 单片机程序设计 > 详情

pic32单片机RS485通信程序

发布时间:2020-06-18 发布时间:
|

pic32源程序如下:

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

*********************************************************************************************************

*

* File                : RS485.c

* Hardware Environment:        easyPIC pro v2

* Build Environment   : MPLAB V8.66 + PIC32 V2.01

* Microcontroller     : PIC32MX795F512L

* Version             : V1.0

* By                  : JEFF

* DATE                                  : 20150320

*

* Hardware Connection:



  CN5(0~5)-----RB8~RB13, Segment LED Connetion

  CN6(0~7)-----RD0~RD7


  RE/DE------RB15

  RO   ------RF4

  DI   ------RF5

*

*(c) Copyright 2010-2018, Logifind Tech CO.,LTD

*http://www.logifind.com

*All Rights Reserved

*

*********************************************************************************************************

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

//

// 实验描述:串口助手发送数据,接收16 Byte数据,RS485 发出16Byte数据

//           LED及数码管 显示缓冲区数据.

//

// 头 文 件:C:Program FilesMicrochipMPLAB C32 Suitepic32-libsincludeproc

//

// 配 置 位:菜单栏 -> Help -> Topics.. -> PIC32MX Config Setting 

//

// 波 特 率:9600  N 8 1 

//

// 注意事项:每次必须累积 16Byte 数据,单片机才回传数据

//

//-------------------------------------------------------------------------------


#include                    //调用通用头文件


//-------------------------------------------------------------------------------

// POSCMOD = XT, FNOSC = PRIPLL, FWDTEN = OFF

// PLLIDIV = DIV_2, PLLMUL = MUL_20

// PBDIV = 4 (default)

// Main clock = 4MHz /2 * 20    =  40MHz

// Peripheral clock = 40MHz /4  =  10MHz

// SYSCLK = 40 MHz (4MHz Crystal/FPLLIDIV * FPLLMUL / FPLLODIV)

// PBCLK  = 10 MHz


#pragma config POSCMOD  = XT         //主振荡器  

#pragma config FNOSC    = PRIPLL     //倍频模式 

#pragma config FPLLIDIV = DIV_2      //输入分频 1:2

#pragma config FPLLMUL  = MUL_20     //PPL 倍频 1:20

#pragma config FPLLODIV = DIV_1      //输出分频 1:1

#pragma config FPBDIV   = DIV_4      //外设时钟

#pragma config FWDTEN   = OFF        //关闭看门狗

//#pragma config ICESEL   = ICS_PGx1   //调试端口1

#pragma config ICESEL   = ICS_PGx2   //调试端口2


#define SysLED     _LATB5                       //CPU LED

#define SPEKAK     _LATD8                       //蜂呜器

#define RELAY      _LATD8                       //继电器

#define bctl_485   _LATB15                      //485控制端



#define Smg_a    0xFE                           //定义段码

#define Smg_b    0xFD

#define Smg_c    0xFB

#define Smg_d    0xF7

#define Smg_e    0xEF

#define Smg_f    0xDF

#define Smg_g    0xBF

#define Smg_dp   0x7F


#define Bmp0Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f 

#define Bmp1Map          Smg_b & Smg_c

#define Bmp2Map          Smg_a & Smg_b & Smg_d & Smg_e & Smg_g

#define Bmp3Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_g

#define Bmp4Map          Smg_b & Smg_c & Smg_f & Smg_g

#define Bmp5Map          Smg_a & Smg_c & Smg_d & Smg_f & Smg_g

#define Bmp6Map          Smg_a & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g

#define Bmp7Map          Smg_a & Smg_b & Smg_c 

#define Bmp8Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g

#define Bmp9Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_f & Smg_g

#define BmpAMap          Smg_a & Smg_b & Smg_c & Smg_e & Smg_f & Smg_g

#define BmpBMap          Smg_c & Smg_d & Smg_e & Smg_f & Smg_g

#define BmpCMap          Smg_a & Smg_d & Smg_e & Smg_f 

#define BmpDMap          Smg_b & Smg_c & Smg_d & Smg_e & Smg_g

#define BmpEMap          Smg_a & Smg_d & Smg_e & Smg_f & Smg_g

#define BmpFMap          Smg_a & Smg_e & Smg_f & Smg_g





const unsigned char SegCode[] =                //显示段码表

{

        Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,Bmp6Map,Bmp7Map,

        Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,BmpCMap,BmpDMap,BmpEMap,BmpFMap

};


unsigned char DpyNum[6] = {Smg_g,Smg_g,Smg_g,Smg_g,Smg_g,Smg_g}; //显示缓冲区   


unsigned char RxBuffer[16] = {0,0,0,0};        //串口接收缓冲区

unsigned char SysTick = 0;                     //系统时基

unsigned char COM2_RecvCnt  = 0;               //计数清零

unsigned char COM2_RecvFlag = 0;               //接收标志

unsigned char COM2_SendDatCnt = 0;             //发送计数        

unsigned char COM2_SendDatLength = 0;          //发送长度


//-------------------------------------------------------------------------------

//  延时函数

//-------------------------------------------------------------------------------

void Delay_xmS(unsigned int i)                

{

        unsigned int j;

        for(;i>0;i--)

        {

                Nop();

                for(j=0;j<255;j++)

                {

                        Nop();

                        ClearWDT();

                }

        }        

}


//-------------------------------------------------------------------------------

//  串口2初始化函数

//-------------------------------------------------------------------------------

void UART2_Init(void)

{

        bctl_485 = 0;                    // 接收模式

        U2MODEbits.SIDL  = 0;            // IDLE工作

        U2MODEbits.IREN  = 0;            // 禁止IrDA

        U2MODEbits.UEN   = 0;            // 使能RX TX引脚

        U2MODEbits.WAKE  = 0;            // 禁止唤醒

        U2MODEbits.ABAUD = 0;            // 禁止自动BUD

        U2MODEbits.RXINV = 0;            // 空闲状态为1

        U2MODEbits.BRGH  = 0;            // 16x标准波特率

        U2MODEbits.PDSEL = 0;            // 8位无奇偶校验

        U2MODEbits.STSEL = 0;            // 1个停止位

        

        U2STAbits.ADM_EN   = 0;          // 关自动地址检测

        U2STAbits.UTXISEL1 = 0;          // 发送完所有字符后中断

        U2STAbits.UTXISEL0 = 1;

        U2STAbits.UTXINV   = 0;          // 空闲状态为1

        U2STAbits.URXEN    = 1;          // 接收器使能        

        

        U2STAbits.UTXBRK   = 0;          // 禁止发送间隔位

        U2STAbits.UTXEN    = 1;          // 发送器使能

                                                       

        U2STAbits.URXISEL1 = 0;          // 接收1个字符中断

        U2STAbits.URXISEL0 = 0;

        

        U2BRG = 64;                      // PBCLK 10MHz  N 8 1 9600 BRG = 64;

        



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容