历史上的今天
返回首页

历史上的今天

今天是: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();

        }

}


推荐阅读

史海拾趣

Frequency Management International公司的发展小趣事

作为一家有社会责任感的企业,FMI深知可持续发展和环保的重要性。公司积极响应国家环保政策,采用环保材料和生产工艺,减少对环境的影响。同时,FMI还致力于节能减排和资源循环利用等方面的研究和实践工作。这些努力不仅体现了FMI对环境保护的承诺和责任感,也为公司的长期发展奠定了坚实的基础。

综上所述,Frequency Management International公司凭借其创立与早期发展、技术创新与产品线拓展、市场拓展与国际化战略、质量管理与客户服务以及可持续发展与环保责任等方面的努力和发展历程,在电子行业中取得了显著的成就和地位。

American Power Devices Inc公司的发展小趣事

随着全球市场的不断开放,APD公司意识到要想取得更大的发展,必须走出国门,拓展国际市场。于是,公司开始实施全球化战略,通过设立海外分公司、与当地企业合作等方式,逐步打开了欧洲、亚洲等多个市场。同时,APD还积极参与国际技术交流与合作,不断提升自身的技术水平和市场竞争力。

汇科公司的发展小趣事

2010年,山东汇科电气技术有限公司在山东淄博成立,标志着汇科公司在电子行业迈出了坚实的第一步。创立之初,公司就确定了以节能环保为发展核心的战略方向。2011年,汇科与日本富士等国内外一线品牌建立了战略合作关系,成为富士一级代理及指定维修中心,这一举措为公司的技术积累和市场拓展奠定了坚实基础。

General Electric Solid State公司的发展小趣事

随着市场的不断发展和变化,汇科公司始终将技术创新作为发展的核心驱动力。2012年,汇科第一台球磨机节电柜研发成功,并成功申请国家专利,这标志着公司在节能环保技术领域取得了重要突破。随后,公司又成功研发了柱塞泵节电柜、新一代全智能球磨机节电柜等产品,这些产品不仅提升了公司的市场竞争力,也推动了整个电子行业的发展。

Analogic Corporation公司的发展小趣事

随着市场的不断发展和变化,汇科公司始终将技术创新作为发展的核心驱动力。2012年,汇科第一台球磨机节电柜研发成功,并成功申请国家专利,这标志着公司在节能环保技术领域取得了重要突破。随后,公司又成功研发了柱塞泵节电柜、新一代全智能球磨机节电柜等产品,这些产品不仅提升了公司的市场竞争力,也推动了整个电子行业的发展。

芯朋微电子(chipown)公司的发展小趣事

芯朋微电子成立于2005年,初期由一群来自中国华晶电子集团的专家组成。公司创立之初,就专注于电源管理芯片的研发。经过数年的技术积累,2008年,芯朋微电子成功研发出“700V单片MOS集成AC-DC电源芯片”系列,这一突破打破了进口芯片的垄断,赢得了国内家电品牌厂商的认可,为公司在家电领域的快速发展奠定了基础。

问答坊 | AI 解惑

最新无线收发模块资料总结

本帖最后由 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的串口程序问题

小弟最近正在研究基于UCOS-II的串口程序,开发环境是IAR,我将IAR自带的UART程序移植到UCOS-II下时发现有一些问题: 比如:在uart.h文件下 DWORD UARTInit( DWORD Baudrate ); __irq __nested __arm void UART0Handler( void ); void UARTSend( ...…

查看全部问答>

华为EM200模块通讯

可能是网络问题,在发送数据过程中连接会自动关闭,可是连接关闭后,服务器并没有自动断开(此时已经不能发送数据了) 为什么呀??如果有谁在做EM200通讯,请与我联系qq:273498325 不胜感激~~~~~…

查看全部问答>

sql ce与sqlserver 2000同步,困惑中......

正在开发ppc版的进销存和客户关系管理系统,对数据同步问题不明白:数据库的建立是在ppc端建立,还是在sqlserver 2000端建立?如果在ppc端建立,同步的时候sqlserver2000端能否自动建立?…

查看全部问答>

uclinux编译问题

今天成功运行了我烧出来的内核,给大家分享点资料。…

查看全部问答>

dsp28335地址线的问题

我用dsp外接一个处理芯片,想用读外接芯片片内的寄存器值,地址线连14根,0-9,12-15,dsp里配置引脚的话,这几根选择XA,其他的地址线没用到如10,11等引脚,配置成什么呢,pull up么? 还有就是我选用的14根地址线从地位到高位,是不是默认按数字 ...…

查看全部问答>

printf()肿么了

折腾完 notepad++加上 gcc编译器以后,很爽地在上边玩程序。可是,我发现一个问题,很要命的问题。那就是,程序里写的printf语句,程序运行时,printf内容的顺序不对头。比如说,应该先printf信息再按照信息输入的,结果它没printf出来,非要等到我 ...…

查看全部问答>

为什么整流桥中通过直流电压后压降比较大

由于我的电路中需要通过交直流两种,所以,电路前端用了整流桥KBP307。测量发现,当输入电压为24V,电流为0.5A的时候,压降有1.8V。这个压降太大了吧?这个什么原因呢? …

查看全部问答>

开关电源考试题和答案

开关电源考试题和答案…

查看全部问答>