历史上的今天
今天是:2024年11月06日(星期三)
2019年11月06日 | SUKON触摸屏学习单片机modbus通讯程序
2019-11-06 来源:51hei
#include "main.h"
/******************************
modbus RTU 的C51程序
单片机89S52
通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
单片机控制板地址 localAddr(变量)
通信可设置数据的地址:
字地址 0 - 255 (只取16位的低8位)
位地址 0 - 255 (只取16位的低8位)
*******************************/
uint32 dwTickCount,dwIntTick; //时钟
uint8 idata sendBuf[16],receBuf[16]; //发送接收缓冲区
uint8 idata checkoutError; // ==2 偶校验错
uint8 idata receTimeOut; //接收超时
uint8 idata c10ms; //10ms 计时
bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定时标志位
// 串行中断程序
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)
{
T2CON = 0x30; //T2 用于波特率 9600
RCAP2H = 0xff;
RCAP2L = 0xdc;
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 initProg(void)
{
initInt();
b485Send = 0;
}
void main(void)
{
initProg();
while(1)
{
timeProc();
checkComm0Modbus();
display();
}
}
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 04:09 编辑 :P :P :P :P :P :P :P :P :P :P :P :P 好东西与各位分享! … 查看全部问答> |
|
请教各位WinCE/WinMobile上的security部分的csp和ssp[进者有分] 大家都知道,ce和mobile上有很多的安全策略,可能比较常用的有模块验证(CertifyModule)。 请教大家个问题,安全策略中的csp和ssp最大的差别是什么,都用来做什么?能不能举一个例子来说明它们的典型应用? & ...… 查看全部问答> |
|
小弟最近正在研究基于UCOS-II的串口程序,开发环境是IAR,我将IAR自带的UART程序移植到UCOS-II下时发现有一些问题: 比如:在uart.h文件下 DWORD UARTInit( DWORD Baudrate ); __irq __nested __arm void UART0Handler( void ); void UARTSend( ...… 查看全部问答> |
|
可能是网络问题,在发送数据过程中连接会自动关闭,可是连接关闭后,服务器并没有自动断开(此时已经不能发送数据了) 为什么呀??如果有谁在做EM200通讯,请与我联系qq:273498325 不胜感激~~~~~… 查看全部问答> |
|
sql ce与sqlserver 2000同步,困惑中...... 正在开发ppc版的进销存和客户关系管理系统,对数据同步问题不明白:数据库的建立是在ppc端建立,还是在sqlserver 2000端建立?如果在ppc端建立,同步的时候sqlserver2000端能否自动建立?… 查看全部问答> |
|
我用dsp外接一个处理芯片,想用读外接芯片片内的寄存器值,地址线连14根,0-9,12-15,dsp里配置引脚的话,这几根选择XA,其他的地址线没用到如10,11等引脚,配置成什么呢,pull up么? 还有就是我选用的14根地址线从地位到高位,是不是默认按数字 ...… 查看全部问答> |
|
折腾完 notepad++加上 gcc编译器以后,很爽地在上边玩程序。可是,我发现一个问题,很要命的问题。那就是,程序里写的printf语句,程序运行时,printf内容的顺序不对头。比如说,应该先printf信息再按照信息输入的,结果它没printf出来,非要等到我 ...… 查看全部问答> |
|
由于我的电路中需要通过交直流两种,所以,电路前端用了整流桥KBP307。测量发现,当输入电压为24V,电流为0.5A的时候,压降有1.8V。这个压降太大了吧?这个什么原因呢? … 查看全部问答> |




