找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3755|回復(fù): 1
收起左側(cè)

51單片機(jī)接MAX485模塊,讀取485溫濕度傳感器的數(shù)據(jù)(MODBUS)

[復(fù)制鏈接]
ID:929006 發(fā)表于 2021-7-14 23:30 | 顯示全部樓層 |閱讀模式
我用51單片機(jī)接MAX485模塊,讀取485溫濕度傳感器的數(shù)據(jù)(MODBUS),某一個(gè)寶買的。求大神改下主程序,讀出數(shù)據(jù),在LCD1602上顯示。
1.jpeg
2.png
3.png
4.png
單片機(jī)主程序:
#include "main.h"

/*****************************
modbus RTU 的C51程序
單片機(jī)89S52
通信波特率 9600 8位數(shù)據(jù) 1位停止位 偶校驗(yàn) 485通位接口
單片機(jī)控制板地址 localAddr(變量)
通信可設(shè)置數(shù)據(jù)的地址:
字地址 0 - 255 (只取16位的低8位)
位地址 0 - 255 (只取16位的低8位)
*******************************/

uint32        dwTickCount,dwIntTick;        //時(shí)鐘
uint8        idata sendBuf[16],receBuf[16]; //發(fā)送接收緩沖區(qū)
uint8        idata checkoutError;        // ==2 偶校驗(yàn)錯(cuò)  
uint8        idata receTimeOut;                //接收超時(shí)
uint8        idata c10ms;                        //10ms 計(jì)時(shí)
bit                b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;        //定時(shí)標(biāo)志位

// 串行中斷程序
void commIntProc() interrupt 4
{
        if(TI)
        {
                TI = 0;
                if(sendPosi < sendCount) //如果發(fā)送位置小于發(fā)送計(jì)數(shù),那么繼續(xù)發(fā)送
                {
                        sendPosi++;
                        ACC = sendBuf[sendPosi];
                        TB8 = P;        //加上校驗(yàn)位
                        SBUF = sendBuf[sendPosi];
                }
                else //否則發(fā)送完畢,置接收狀態(tài)
                {
                        b485Send = 0;    //發(fā)送完后將485置于接收狀態(tài)
                        receCount = 0;   //清接收地址偏移寄存器
                        checkoutError = 0;
                }
        }
        else if(RI)
        {
                RI = 0;
                receTimeOut = 10;    //通訊超時(shí)值
                receBuf[receCount] = SBUF;
                ACC = receBuf[receCount];
                if(P != RB8)
                        checkoutError = 2;        //偶校驗(yàn)出錯(cuò)
                receCount++;          //接收地址偏移寄存器加1
                receCount &= 0x0f;    //最多一次只能接收16個(gè)字節(jié)
        }

}   // void CommIntProc()

//定時(shí)器0 1ms 中斷
void timer0IntProc() interrupt 1
{
        TL0 = TIMER_LOW;
    TH0 = TIMER_HIGHT;
    dwIntTick++;
        bt1ms = 1;
    c10ms++;
    if(c10ms >= 10)
    {
        c10ms = 0;      //10ms計(jì)時(shí)器清零
        bt10ms = 1;
    }
}   // void Timer0IntProc()

//外部中斷0
void intEx0Proc(void) interrupt 0
{

}

//計(jì)數(shù)器1中斷
void counter1IntProc(void) interrupt 3 using 1
{

}


//定時(shí)處理
void timeProc(void)
{
        static uint8 c200ms;

    bWatchDog = ~ bWatchDog;    //看門(mén)狗取反
        b1ms = 0;
        b10ms = 0;
        b100ms = 0;
        
        ET0 = 0;        //禁用定時(shí)器0
        dwTickCount = dwIntTick;        //
        ET0 = 1;

        if(bt1ms)        //如果1ms到
        {
                bt1ms = 0;
                b1ms = 1;

        if(receTimeOut>0)        //如果接收超時(shí)值>0
        {
            receTimeOut--;        //接收超時(shí)-1(1ms減1次)
            if(receTimeOut==0 && receCount>0)   //判斷通訊接收是否超時(shí)
            {
                b485Send = 0;       //將485置為接收狀態(tài)
                receCount = 0;      //將接收地址偏移寄存器清零
                                checkoutError = 0;
            }
        }
        }
        
        if(bt100ms)
        {
                bt100ms = 0;
                b100ms = 1;
        }
    if(bt10ms)      //判斷中斷10ms標(biāo)志位是否1
    {
        bt10ms = 0;     //清中斷10ms標(biāo)志位
                b10ms = 1;

        c200ms++;                   //200ms計(jì)時(shí)器加1
        if(c200ms >= 20)            //判斷是否計(jì)時(shí)到200ms
        {
            c200ms = 0;             //清200ms計(jì)時(shí)器
            bRunLED = ~bRunLED;     //取反運(yùn)行指示燈         
        }
    }
}   // void TimerProc(void)

