pic32单片机RS485通信程序

2019-11-07来源: 51hei关键字:pic32  单片机  RS485通信

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;

        

[1] [2] [3]
关键字:pic32  单片机  RS485通信 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479240.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机内部EEPROM的操作
下一篇:PIC10F202做的一个按键切换两个继电器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)
分享一个由PIC16F1938单片机芯片和AD623构成的电池容量测试仪.电路原理图如下:电池容量测试仪的pic单片机源码:#include    "main.h" //------------------------32MHZ---------------------------------------------- __CONFIG(FOSC_INTOSC & CLKOUTEN_OFF & BOREN_ON & PWRTE_ON & CPD_OFF          &CP_ON
发表于 2019-11-11
电池容量测试仪电路与源码(PIC16F1938单片机+AD623实现)
用PIC18F4520与发电机上的电表实现MUDBUS通信
说明:在了解了Modbus协议之后,开始编写Modbus-RTU通信函数。本系统所用的PIC18F4520单片机最小系统只有RS232通信接口,电力仪表提供的是串行异步半双工的RS485通信接口,故需用RS232转RS485转接器实现通信。本模块用USART来编写通信函数,且必须将其设置为串行异步半双工的通信方式,相关USART初始化函数如下://USART模块初始化void USARTinit(void){        TXSTAbits.SYNC=0;   //选择异步通信方式    TXSTAbits.TX9=0;   
发表于 2019-11-11
用PIC18F4520与发电机上的电表实现MUDBUS通信
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
软件:MPLAB X IDE v4.15编译    proteus 8.6仿真.1、仿真电路图;2、发送和接收源程序加注释。请看注释。原理:1)ADC读取并用led显示ADC读数,并通过usart进行输出。2)通过PPM原理进行通讯传输到另外一个单片机,LED显示接收的值。具体请看附件希望大家顶一下。仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 1、发送模块:读取ADC数值,LED显示10位ADC值。并通过PPM发送。2、接收模块:PPM接收到的数据。LED显示接收的ADC值(10bits)基于PIC单片机的PPM调制激光通信收发器PPM (pulse position
发表于 2019-11-09
PIC16F877A单片机PPM调制的激光通信Proteus仿真及源程序
PIC 16f877a PORTB State Change Interrupt仿真与源码
PORT Change Interrupt PIC 16f877A单片机源程序如下:#define      LED_1     PORTd.b0#define      LED_2     PORTd.b1void interrupt(){if(INTCON.RBIF)  {  INTCON.RBIF = 0;  if(!PORTB.B4)   {    LED_1 = 0;    LED_2 = 1;   } 
发表于 2019-11-09
PIC 16f877a PORTB State Change Interrupt仿真与源码
基于pic16f877a的电压输出并显示
 程序源码如下#include <pic.h>//引脚定义#define din RC7           //显示串行数据输入端#define load RC6          //显示数据锁存端#define clk RC5           //显示时钟输入端#define DecodeMode 0x09     //译码模式#define Intensity 0x0a      //亮度
发表于 2019-11-09
基于pic16f877a的电压输出并显示
用PIC10F202单片机制作两路开关源程序
;*****************************************//************************************  以下为代码区,请勿改动!  *****************************************//=============================================硬件连接示意===============================================////    ___短 _      长   _______ //       |_| |_________|    PIC10F200/202
发表于 2019-11-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved