|
pic32單片機485通信程序分享給大家
0.png (8.32 KB, 下載次數(shù): 79)
下載附件
2018-9-24 16:14 上傳
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
- *
- *********************************************************************************************************
- ********************************************************************************************************/
- //
- // 實驗描述:串口助手發(fā)送數(shù)據(jù),接收16 Byte數(shù)據(jù),RS485 發(fā)出16Byte數(shù)據(jù)
- // LED及數(shù)碼管 顯示緩沖區(qū)數(shù)據(jù).
- //
- // 頭 文 件:C:\Program Files\Microchip\MPLAB C32 Suite\pic32-libs\include\proc
- //
- // 配 置 位:菜單欄 -> Help -> Topics.. -> PIC32MX Config Setting
- //
- // 波 特 率:9600 N 8 1
- //
- // 注意事項:每次必須累積 16Byte 數(shù)據(jù),單片機才回傳數(shù)據(jù)
- //
- //-------------------------------------------------------------------------------
- #include <plib.h> //調(diào)用通用頭文件
- //-------------------------------------------------------------------------------
- // 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 //外設(shè)時鐘
- #pragma config FWDTEN = OFF //關(guān)閉看門狗
- //#pragma config ICESEL = ICS_PGx1 //調(diào)試端口1
- #pragma config ICESEL = ICS_PGx2 //調(diào)試端口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}; //顯示緩沖區(qū)
- unsigned char RxBuffer[16] = {0,0,0,0}; //串口接收緩沖區(qū)
- unsigned char SysTick = 0; //系統(tǒng)時基
- unsigned char COM2_RecvCnt = 0; //計數(shù)清零
- unsigned char COM2_RecvFlag = 0; //接收標志
- unsigned char COM2_SendDatCnt = 0; //發(fā)送計數(shù)
- unsigned char COM2_SendDatLength = 0; //發(fā)送長度
- //-------------------------------------------------------------------------------
- // 延時函數(shù)
- //-------------------------------------------------------------------------------
- void Delay_xmS(unsigned int i)
- {
- unsigned int j;
- for(;i>0;i--)
- {
- Nop();
- for(j=0;j<255;j++)
- {
- Nop();
- ClearWDT();
- }
- }
- }
- //-------------------------------------------------------------------------------
- // 串口2初始化函數(shù)
- //-------------------------------------------------------------------------------
- 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; // 空閑狀態(tài)為1
- U2MODEbits.BRGH = 0; // 16x標準波特率
- U2MODEbits.PDSEL = 0; // 8位無奇偶校驗
- U2MODEbits.STSEL = 0; // 1個停止位
-
- U2STAbits.ADM_EN = 0; // 關(guān)自動地址檢測
- U2STAbits.UTXISEL1 = 0; // 發(fā)送完所有字符后中斷
- U2STAbits.UTXISEL0 = 1;
- U2STAbits.UTXINV = 0; // 空閑狀態(tài)為1
- U2STAbits.URXEN = 1; // 接收器使能
-
- U2STAbits.UTXBRK = 0; // 禁止發(fā)送間隔位
- U2STAbits.UTXEN = 1; // 發(fā)送器使能
-
- U2STAbits.URXISEL1 = 0; // 接收1個字符中斷
- U2STAbits.URXISEL0 = 0;
-
- U2BRG = 64; // PBCLK 10MHz N 8 1 9600 BRG = 64;
-
- IPC8bits.U2IP = 4; // 主優(yōu)選級
- IPC8bits.U2IS = 1; // 次優(yōu)選級
-
- IEC1bits.U2RXIE = 1; // 接收中斷
- IEC1bits.U2TXIE = 0; // 發(fā)送中斷
-
- U2MODEbits.ON = 1; // 串口使能
- }
- //-------------------------------------------------------------------------------
- // 串口2中斷函數(shù) 注意中斷編號
- //-------------------------------------------------------------------------------
- void __attribute__((vector(32)))__attribute__((interrupt(IPL4)))_UART2Interrupt(void)
- {
- if(IFS1bits.U2RXIF == 1) //接收中斷
- {
- RxBuffer[COM2_RecvCnt++] = U2RXREG; //儲存
- if(COM2_RecvCnt == 16) //接收計數(shù)
- {
- COM2_RecvCnt = 0;
- COM2_RecvFlag = 1;
- }
- IFS1bits.U2RXIF = 0;
- }
- if(IFS1bits.U2TXIF & IEC1bits.U2TXIE) //發(fā)送中斷
- {
- IFS1bits.U2TXIF = 0; //清中斷標志
- if(COM2_SendDatCnt != COM2_SendDatLength) //發(fā)送未完成?
- {
- U2TXREG = RxBuffer[COM2_SendDatCnt++]; //裝載數(shù)數(shù)據(jù)
- }
- else //發(fā)送完成
- {
- if(U2STAbits.TRMT == 1) //移位寄存器空
- {
- bctl_485 = 0; //接收模式
- IEC1bits.U2TXIE = 0; //禁止中斷
- }
- }
- }
- }
- //---------------------------------------------------------------------------------
- // TMR1初始化
- //---------------------------------------------------------------------------------
- void Timer1_Init(void)
- {
- T1CON = 0; // Timer1 清零
-
- IFS0bits.T1IF = 0; // Timer1 清除標志位
- IEC0bits.T1IE = 1; // Timer1 中斷允許
- IPC1bits.T1IP = 4; // Timer1 中斷優(yōu)選級
- IPC1bits.T1IS = 1; // Timer1 次優(yōu)選級
- TMR1= 0x0000; // Timer1 給定初值
- PR1 = 0x9C3F; // Timer1 周期寄存器
-
- T1CONbits.TON = 1; // Timer1 啟動計數(shù)
- }
- //---------------------------------------------------------------------------------
- // 數(shù)碼管驅(qū)動
- //---------------------------------------------------------------------------------
- void SegDisplay(void)
- {
- static unsigned char step = 0;
- LATD = (LATD&0xFF00)|DpyNum[step]; //顯示緩沖
- switch(step) //片選
- {
- case 0: _LATB8 = 0;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
- case 1: _LATB8 = 1;_LATB9 = 0;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
- case 2: _LATB8 = 1;_LATB9 = 1;_LATB10 = 0;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
- case 3: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 0;_LATB12 = 1;_LATB13 = 1;break;
- case 4: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 0;_LATB13 = 1;break;
- case 5: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 0;break;
- default:break;
- }
- if(step < 5) step ++; //掃描
- else step = 0;
- }
-
- //---------------------------------------------------------------------------------
- // TMR1 中斷函數(shù)
- //---------------------------------------------------------------------------------
- void __attribute__ ((vector(4)))__attribute__((interrupt(IPL4)))_T1Interrupt(void)
- {
- IFS0bits.T1IF = 0;
- SegDisplay(); //數(shù)碼管掃描
- SysTick = 1; //系統(tǒng) Tick
- }
- //---------------------------------------------------------------------------------
- // 主函數(shù)
- //---------------------------------------------------------------------------------
- int main(void)
- {
- unsigned char temp = 0; //臨時變量
- unsigned char Delay = 0;
-
- AD1PCFG = 0xFFFF; //引腳為數(shù)字I/O
- TRISB = 0x40DF; //RB5 RB8-RB13輸出
- TRISG = 0xFFFF; //G端口輸出
- TRISE = 0x0000; //E端口輸出
- TRISD = 0xFE00; //RD0-RD7 RD8 輸出
-
- LATD = 0x00FF; //關(guān)閉蜂嗚器
- Timer1_Init(); //TMR1初始化
- UART2_Init(); //UART初始化
-
- INTEnableSystemMultiVectoredInt(); //使能中斷多向量表
-
- LATE = 0x00FF; //點亮 D0 - D7
- Delay_xmS(400);
- LATE = 0x0000; //關(guān)閉 D0 - D7
- Delay_xmS(400);
- LATE = 0x00FF; //點亮 D0 - D7
- Delay_xmS(400);
- LATE = 0x0000; //關(guān)閉 D0 - D7
- Delay_xmS(200);
- while(1)
- {
- //----------------------LCD顯示-------------------------
- if(COM2_RecvFlag == 1)
- {
- bctl_485 = 1; //發(fā)送模式
- COM2_RecvFlag = 0; //清標志
- COM2_SendDatCnt = 0; //準備發(fā)送
- COM2_SendDatLength = 16; //數(shù)據(jù)長度
- IEC1bits.U2TXIE = 1; //啟動發(fā)送
- }
- if(SysTick == 1) //系統(tǒng)顯示延時
- {
- SysTick = 0;
- Delay ++;
- }
- if(Delay > 120) //刷新顯示
- {
- Delay = 0;
- DpyNum[0] = SegCode[temp/10]; //LCD 分段
- DpyNum[1] = SegCode[temp%10];
- DpyNum[2] = Smg_g;
- DpyNum[3] = Smg_g;
- DpyNum[4] = SegCode[RxBuffer[temp]>>4]; //顯示接收數(shù)據(jù)高4位
- DpyNum[5] = SegCode[RxBuffer[temp]&0x0F]; //顯示接收數(shù)據(jù)低4位
-
- LATE = RxBuffer[temp]; //LED顯示當(dāng)前數(shù)據(jù)
-
- temp = (temp + 1)&0x0F; //循環(huán)顯示
- SysLED = !SysLED; //CPU LED
- }
-
- //------------------------------------------------------
- }
- }
- //---------------------------------------------------------------------------------
復(fù)制代碼
所有資料51hei提供下載:
RS485.rar
(163.55 KB, 下載次數(shù): 38)
2018-9-24 11:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
|