//初始化串口
void initUart(void)
{
        //T2 用于波特率 9600
        T2CON = 0x30;
        RCAP2H = 0xff;
        RCAP2L = 0xb8;
        TR2 = 1;

        //偶校驗(yàn)                                                
        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;                        //定時(shí)器1用于計(jì)數(shù)定時(shí)器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();
        }
}


MODBUS.C
#include "main.h"

//字地址 0 - 255 (只取低8位)
//位地址 0 - 255 (只取低8位)

/* CRC 高位字節(jié)值表 */
const uint8 code auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字節(jié)值表*/
const uint8 code auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;

uint8   testCoil;                //用于測(cè)試 位地址1
uint16  testRegister;        //用于測(cè)試 字址址16

uint8        localAddr = 1;        //單片機(jī)控制板的地址
uint8        sendCount;                //發(fā)送字節(jié)個(gè)數(shù)
uint8        receCount;            //接收到的字節(jié)個(gè)數(shù)
uint8        sendPosi;            //發(fā)送位置

uint16 crc16(uint8 *puchMsg, uint16 usDataLen)
{
        uint8 uchCRCHi = 0xFF ; /* 高CRC字節(jié)初始化 */
        uint8 uchCRCLo = 0xFF ; /* 低CRC 字節(jié)初始化 */
        uint32 uIndex ; /* CRC循環(huán)中的索引 */
        while (usDataLen--) /* 傳輸消息緩沖區(qū) */
        {
                uIndex = uchCRCHi ^ *puchMsg++ ; /* 計(jì)算CRC */
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                uchCRCLo = auchCRCLo[uIndex] ;
        }
        return (uchCRCHi << 8 | uchCRCLo) ;
}//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)

//開(kāi)始發(fā)送
void beginSend(void)
{        
        b485Send = 1;        //設(shè)為發(fā)送
        
        sendPosi = 0;
        if(sendCount > 1)
                sendCount--;
        ACC = sendBuf[0];
        TB8 = P;
        SBUF = sendBuf[0];

}//void beginSend(void)


//讀線圈狀態(tài)
void readCoil(void)
{
        uint8 addr;
        uint8 tempAddr;
        uint8 byteCount;
        uint8 bitCount;
        uint16 crcData;
        uint8 position;
        uint8 i,k;
        uint8 result;
        uint16 tempData;
        uint8  exit = 0;
        
        //addr = (receBuf[2]<<8) + receBuf[3];        
        //tempAddr = addr & 0xfff;
        addr = receBuf[3];
        tempAddr = addr;

        //bitCount = (receBuf[4]<<8) + receBuf[5];        //讀取的位個(gè)數(shù)
        bitCount = receBuf[5];

        byteCount = bitCount / 8;                                        //字節(jié)個(gè)數(shù)
        if(bitCount%8 != 0)
                byteCount++;
                                                                        
        for(k=0;k<byteCount;k++)
        {//字節(jié)位置
                position = k + 3;
                sendBuf[position] = 0;
                for(i=0;i<8;i++)
                {
                        getCoilVal(tempAddr,&tempData);
                        
                        sendBuf[position] |= tempData << i;
                        tempAddr++;
                        if(tempAddr >= addr+bitCount)
                        {        //讀完
                                exit = 1;
                                break;
                        }        
                }
                if(exit == 1)
                        break;
        }
        
        sendBuf[0] = localAddr;
        sendBuf[1] = 0x01;        
        sendBuf[2] = byteCount;
        byteCount += 3;
        crcData = crc16(sendBuf,byteCount);        
        sendBuf[byteCount] = crcData >> 8;
        byteCount++;
        sendBuf[byteCount] = crcData & 0xff;
        sendCount = byteCount + 1;
        
        beginSend();        
}//void readCoil(void)

