资源简介
51单片机编写的标准modbus协议通信模版,非常经典
代码片段和文件信息
#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 < sendCount)
{
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
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3432 2005-03-16 16:41 modbus51\modbus51\main.c
文件 485 2005-03-16 16:21 modbus51\modbus51\main.h
文件 8187 2005-03-16 16:48 modbus51\modbus51\main.LST
文件 10019 2005-03-16 16:48 modbus51\modbus51\main.OBJ
文件 943 2005-03-16 16:48 modbus51\modbus51\main.Opt
文件 2069 2005-03-16 16:26 modbus51\modbus51\main.Uv2
文件 1685 2005-03-16 16:47 modbus51\modbus51\main_Opt.Bak
文件 12991 2005-03-16 16:31 modbus51\modbus51\modbus.c
文件 523 2005-02-04 00:07 modbus51\modbus51\modbus.h
文件 32845 2005-03-16 16:48 modbus51\modbus51\modbus.LST
文件 20023 2005-03-16 16:48 modbus51\modbus51\modbus.OBJ
文件 25292 2005-03-16 16:48 modbus51\modbus51\modbus51
文件 6075 2005-03-16 16:48 modbus51\modbus51\modbus51.hex
文件 36909 2005-03-16 16:48 modbus51\modbus51\modbus51.M51
文件 168 2005-03-16 16:48 modbus51\modbus51\modbus51.plg
文件 5116 2003-09-26 11:56 modbus51\modbus51\STARTUP.A51
文件 11666 2005-03-16 16:48 modbus51\modbus51\Startup.LST
文件 749 2005-03-16 16:48 modbus51\modbus51\Startup.OBJ
目录 0 2007-11-25 16:40 modbus51\modbus51
目录 0 2007-11-25 16:40 modbus51
文件 50 2008-03-28 16:24 modbus51\modbus51\新势力网站.txt
文件 50 2008-03-28 16:24 modbus51\modbus51\重要说明.txt
文件 50 2008-03-28 16:24 modbus51\新势力网站.txt
文件 50 2008-03-28 16:24 modbus51\重要说明.txt
文件 50 2008-03-28 16:24 重要说明.txt
文件 50 2008-03-28 16:24 新势力网站.txt
----------- --------- ---------- ----- ----
179477 26
- 上一篇:电磁兼容测试培训教材
- 下一篇:ssh整合的小型超市系统
评论
共有 条评论