資源簡介
modbus51_c代碼modbus51_c代碼
代碼片段和文件信息
#include?“main.h“
/******************************
微控電子?www.mcuc.cn
modbus?RTU?的C51程序?
單片機89S52
通信波特率?9600?8位數據?1位停止位?偶校驗?485通位接口
單片機控制板地址?localAddr(變量)
通信可設置數據的地址:
字地址?0?-?255?(只取16位的低8位)
位地址?0?-?255?(只取16位的低8位)
*******************************/
uint32 dwTickCountdwIntTick; //時鐘
uint8 idata?sendBuf[16]receBuf[16];?//發送接收緩沖區
uint8 idata?checkoutError; //?==2?偶校驗錯??
uint8 idata?receTimeOut; //接收超時
uint8 idata?c10ms; //10ms?計時
bit b1msbt1msb10msbt10msb100msbt100ms; //定時標志位
//?串行中斷程序
void?commIntProc()?interrupt?4
{
if(TI)
{
TI?=?0;?
if(sendPosi? {
sendPosi++;
ACC?=?sendBuf[sendPosi];
TB8?=?P; //加上校驗位
SBUF?=?sendBuf[sendPosi];
}
else
{
b485Send?=?0;????//發送完后將485置于接收狀態
receCount?=?0;???//清接收地址偏移寄存器
checkoutError?=?0;
}
}
else?if(RI)
{
RI?=?0;
receTimeOut?=?10;????//通訊超時值
receBuf[receCount]?=?SBUF;
ACC?=?receBuf[receCount];
if(P?!=?RB8)
checkoutError?=?2; //偶校驗出錯
receCount++;??????????//接收地址偏移寄存器加1
receCount?&=?0x0f;????//最多一次只能接收16個字節
}
}???//?void?CommIntProc()
//定時器0?1ms?中斷
void?timer0IntProc()?interrupt?1
{
TL0?=?TIMER_LOW;?
????TH0?=?TIMER_HIGHT;
????dwIntTick++;
bt1ms?=?1;
????c10ms++;
????if(c10ms?>=?10)?
????{
????????c10ms?=?0;??????//10ms計時器清零
????????bt10ms?=?1;
????}
}???//?void?Timer0IntProc()
//外部中斷0
void?intEx0Proc(void)?interrupt?0
{
}
//計數器1中斷
void?counter1IntProc(void)?interrupt?3?using?1
{
}
//定時處理
void?timeProc(void)
{
static?uint8?c200ms;
????bWatchDog?=?~?bWatchDog;????//看門狗取反
b1ms?=?0;
b10ms?=?0;
b100ms?=?0;
ET0?=?0;
dwTickCount?=?dwIntTick;
ET0?=?1;
if(bt1ms)
{
bt1ms?=?0;
b1ms?=?1;
????????if(receTimeOut>0)
????????{
????????????receTimeOut--;
????????????if(receTimeOut==0?&&?receCount>0)???//判斷通訊接收是否超時
????????????{
????????????????b485Send?=?0;???????//將485置為接收狀態
????????????????receCount?=?0;??????//將接收地址偏移寄存器清零
checkoutError?=?0;
????????????}
????????}
}
if(bt100ms)
{
bt100ms?=?0;
b100ms?=?1;
}
????if(bt10ms)??????//判斷中斷10ms標志位是否1
????{
????????bt10ms?=?0;?????//清中斷10ms標志位
b10ms?=?1;
????????c200ms++;???????????????????//200ms計時器加1
????????if(c200ms?>=?20)????????????//判斷是否計時到200ms
????????{
????????????c200ms?=?0;?????????????//清200ms計時器
????????????bRunLED?=?~bRunLED;?????//取反運行指示燈??????????
????????}
????}
}???//?void?TimerProc(void)
//初始化串口
void?initUart(void)
{
//T2?用于波特率?9600
T2CON?=?0x30;
RCAP2H?=?0xff;
RCAP2L?=?0xb8;
TR2?=?1;
//偶校驗?
SCON?=?0xd0;
????PCON?=?0;
????ES?=?1;
}//void?initUart(void)
//初始化中斷
void?initInt(void)
{
TMOD?=?0x51;
TH0?=?TIMER_HIGHT;
TL0?=?TIMER_LOW;
TR0?=?1;
????ET0?=?1;
TH1?=?0; //9600
????TL1?=?0;
TR1?=?0; //定時器1用于計數定時器2用于波特
ET1?=?1;
//PT1?=?1;
IT0?=?1;
????IT1?=?1;
EX0?=?0;
PX0?=?1;
????EX1?=?0;
initUart();
EA?=?1;
}???//?void?initInt(void)
//初始化
void?in
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄??????????0??2005-03-16?16:35??modbus51
?????文件????????485??2005-03-16?16:21??modbus51\main.h
?????文件??????12991??2005-03-16?16:31??modbus51\modbus.c
?????文件???????2069??2005-03-16?16:26??modbus51\main.Uv2
?????文件????????523??2005-02-04?00:07??modbus51\modbus.h
?????文件???????3432??2005-03-16?16:41??modbus51\main.c
?????文件????????168??2005-03-16?16:48??modbus51\modbus51.plg
?????文件???????5116??2003-09-26?11:56??modbus51\STARTUP.A51
?????文件??????11666??2005-03-16?16:48??modbus51\Startup.LST
?????文件??????36909??2005-03-16?16:48??modbus51\modbus51.M51
?????文件???????6075??2005-03-16?16:48??modbus51\modbus51.hex
????.......??????1685??2005-03-16?16:47??modbus51\main_Opt.Bak
?????文件????????943??2005-03-16?16:48??modbus51\main.Opt
?????文件????????749??2005-03-16?16:48??modbus51\Startup.OBJ
?????文件???????8187??2005-03-16?16:48??modbus51\main.LST
?????文件??????10019??2005-03-16?16:48??modbus51\main.OBJ
?????文件??????32845??2005-03-16?16:48??modbus51\modbus.LST
?????文件??????20023??2005-03-16?16:48??modbus51\modbus.OBJ
?????文件??????25292??2005-03-16?16:48??modbus51\modbus51
-----------?---------??----------?-----??----
???????????????179395????????????????????20
評論
共有 條評論