久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
pic32單片機RS485通信程序
[打印本頁]
作者:
wangfee
時間:
2018-9-24 11:11
標題:
pic32單片機RS485通信程序
pic32單片機485通信程序分享給大家
0.png
(8.32 KB, 下載次數: 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
*
*********************************************************************************************************
********************************************************************************************************/
//
// 實驗描述:串口助手發送數據,接收16 Byte數據,RS485 發出16Byte數據
// LED及數碼管 顯示緩沖區數據.
//
// 頭 文 件:C:\Program Files\Microchip\MPLAB C32 Suite\pic32-libs\include\proc
//
// 配 置 位:菜單欄 -> Help -> Topics.. -> PIC32MX Config Setting
//
// 波 特 率:9600 N 8 1
//
// 注意事項:每次必須累積 16Byte 數據,單片機才回傳數據
//
//-------------------------------------------------------------------------------
#include <plib.h> //調用通用頭文件
//-------------------------------------------------------------------------------
// 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;
IPC8bits.U2IP = 4; // 主優選級
IPC8bits.U2IS = 1; // 次優選級
IEC1bits.U2RXIE = 1; // 接收中斷
IEC1bits.U2TXIE = 0; // 發送中斷
U2MODEbits.ON = 1; // 串口使能
}
//-------------------------------------------------------------------------------
// 串口2中斷函數 注意中斷編號
//-------------------------------------------------------------------------------
void __attribute__((vector(32)))__attribute__((interrupt(IPL4)))_UART2Interrupt(void)
{
if(IFS1bits.U2RXIF == 1) //接收中斷
{
RxBuffer[COM2_RecvCnt++] = U2RXREG; //儲存
if(COM2_RecvCnt == 16) //接收計數
{
COM2_RecvCnt = 0;
COM2_RecvFlag = 1;
}
IFS1bits.U2RXIF = 0;
}
if(IFS1bits.U2TXIF & IEC1bits.U2TXIE) //發送中斷
{
IFS1bits.U2TXIF = 0; //清中斷標志
if(COM2_SendDatCnt != COM2_SendDatLength) //發送未完成?
{
U2TXREG = RxBuffer[COM2_SendDatCnt++]; //裝載數數據
}
else //發送完成
{
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 中斷優選級
IPC1bits.T1IS = 1; // Timer1 次優選級
TMR1= 0x0000; // Timer1 給定初值
PR1 = 0x9C3F; // Timer1 周期寄存器
T1CONbits.TON = 1; // Timer1 啟動計數
}
//---------------------------------------------------------------------------------
// 數碼管驅動
//---------------------------------------------------------------------------------
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 中斷函數
//---------------------------------------------------------------------------------
void __attribute__ ((vector(4)))__attribute__((interrupt(IPL4)))_T1Interrupt(void)
{
IFS0bits.T1IF = 0;
SegDisplay(); //數碼管掃描
SysTick = 1; //系統 Tick
}
//---------------------------------------------------------------------------------
// 主函數
//---------------------------------------------------------------------------------
int main(void)
{
unsigned char temp = 0; //臨時變量
unsigned char Delay = 0;
AD1PCFG = 0xFFFF; //引腳為數字I/O
TRISB = 0x40DF; //RB5 RB8-RB13輸出
TRISG = 0xFFFF; //G端口輸出
TRISE = 0x0000; //E端口輸出
TRISD = 0xFE00; //RD0-RD7 RD8 輸出
LATD = 0x00FF; //關閉蜂嗚器
Timer1_Init(); //TMR1初始化
UART2_Init(); //UART初始化
INTEnableSystemMultiVectoredInt(); //使能中斷多向量表
LATE = 0x00FF; //點亮 D0 - D7
Delay_xmS(400);
LATE = 0x0000; //關閉 D0 - D7
Delay_xmS(400);
LATE = 0x00FF; //點亮 D0 - D7
Delay_xmS(400);
LATE = 0x0000; //關閉 D0 - D7
Delay_xmS(200);
while(1)
{
//----------------------LCD顯示-------------------------
if(COM2_RecvFlag == 1)
{
bctl_485 = 1; //發送模式
COM2_RecvFlag = 0; //清標志
COM2_SendDatCnt = 0; //準備發送
COM2_SendDatLength = 16; //數據長度
IEC1bits.U2TXIE = 1; //啟動發送
}
if(SysTick == 1) //系統顯示延時
{
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]; //顯示接收數據高4位
DpyNum[5] = SegCode[RxBuffer[temp]&0x0F]; //顯示接收數據低4位
LATE = RxBuffer[temp]; //LED顯示當前數據
temp = (temp + 1)&0x0F; //循環顯示
SysLED = !SysLED; //CPU LED
}
//------------------------------------------------------
}
}
//---------------------------------------------------------------------------------
復制代碼
所有資料51hei提供下載:
RS485.rar
(163.55 KB, 下載次數: 38)
2018-9-24 11:11 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品一区在线播放
|
精品一二区
|
日韩激情网站
|
少妇一级淫片aaaaaa
|
一级免费av
|
成人免费网站在线观看
|
午夜激情福利
|
国产精品久久久精品
|
av在线播放网址
|
аⅴ资源新版在线天堂
|
久久精品亚洲
|
亚洲福利片
|
欧美另类视频
|
中文字幕一区二区三区在线观看
|
日韩中文字幕在线观看
|
青青草国产成人av片免费
|
性少妇mdms丰满hdfilm
|
伊人av综合
|
av手机天堂网
|
成人特级毛片
|
天天操天天干天天爽
|
8090理论片午夜理伦片
|
性大毛片视频
|
久久视频免费
|
免费一级大片
|
一级a毛片
|
久久精品欧美一区二区三区不卡
|
国产精品成人免费精品自在线观看
|
一区二区水蜜桃
|
九九国产
|
男女久久久
|
午夜视频在线免费观看
|
欧美不卡视频
|
日韩亚洲欧美在线
|
国产成人精品一区二区三区福利
|
欧美福利一区二区
|
成人玩具h视频
|
91精品国产综合久久久蜜臀九色
|
午夜精品久久
|
天天精品视频
|
亚洲成a人
|