//讀寄存器
void readRegisters(void)
{
        uint8 addr;
        uint8 tempAddr;
        uint16 result;
        uint16 crcData;
        uint8 readCount;
        uint8 byteCount;
        uint8  finsh;        //1完成  0出錯(cuò)
        uint16 i;
        uint16 tempData = 0;        
        
        //addr = (receBuf[2]<<8) + receBuf[3];
        //tempAddr = addr & 0xfff;        
        addr = receBuf[3];
        tempAddr = addr;

        //readCount = (receBuf[4]<<8) + receBuf[5];        //要讀的個(gè)數(shù)
        readCount = receBuf[5];

        byteCount = readCount * 2;
        
        for(i=0;i<byteCount;i+=2,tempAddr++)
        {
                getRegisterVal(tempAddr,&tempData);                                
                sendBuf[i+3] = tempData >> 8;                                                   
                sendBuf[i+4] = tempData & 0xff;                        
        }
        
        sendBuf[0] = localAddr;
        sendBuf[1] = 3;
        sendBuf[2] = byteCount;
        byteCount += 3;
        crcData = crc16(sendBuf,byteCount);
        sendBuf[byteCount] = crcData >> 8;
        byteCount++;
        sendBuf[byteCount] = crcData & 0xff;
        
        sendCount = byteCount + 1;
        beginSend();
}//void readRegisters(void)


//強(qiáng)制單個(gè)線圈
void forceSingleCoil(void)
{
        uint8 addr;
        uint8 tempAddr;
        uint16 tempData;
        uint8  onOff;
        uint8 i;
        
        //addr = (receBuf[2]<<8) + receBuf[3];        
        //tempAddr = addr & 0xfff;
        addr = receBuf[3];
        tempAddr = addr;

        //onOff = (receBuf[4]<<8) + receBuf[5];        
        onOff = receBuf[4];
        
        //if(onOff == 0xff00)
        if(onOff == 0xff)
        {        //設(shè)為ON
                tempData = 1;
        }
        //else if(onOff == 0x0000)
        else if(onOff == 0x00)
        {        //設(shè)為OFF
                tempData = 0;
        }

        setCoilVal(tempAddr,tempData);        
        
        for(i=0;i<receCount;i++)
        {
                sendBuf[ i] = receBuf[ i];
        }
        sendCount = receCount;
        beginSend();        
}//void forceSingleCoil(void)


//設(shè)置多個(gè)寄存器
void presetMultipleRegisters(void)
{
        uint8 addr;
        uint8 tempAddr;
        uint8 byteCount;
        uint8 setCount;
        uint16 crcData;
        uint16 tempData;
        uint8  finsh;        //為1時(shí)完成 為0時(shí)出錯(cuò)
        uint8 i;
        
        //addr = (receBuf[2]<<8) + receBuf[3];
        //tempAddr = addr & 0xfff;
        addr = receBuf[3];
        tempAddr = addr & 0xff;

        //setCount = (receBuf[4]<<8) + receBuf[5];
        setCount = receBuf[5];
        byteCount = receBuf[6];        
        
        for(i=0;i<setCount;i++,tempAddr++)
        {
                tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];
        
                setRegisterVal(tempAddr,tempData);                        
        }
        
        sendBuf[0] = localAddr;
        sendBuf[1] = 16;
        sendBuf[2] = addr >> 8;
        sendBuf[3] = addr & 0xff;
        sendBuf[4] = setCount >> 8;
        sendBuf[5] = setCount & 0xff;
        crcData = crc16(sendBuf,6);
        sendBuf[6] = crcData >> 8;
        sendBuf[7] = crcData & 0xff;
        sendCount = 8;
        beginSend();        
}//void presetMultipleRegisters(void)



