欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機MODBUS框架程序
[打印本頁]
作者:
lipengxu
時間:
2018-12-16 00:07
標題:
51單片機MODBUS框架程序
新鮮出爐的MODBUS框架程序,有不足的地方望大家指出
0.png
(6.75 KB, 下載次數: 26)
下載附件
2018-12-16 01:21 上傳
單片機源程序如下:
#include <all.h>
unsigned char xdata Modbus_Read_Buffer[256] = 0; //數據接收緩沖區
unsigned char xdata Modbus_Write_Buffer[256] = 0; //數據發送緩沖區
unsigned int Modbus_Read_Value = 0; //接收字節計數
unsigned int Modbus_Write_Value = 0; //發送字節計數
unsigned char Modbus_Read_Complete = 0; //幀接收完成標志位
unsigned int Modbus_CRC_Cecode(unsigned char *puchMsg, unsigned int usDataLen); //CRC校驗
void Modbus_Init(); //幀檢測定時器
void Modbus_data_Decode();
void Modbus_Init()//利用定時器2來計算數據幀 定時1MS
{
AUXR |= 0x04;//定時器2用作定時,不分頻
IE2 |= 0x04;//允許定時器2中斷
T2L = 0xCD; //設置定時初值
T2H = 0xD4; //設置定時初值
EA = 1; //開總中斷
AUXR |= 0x10;
}
unsigned int Modbus_CRC_Cecode(unsigned char *puchMsg, unsigned int usDataLen)
{
unsigned int i,j,CRC_Reg,Check;
CRC_Reg = 0xFFFF;
for(i=0;i<usDataLen;i++)
{
CRC_Reg = CRC_Reg ^ (unsigned int)*(puchMsg + i);
for(j=0;j<8;j++)
{
Check = CRC_Reg & 0x0001;
CRC_Reg >>= 1;
if(Check==0x0001)
{
CRC_Reg ^= 0xA001;
}
}
}
return CRC_Reg;
}
void Modbus_data_Decode()
{
unsigned int CRC_Data,i;
unsigned char CRC_H, CRC_L;
if(Modbus_Read_Complete)
{
EA = 0;
Modbus_Read_Complete = 0;
CRC_Data = Modbus_CRC_Cecode(Modbus_Read_Buffer,Modbus_Read_Value-2);
CRC_H = CRC_Data >> 8;
CRC_L = CRC_Data & 0x00ff;
if((CRC_H == Modbus_Read_Buffer[Modbus_Read_Value-1]) && (CRC_L == Modbus_Read_Buffer[Modbus_Read_Value-2]))
{
//這里可以開始分析數據 程序進入這里就證明CRC檢驗已經通過了
Modbus_Write_Value = 0; //清除發送直接計數 ,調試用
for(i = 0; i < (Modbus_Read_Value-2); i++) //調試用主要把接收的數據發送出去
{
Modbus_Write_Buffer[i] = Modbus_Read_Buffer[i]; //調試用
Modbus_Write_Value++; //調試用
}
}
Modbus_Write_Buffer[Modbus_Write_Value] = CRC_L; //調試用
Modbus_Write_Value++; //調試用
Modbus_Write_Buffer[Modbus_Write_Value] = CRC_H; //調試用
Modbus_Read_Value = 0; //接收直接數清零
EA = 1;
for(i = 0; i <= Modbus_Write_Value; i++) //調試用
{
SBUF = Modbus_Write_Buffer[i]; //調試用
while(!TI); //調試用
}
Modbus_Write_Value = 0; //調試用
}
}
/* 串口接收監控,由空閑時間判定幀結束,需在定時中斷中調用,ms-定時間隔 */
void UartRxMonitor(unsigned char ms)
{
static unsigned char cntbkp = 0;
static unsigned char idletmr = 0;
if (Modbus_Read_Value > 0) //接收計數器大于零時,監控總線空閑時間
{
if (cntbkp != Modbus_Read_Value) //接收計數器改變,即剛接收到數據時,清零空閑計時
{
cntbkp = Modbus_Read_Value;
idletmr = 0;
}
else //接收計數器未改變,即總線空閑時,累積空閑時間
{
if (idletmr < 2) //空閑計時小于30ms時,持續累加
{
idletmr += ms;
if (idletmr >= 2) //空閑時間達到2ms時,即判定為一幀接收完畢
{
Modbus_Read_Complete = 1; //設置幀接收完成標志
}
}
}
}
else
{
cntbkp = 0;
}
}
void Timer2_Routine() interrupt 12
{
UartRxMonitor(1);
}
復制代碼
所有資料51hei提供下載:
MODBUS調試.zip
(44.77 KB, 下載次數: 83)
2018-12-16 00:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1