久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3749|回復: 1
收起左側

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

[復制鏈接]
ID:929006 發表于 2021-7-14 23:30 | 顯示全部樓層 |閱讀模式
我用51單片機接MAX485模塊,讀取485溫濕度傳感器的數據(MODBUS),某一個寶買的。求大神改下主程序,讀出數據,在LCD1602上顯示。
1.jpeg
2.png
3.png
4.png
單片機主程序:
#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;        //禁用定時器0
        dwTickCount = dwIntTick;        //
        ET0 = 1;

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

        if(receTimeOut>0)        //如果接收超時值>0
        {
            receTimeOut--;        //接收超時-1(1ms減1次)
            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 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 高位字節值表 */
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低位字節值表*/
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;                //用于測試 位地址1
uint16  testRegister;        //用于測試 字址址16

uint8        localAddr = 1;        //單片機控制板的地址
uint8        sendCount;                //發送字節個數
uint8        receCount;            //接收到的字節個數
uint8        sendPosi;            //發送位置

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

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

}//void beginSend(void)


//讀線圈狀態
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];        //讀取的位個數
        bitCount = receBuf[5];

        byteCount = bitCount / 8;                                        //字節個數
        if(bitCount%8 != 0)
                byteCount++;
                                                                        
        for(k=0;k<byteCount;k++)
        {//字節位置
                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出錯
        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];        //要讀的個數
        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)


//強制單個線圈
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)
        {        //設為ON
                tempData = 1;
        }
        //else if(onOff == 0x0000)
        else if(onOff == 0x00)
        {        //設為OFF
                tempData = 0;
        }

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


//設置多個寄存器
void presetMultipleRegisters(void)
{
        uint8 addr;
        uint8 tempAddr;
        uint8 byteCount;
        uint8 setCount;
        uint16 crcData;
        uint16 tempData;
        uint8  finsh;        //為1時完成 為0時出錯
        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數據
void checkComm0Modbus(void)
{
        uint16 crcData;
        uint16 tempData;
        
        if(receCount > 4)
        {
                switch(receBuf[1])
                {
                        case 1://讀取線圈狀態(讀取點 16位以內)
                        case 3://讀取保持寄存器(一個或多個)
                        case 5://強制單個線圈
                        case 6://設置單個寄存器
                                        if(receCount >= 8)
                                        {//接收完成一組數據
                                                //應該關閉接收中斷
                                                
                                                if(receBuf[0]==localAddr && checkoutError==0)
                                                {
                                                        crcData = crc16(receBuf,6);
                                                        if(crcData == receBuf[7]+(receBuf[6]<<8))
                                                        {//校驗正確
                                                                if(receBuf[1] == 1)
                                                                {//讀取線圈狀態(讀取點 16位以內)
                                                                        readCoil();                                                               
                                                                }
                                                                else if(receBuf[1] == 3)
                                                                {//讀取保持寄存器(一個或多個)
                                                                        readRegisters();
                                                                }
                                                                else if(receBuf[1] == 5)
                                                                {//強制單個線圈
                                                                        forceSingleCoil();                                                               
                                                                }
                                                                else if(receBuf[1] == 6)
                                                                {
                                                                        //presetSingleRegister();                                                               
                                                                }

                                                        }
                                                }                                                
                                                receCount = 0;        
                                                checkoutError = 0;
                                        }
                                        break;
                        
                        case 15://設置多個線圈
                                        tempData = receBuf[6];
                                        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])
                                                        {
                                                                //forceMultipleCoils();                        
                                                        }
                                                }        
                                                receCount = 0;
                                                checkoutError = 0;
                                        }
                                        break;
                        
                        case 16://設置多個寄存器
                                        tempData = (receBuf[4]<<8) + receBuf[5];
                                        tempData = tempData * 2;        //數據個數
                                        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)

//取線圈狀態 返回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)


//設定線圈狀態 返回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)

//設置寄存器值 返回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, 下載次數: 63)

SD123-T10 485溫濕度傳感器說明書V1.3.pdf

1.44 MB, 下載次數: 35

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

20.98 KB, 下載次數: 34

回復

使用道具 舉報

ID:929006 發表于 2021-7-19 00:19 | 顯示全部樓層
大神幫忙看看,這個程序最后三句有沒有問題,怎么顯示亂碼呢

#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);
                }
}

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产999精品久久久久久 | 色噜噜亚洲男人的天堂 | 亚洲在线成人 | 日日骚网| 99精品久久 | 国产精品视频入口 | h视频网站在线观看 | 亚洲午夜av | 一级二级三级在线观看 | 日韩中文一区二区三区 | 国产a区 | 婷婷二区 | 四虎影院新地址 | 免费美女网站 | 欧美日韩国产免费 | 欧美日韩国产精品一区二区 | 国产精品久久亚洲7777 | 国产乡下妇女做爰 | 一区二区视频 | 亚洲成人精 | 日本超碰| 羞羞的视频免费看 | 国产精品资源在线 | 亚洲一区中文字幕 | 国产美女在线免费观看 | 亚洲成人中文字幕 | 亚洲人在线 | 福利电影在线 | 91日韩 | 国产精品麻 | av黄色免费在线观看 | 高清国产午夜精品久久久久久 | 精品在线一区二区三区 | 日韩精品一区二区三区中文字幕 | 日韩av在线免费 | 在线观看av不卡 | 欧美激情综合 | 国产精品永久在线观看 | 国产在线中文 | 国内精品免费久久久久软件老师 | 中文字幕第一页在线 |