//檢查uart0數(shù)據(jù)
void checkComm0Modbus(void)
{
        uint16 crcData;
        uint16 tempData;
        
        if(receCount > 4)
        {
                switch(receBuf[1])
                {
                        case 1://讀取線圈狀態(tài)(讀取點(diǎn) 16位以內(nèi))
                        case 3://讀取保持寄存器(一個(gè)或多個(gè))
                        case 5://強(qiáng)制單個(gè)線圈
                        case 6://設(shè)置單個(gè)寄存器
                                        if(receCount >= 8)
                                        {//接收完成一組數(shù)據(jù)
                                                //應(yīng)該關(guān)閉接收中斷
                                                
                                                if(receBuf[0]==localAddr && checkoutError==0)
                                                {
                                                        crcData = crc16(receBuf,6);
                                                        if(crcData == receBuf[7]+(receBuf[6]<<8))
                                                        {//校驗(yàn)正確
                                                                if(receBuf[1] == 1)
                                                                {//讀取線圈狀態(tài)(讀取點(diǎn) 16位以內(nèi))
                                                                        readCoil();                                                               
                                                                }
                                                                else if(receBuf[1] == 3)
                                                                {//讀取保持寄存器(一個(gè)或多個(gè))
                                                                        readRegisters();
                                                                }
                                                                else if(receBuf[1] == 5)
                                                                {//強(qiáng)制單個(gè)線圈
                                                                        forceSingleCoil();                                                               
                                                                }
                                                                else if(receBuf[1] == 6)
                                                                {
                                                                        //presetSingleRegister();                                                               
                                                                }

                                                        }
                                                }                                                
                                                receCount = 0;        
                                                checkoutError = 0;
                                        }
                                        break;
                        
                        case 15://設(shè)置多個(gè)線圈
                                        tempData = receBuf[6];
                                        tempData += 9;        //數(shù)據(jù)個(gè)數(shù)
                                        if(receCount >= tempData)
                                        {
                                                if(receBuf[0]==localAddr && checkoutError==0)
                                                {
                                                        crcData = crc16(receBuf,tempData-2);
                                                        if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
                                                        {
                                                                //forceMultipleCoils();                        
                                                        }
                                                }        
                                                receCount = 0;
                                                checkoutError = 0;
                                        }
                                        break;
                        
                        case 16://設(shè)置多個(gè)寄存器
                                        tempData = (receBuf[4]<<8) + receBuf[5];
                                        tempData = tempData * 2;        //數(shù)據(jù)個(gè)數(shù)
                                        tempData += 9;
                                        if(receCount >= tempData)
                                        {
                                                if(receBuf[0]==localAddr && checkoutError==0)
                                                {
                                                        crcData = crc16(receBuf,tempData-2);
                                                        if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
                                                        {
                                                                presetMultipleRegisters();                        
                                                        }
                                                }        
                                                receCount = 0;
                                                checkoutError = 0;
                                        }
                                        break;
                                                               
                        default:
                                        break;                        
                }
        }
}//void checkComm0(void)

//取線圈狀態(tài) 返回0表示成功
uint16 getCoilVal(uint16 addr,uint16 *tempData)
{
        uint16 result = 0;
        uint16 tempAddr;
        
        tempAddr = addr & 0xfff;
        //只取低8位地址
        switch(tempAddr & 0xff)
        {
                case 0:
                                break;
                case 1:        
                                *tempData = testCoil;
                                break;
                case 2:               
                                break;               
                case 3:
                                break;               
                case 4:
                                break;               
                case 5:
                                break;
                case 6:
                                break;                        
                case 7:
                                break;               
                case 8:
                                break;               
                case 9:
                                break;               
                case 10:
                                break;
                case 11:
                                break;
                case 12:
                                break;
                case 13:
                                break;
                case 14:
                                break;
                case 15:
                                break;
                case 16:
                                break;                                                                                                               
                default:
                                break;               
        }        
        
        return result;
}//uint16 getCoilVal(uint16 addr,uint16 *data)


//設(shè)定線圈狀態(tài) 返回0表示成功
uint16 setCoilVal(uint16 addr,uint16 tempData)
{
        uint16 result = 0;
        uint16 tempAddr;
        
        tempAddr = addr & 0xfff;
        
               
        switch(tempAddr & 0xff)
        {
                case 0:
                                break;
                case 1:        
                                testCoil = tempData;
                                break;
                case 2:               
                                break;               
                case 3:
                                break;               
                case 4:
                                break;               
                case 5:
                                break;
                case 6:
                                break;                        
                case 7:
                                break;               
                case 8:
                                break;               
                case 9:
                                break;               
                case 10:
                                break;
                case 11:
                                break;
                case 12:
                                break;
                case 13:
                                break;
                case 14:
                                break;
                case 15:
                                break;
                case 16:
                                break;                                                                                                               
                default:
                                break;               
        }        


        return result;
}//uint16 setCoilVal(uint16 addr,uint16 data)

//取寄存器值 返回0表示成功
uint16 getRegisterVal(uint16 addr,uint16 *tempData)
{
        uint16 result = 0;
        uint16 tempAddr;
        
        tempAddr = addr & 0xfff;
        
        switch(tempAddr & 0xff)
        {
                case 0:
                                break;
                case 1:        
                                break;
                case 2:               
                                break;               
                case 3:
                                break;               
                case 4:
                                break;               
                case 5:
                                break;
                case 6:
                                break;                        
                case 7:
                                break;               
                case 8:
                                break;               
                case 9:
                                break;               
                case 10:
                                break;
                case 11:
                                break;
                case 12:
                                break;
                case 13:
                                break;
                case 14:
                                break;
                case 15:
                                break;
                case 16:
                                *tempData = testRegister;
                                break;                                                                                                               
                default:
                                break;               
        }
        
        return result;
}//uint16 getRegisterVal(uint16 addr,uint16 &data)

//設(shè)置寄存器值 返回0表示成功
uint16 setRegisterVal(uint16 addr,uint16 tempData)
{
        uint16 result = 0;
        uint16 tempAddr;
        
        tempAddr = addr & 0xfff;
        
        switch(tempAddr & 0xff)
        {
                case 0:
                                break;
                case 1:        
                                break;
                case 2:               
                                break;               
                case 3:
                                break;               
                case 4:
                                break;               
                case 5:
                                break;
                case 6:
                                break;                        
                case 7:
                                break;               
                case 8:
                                break;               
                case 9:
                                break;               
                case 10:
                                break;
                case 11:
                                break;
                case 12:
                                break;
                case 13:
                                break;
                case 14:
                                break;
                case 15:
                                break;
                case 16:
                                testRegister = tempData;
                                break;                                                                                                               
                default:
                                break;               
        }
        
        return result;
}//uint8 setRegisterVal(uint16 addr,uint16 data)


全部代碼51hei下載地址:
MODBUS51.zip (58.96 KB, 下載次數(shù): 63)

SD123-T10 485溫濕度傳感器說(shuō)明書(shū)V1.3.pdf

1.44 MB, 下載次數(shù): 35

SD123-T10-2-v1.4.exe.zip

20.98 KB, 下載次數(shù): 34

回復(fù)

使用道具 舉報(bào)

ID:929006 發(fā)表于 2021-7-19 00:19 | 顯示全部樓層
大神幫忙看看,這個(gè)程序最后三句有沒(méi)有問(wèn)題,怎么顯示亂碼呢

#include "reg52.h"
#include "intrins.h"
#include "lcd.h"

sbit REDE=P1^7;

void delay(void)
{
unsigned int i,j;
for(i=0;i<200;i++)
for(j=0;j<500;j++);
}

void Send(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}

void main(void)
{
TMOD=0x20;
SCON=0x50;
PCON=0x00;
TH1=0xFD;
TR1=1;
REN=1;
EA=1;
ES=1;
LcdInit();
REDE=0;
while(1)
{
Send(0x01);
Send(0x03);
Send(0x01);
Send(0xff);
Send(0x00);
Send(0x0c);
Send(0x74);
Send(0x03);
delay();
}
}

void Uart_Serve(void) interrupt 4 using 0   //串口中斷
{
        if(RI==1)
                {
        RI=0;
        LcdWriteData(SBUF);
                }
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表