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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3707|回復: 14
打印 上一主題 下一主題
收起左側

請問RS485通信的濕度傳感器如和與單片機建立通信

[復制鏈接]
跳轉到指定樓層
樓主
如題,單片機如何讀取其數據?有一個TTL-RS485的轉換元件,程序應該如何寫

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:158375 發表于 2019-4-4 08:59 | 只看該作者
既然有TTL-RS485轉換元件,那就用 RS485 通訊,也便于擴展;
注意定義好通訊協議。通訊協議從網上找一個參考。
回復

使用道具 舉報

板凳
ID:471636 發表于 2019-4-4 12:47 | 只看該作者
1、硬件連接:你第一個圖是一個USB轉485的轉換器,先在電腦上安裝它的驅動程序,并找到用的是那個COM口;
2、用電線,l兩心線   連接這個轉換器的AB  對應傳感器的AB,傳感器給電源,轉換器插到電腦里

3、用串口調試軟件,按傳感器的說明書設置波特率,按modbus 協議的格式發送數據,就可以接受數據了。
回復

使用道具 舉報

地板
ID:493715 發表于 2019-4-4 15:18 | 只看該作者
uvw 發表于 2019-4-4 12:47
1、硬件連接:你第一個圖是一個USB轉485的轉換器,先在電腦上安裝它的驅動程序,并找到用的是那個COM口;
...

第一個圖也可以TTL轉485,我想讓傳感器接到單片機上,請問程序該如何寫在哪能找到類似的程序?
回復

使用道具 舉報

5#
ID:466684 發表于 2019-9-3 10:59 | 只看該作者
EatonDu 發表于 2019-4-4 15:18
第一個圖也可以TTL轉485,我想讓傳感器接到單片機上,請問程序該如何寫在哪能找到類似的程序?

樓主做出來了嗎,我最近也在用一個485的傳感器和stm32做實驗,但是不會弄,可以參考一下你的程序嗎
回復

使用道具 舉報

6#
ID:466684 發表于 2019-9-3 11:01 | 只看該作者
樓主,我最近也在做一個實驗(stm32+ rs485 風速傳感器),以前沒有用過,可以參考一下你的程序吧嗎
回復

使用道具 舉報

7#
ID:800877 發表于 2020-7-10 18:03 | 只看該作者
a984984sd123456 發表于 2019-9-3 10:59
樓主做出來了嗎,我最近也在用一個485的傳感器和stm32做實驗,但是不會弄,可以參考一下你的程序嗎

請問師兄做出來了么?我最近也在學這個。可以請教一下么
回復

使用道具 舉報

8#
ID:789121 發表于 2020-7-10 19:28 | 只看該作者
單片機與485設備或傳感器通信,需要使用TTL轉485的芯片MAX485,單片機串口接到MAX485的RXTX,另外接兩個控制端控制讀寫,具體可以看手冊,485芯片AB端接傳感器的AB。買傳感器應該會給參考資料的
回復

使用道具 舉報

9#
ID:800877 發表于 2020-7-11 09:44 | 只看該作者
不要黑 發表于 2020-7-10 19:28
單片機與485設備或傳感器通信,需要使用TTL轉485的芯片MAX485,單片機串口接到MAX485的RXTX,另外接兩個控 ...

師兄,我想請問一下,在485通信的基礎上怎么添加modbus協議,小白請教
回復

使用道具 舉報

10#
ID:772656 發表于 2020-7-11 09:53 | 只看該作者
硬件接法是比較簡單的,軟件我不太懂
回復

使用道具 舉報

11#
ID:800877 發表于 2020-7-11 10:05 | 只看該作者
lxf2299 發表于 2020-7-11 09:53
硬件接法是比較簡單的,軟件我不太懂

軟件真的太難了
回復

使用道具 舉報

12#
ID:767423 發表于 2020-7-11 10:31 | 只看該作者
// 以前做的8路溫度模塊RS485接口modbus協議
// 部分主要程序,小鬼子的芯片,485部分可以參考
unsigned char send_i=0;
unsigned char send_j=0;
unsigned char recv_ok;                        //接收完成標志
unsigned char ADDR_s1;                        //本機地址
unsigned int CRC_data;                        //CRC計算存放值
unsigned char com_count;                //接收計數器
unsigned char tx_count;                        //發送指針計數器
unsigned char count_all;                //接收總字節數
unsigned char send_count;                //發送計數器
unsigned char load_count;
unsigned char send_data[32];        //發送緩沖區
unsigned int ram_data[8];                //RAM變量        ram_data[1]:狀態標志
                                                                //                        ram_data[16](0x10):控制
                                                                //                        ram_data[17](0x11):
                                                                //                        ram_data[18](0x12):靜音標志
unsigned int recv_data[16];                //接收緩存區
const unsigned int crc_table[] =  /* CRC 值表*/
{
0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,       
0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,       
0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,       
0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,       
0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,       
0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,       
0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,       
0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,       
0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,       
0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,       
0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,       
0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,       
0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,       
0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,       
0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,       
0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,       
0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,       
0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,       
0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,       
0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,       
0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,       
0x4100,0x81C1,0x8081,0x4040       
};
void init_UART0(void);
void com_recv(void);
void CRC_byte(unsigned char byte);        //一個字節CRC
void main(void)
{
        unsigned char k;
        asm("FCLR I");                //關中斷
/*****起動外部晶振*****/
        prc0=1;                //關保護
        cm13=1;                //開外晶振
        cm15=1;                //驅動為高
        cm05=0;                //外晶振振蕩
        cm16=0;                //不分頻
        cm17=0;
        cm06=0;                //不分頻
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        ocd0=0;                //不檢失效
        ocd1=0;                //失效不中斷
        ocd2=0;                //選擇外部晶振
        prc0=0;                //保護
        wdc7=0;                        //設置看門狗定時器頻率為 f(Xin)/16
        prc1=1;                        //關保護
        pm0=0;
        pm1=0x04;                //WDT溢出復位
        prc1=0;                        //開保護
       
        wdc7=1;                        //設置看門狗定時器頻率為 f(Xin)/128
        prc1=1;                        //關保護
        pm0=0;
        pm1=0x04;                //WDT溢出復位
        prc1=0;                        //開保護
        asm("FSET I");        //開中斷
        /*******初始化IO*******/
        p1=0xc0;
        pd1=0xc0;        // P1_6--P1_7為輸出
       
        p2=0x00;        //
        pd2=0xff;        //  P2口為輸出
        //pur0|=0x38;        // P2口上拉,P1.4-P1.7上拉
        p3=0xFF;
        pd3|=0x38;        // P3_3--P3_5為輸出
       
        time1=255;
        count_ad=10;
       
        recv_ok=0;
        CRC_data=0xffff;//CRC初值
        com_count=0;
        ADDR_s1=0x03;        //地址03
        /**********************/
        //read_set_data();        // 讀出EEPROM數據
        init_AD();                //初始化
        init_RA();        //2ms
        init_UART0();
        wdts=0;                                //啟動看門狗
        while(1)
        {
        // 1 溫度計算
                if(buffer_flg!=0)
                {
                        Array_Sort(temp_buffer1,8);// 通道1 8點排序
                       
                        for(k=2;k<6;k++)
                        {
                                temp_sum1+=temp_buffer1[k];//中間4點求和
                        }
                       
                        Array_Sort(temp_buffer2,8);// 通道2 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum2+=temp_buffer2[k];
                        }
                       
                        Array_Sort(temp_buffer3,8);// 通道3 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum3+=temp_buffer3[k];
                        }
                       
                        Array_Sort(temp_buffer4,8);// 通道4 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum4+=temp_buffer4[k];
                        }
                       
                        Array_Sort(temp_buffer5,8);// 通道5 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum5+=temp_buffer5[k];
                        }
                       
                        Array_Sort(temp_buffer6,8);// 通道6 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum6+=temp_buffer6[k];
                        }
                       
                        Array_Sort(temp_buffer7,8);// 通道7 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum7+=temp_buffer7[k];
                        }
                       
                        Array_Sort(temp_buffer8,8);// 通道8 8點排序
                        for(k=2;k<6;k++)
                        {
                                temp_sum8+=temp_buffer8[k];
                        }
                       
                        buffer_flg=0;
                       
                        temp_sum1=temp_sum1>>2;        //4點求平均
                        temp_sum2=temp_sum2>>2;
                        temp_sum3=temp_sum3>>2;
                        temp_sum4=temp_sum4>>2;
                        temp_sum5=temp_sum5>>2;
                        temp_sum6=temp_sum6>>2;
                        temp_sum7=temp_sum7>>2;
                        temp_sum8=temp_sum8>>2;
                        /*
                        temp_sum1=0x1b2;        //4點求平均
                        temp_sum2=0x1b0;
                        temp_sum3=0x1b7;
                        temp_sum4=0x1b7;
                        temp_sum5=0x1b7;
                        temp_sum6=0x1b7;
                        temp_sum7=0x1b7;
                        temp_sum8=0x1b7;
                        */
                        view_sum1[count_Vsum]=temp_sum1*49;
                        temp_sum1=0;
                        view_sum2[count_Vsum]=temp_sum2*49;
                        temp_sum2=0;
                        view_sum3[count_Vsum]=temp_sum3*49;
                        temp_sum3=0;
                        view_sum4[count_Vsum]=temp_sum4*49;
                        temp_sum4=0;
                        view_sum5[count_Vsum]=temp_sum5*49;
                        temp_sum5=0;
                        view_sum6[count_Vsum]=temp_sum6*49;
                        temp_sum6=0;
                        /*
                        view_sum7[count_Vsum]=18220;        // 24度
                        temp_sum7=0;
                        view_sum8[count_Vsum]=18220;
                        temp_sum8=0;
                        */
                        view_sum7[count_Vsum]=temp_sum7*49;
                        temp_sum7=0;
                        view_sum8[count_Vsum]=temp_sum8*49;
                        temp_sum8=0;
                       
                        if(count_Vsum>2)
                        {
                                count_Vsum=0;
                                //1
                                for(k=0;k<4;k++)
                                {
                                        temp_sum1+=        view_sum1[k];        //電壓值的累加和
                                }
                                temp_sum1=temp_sum1>>2;
                                if(temp_sum1<21000)        //正的溫度
                                {
                                        temp_sum1=(21000-temp_sum1)/11;        //設步進為11mV
                                        if((temp_sum1%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view1=temp_sum1/10;
                                        }
                                        else
                                        {
                                                tmpe_view1=temp_sum1/10;
                                                if(tmpe_view1!=0)
                                                        tmpe_view1--;        //減1
                                        }
                                        temp_sum1=0;
                                }
                                else        //負的溫度
                                {
                                        temp_sum1=(temp_sum1-21000)/11;        //設步進為11mV
                                        if((temp_sum1%10)>4)
                                        {
                                                //tmpe_view1=(temp_sum1/10)|0xff00;//加符號位
                                                tmpe_view1=temp_sum1/10;
                                                tmpe_view1=tmpe_view1|0xff00;
                                        }
                                        else
                                        {
                                                //tmpe_view1=(temp_sum1/10-1)|0x10;//加符號位
                                                tmpe_view1=temp_sum1/10;
                                                if(tmpe_view1!=0)
                                                {
                                                        tmpe_view1--;        //減1
                                                        tmpe_view1=tmpe_view1|0xff00;
                                                }
                                        }
                                        temp_sum1=0;
                                }
                               
                                //2
                                for(k=0;k<4;k++)
                                {
                                        temp_sum2+=        view_sum2[k];        //電壓值的累加和
                                }
                                temp_sum2=temp_sum2>>2;
                                if(temp_sum2<21000)
                                {
                                        temp_sum2=(21000-temp_sum2)/11;        //設步進為11mV
                                        if((temp_sum2%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view2=temp_sum2/10;
                                        }
                                        else
                                        {
                                                tmpe_view2=temp_sum2/10;
                                                if(tmpe_view2!=0)
                                                        tmpe_view2--;        //減1
                                        }
                                        temp_sum2=0;
                                }
                                else
                                {
                                        temp_sum2=(temp_sum2-21000)/11;        //設步進為11mV
                                        if((temp_sum2%10)>4)
                                        {
                                                //tmpe_view2=(temp_sum2/10)|0xff00;//加符號位
                                                tmpe_view2=temp_sum2/10;
                                                tmpe_view2=tmpe_view2|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view2=temp_sum2/10;
                                                if(tmpe_view2!=0)
                                                {
                                                        tmpe_view2--;        //減1
                                                        tmpe_view2=tmpe_view2|0xff00;
                                                }
                                        }
                                        temp_sum2=0;
                                }
                                //3
                                for(k=0;k<4;k++)
                                {
                                        temp_sum3+=        view_sum3[k];        //電壓值的累加和
                                }
                                temp_sum3=temp_sum3>>2;
                                if(temp_sum3<21000)
                                {
                                        temp_sum3=(21000-temp_sum3)/11;        //設步進為11mV
                                        if((temp_sum3%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view3=temp_sum3/10;
                                        }
                                        else
                                        {
                                                tmpe_view3=temp_sum3/10;
                                                if(tmpe_view3!=0)
                                                        tmpe_view3--;        //減1
                                        }
                                        temp_sum3=0;
                                }
                                else
                                {
                                        temp_sum3=(temp_sum3-21000)/11;        //設步進為11mV
                                        if((temp_sum3%10)>4)
                                        {
                                                //tmpe_view3=(temp_sum3/10)|0xff00;//加符號位
                                                tmpe_view3=temp_sum3/10;
                                                tmpe_view3=tmpe_view3|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view3=temp_sum3/10;
                                                if(tmpe_view3!=0)
                                                {
                                                        tmpe_view3--;        //減1
                                                        tmpe_view3=tmpe_view3|0xff00;
                                                }
                                        }
                                        temp_sum3=0;
                                }
                                //4
                                for(k=0;k<4;k++)
                                {
                                        temp_sum4+=        view_sum4[k];        //電壓值的累加和
                                }
                                temp_sum4=temp_sum4>>2;
                                if(temp_sum4<21000)
                                {
                                        temp_sum4=(21000-temp_sum4)/11;        //設步進為11mV
                                        if((temp_sum4%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view4=temp_sum4/10;
                                        }
                                        else
                                        {
                                                tmpe_view4=temp_sum4/10;
                                                if(tmpe_view4!=0)
                                                        tmpe_view4--;        //減1
                                        }
                                        temp_sum4=0;
                                }
                                else
                                {
                                        temp_sum4=(temp_sum4-21000)/11;        //設步進為11mV
                                        if((temp_sum4%10)>4)
                                        {
                                                //tmpe_view4=(temp_sum4/10)|0xff00;//加符號位
                                                tmpe_view4=temp_sum4/10;
                                                tmpe_view4=tmpe_view4|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view4=temp_sum4/10;
                                                if(tmpe_view4!=0)
                                                {
                                                        tmpe_view4--;        //減1
                                                        tmpe_view4=tmpe_view4|0xff00;
                                                }
                                        }
                                        temp_sum4=0;
                                }
                                //5
                                for(k=0;k<4;k++)
                                {
                                        temp_sum5+=        view_sum5[k];        //電壓值的累加和
                                }
                                temp_sum5=temp_sum5>>2;
                                if(temp_sum5<21000)
                                {
                                        temp_sum5=(21000-temp_sum5)/11;        //設步進為11mV
                                        if((temp_sum5%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view5=temp_sum5/10;
                                        }
                                        else
                                        {
                                                tmpe_view5=temp_sum5/10;
                                                if(tmpe_view5!=0)
                                                        tmpe_view5--;        //減1
                                        }
                                        temp_sum5=0;
                                }
                                else
                                {
                                        temp_sum5=(temp_sum5-21000)/11;        //設步進為11mV
                                        if((temp_sum5%10)>4)
                                        {
                                                //tmpe_view5=(temp_sum5/10)|0xff00;//加符號位
                                                tmpe_view5=temp_sum5/10;
                                                tmpe_view5=tmpe_view5|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view5=temp_sum5/10;
                                                if(tmpe_view5!=0)
                                                {
                                                        tmpe_view5--;        //減1
                                                        tmpe_view5=tmpe_view5|0xff00;
                                                }
                                        }
                                        temp_sum5=0;
                                }
                                //6
                                for(k=0;k<4;k++)
                                {
                                        temp_sum6+=        view_sum6[k];        //電壓值的累加和
                                }
                                temp_sum6=temp_sum6>>2;
                                if(temp_sum6<21000)
                                {
                                        temp_sum6=(21000-temp_sum6)/11;        //設步進為11mV
                                        if((temp_sum6%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view6=temp_sum6/10;
                                        }
                                        else
                                        {
                                                tmpe_view6=temp_sum6/10;
                                                if(tmpe_view6!=0)
                                                        tmpe_view6--;        //減1
                                        }
                                        temp_sum6=0;
                                }
                                else
                                {
                                        temp_sum6=(temp_sum6-21000)/11;        //設步進為11mV
                                        if((temp_sum6%10)>4)
                                        {
                                                //tmpe_view6=(temp_sum6/10)|0xff00;//加符號位
                                                tmpe_view6=temp_sum6/10;
                                                tmpe_view6=tmpe_view6|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view6=temp_sum6/10;
                                                if(tmpe_view6!=0)
                                                {
                                                        tmpe_view6--;        //減1
                                                        tmpe_view6=tmpe_view6|0xff00;
                                                }
                                        }
                                        temp_sum6=0;
                                }
                                //7
                                for(k=0;k<4;k++)
                                {
                                        temp_sum7+=        view_sum7[k];        //電壓值的累加和
                                }
                                temp_sum7=temp_sum7>>2;
                                if(temp_sum7<21000)
                                {
                                        temp_sum7=(21000-temp_sum7)/11;        //設步進為11mV
                                        if((temp_sum7%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view7=temp_sum7/10;
                                        }
                                        else
                                        {
                                                tmpe_view7=temp_sum7/10;
                                                if(tmpe_view7!=0)
                                                        tmpe_view7--;        //減1
                                        }
                                        temp_sum7=0;
                                }
                                else
                                {
                                        temp_sum7=(temp_sum7-21000)/11;        //設步進為11mV
                                        if((temp_sum7%10)>4)
                                        {
                                                //tmpe_view7=(temp_sum7/10)|0xff00;//加符號位
                                                tmpe_view7=temp_sum7/10;
                                                tmpe_view7=tmpe_view7|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view7=temp_sum7/10;
                                                if(tmpe_view7!=0)
                                                {
                                                        tmpe_view7--;        //減1
                                                        tmpe_view7=tmpe_view7|0xff00;
                                                }
                                        }
                                        temp_sum7=0;
                                }
                                //8
                                for(k=0;k<4;k++)
                                {
                                        temp_sum8+=        view_sum8[k];        //電壓值的累加和
                                }
                                temp_sum8=temp_sum8>>2;
                                if(temp_sum8<21000)
                                {
                                        temp_sum8=(21000-temp_sum8)/11;        //設步進為11mV
                                        if((temp_sum8%10)>4)        //4舍5入
                                        {                                                //為了校正,4減1,5不入
                                                tmpe_view8=temp_sum8/10;
                                        }
                                        else
                                        {
                                                tmpe_view8=temp_sum8/10;
                                                if(tmpe_view8!=0)
                                                        tmpe_view8--;        //減1
                                        }
                                        temp_sum8=0;
                                }
                                else
                                {
                                        temp_sum8=(temp_sum8-21000)/11;        //設步進為11mV
                                        if((temp_sum8%10)>4)
                                        {
                                                //tmpe_view8=(temp_sum8/10)|0xff00;//加符號位
                                                tmpe_view8=temp_sum8/10;
                                                tmpe_view8=tmpe_view8|0xff00;
                                        }
                                        else
                                        {
                                                tmpe_view8=temp_sum8/10;
                                                if(tmpe_view8!=0)
                                                {
                                                        tmpe_view8--;        //減1
                                                        tmpe_view8=tmpe_view8|0xff00;
                                                }
                                        }
                                        temp_sum8=0;
                                }
                        //發送數據更新
                                ram_data[0]=tmpe_view1;
                                ram_data[1]=tmpe_view2;
                                ram_data[2]=tmpe_view3;
                                ram_data[3]=tmpe_view4;
                                ram_data[4]=tmpe_view5;
                                ram_data[5]=tmpe_view6;
                                ram_data[6]=tmpe_view7;
                                ram_data[7]=tmpe_view8;
                        }
                        else
                                count_Vsum++;
                       
                }
        // 2 發送溫度
                if(recv_ok==1)       
                {       
                        com_recv();
                }
        // 3 清狗
                if(flg_300ms!=0)
                {
                        asm("FCLR I");
                        wdtr=0x00;
                        wdtr=0xff;
                        asm("FSET I");        //開中斷
                        flg_300ms=0;
                }
        }
}

//排序(Low to High)
void Array_Sort(unsigned int *Array, unsigned char num)
{
    unsigned char  i, j ;
    unsigned int tmp;
    for(i = num -1; i > 0; i--)
        {
            for(j = 0; j < i ; j++)
                {
                    if(Array[j] > Array[j+1])
                        {
                            tmp = Array[j+1];
                            Array[j+1] = Array[j];
                            Array[j] = tmp;
                        }                       
                }
        }
}
/**********單字節CRC校驗****************/
void CRC_byte(unsigned char byte)
{
    CRC_data=(CRC_data >> 8)^crc_table[(CRC_data&0xff)^byte];
}
/**************************************/
void CRC_string(unsigned char p )
{
        unsigned char i;
        CRC_data=0xffff;
        for(i=0;i<p;i++)
        {
                CRC_byte(send_data[i]);
        }
}
void init_UART0(void)
{
        s0ric=0x06;                //接收數據設置中斷為6級
        s0tic=0x04;                //發送數據中斷為4級
        u0mr=0x05;                //異步方式,數據長度為8位,1個停止位,無奇偶校驗
        u0c0=0x00;                //LSB格式,f1,發送完成,CMOS輸出
        u0brg=0x40;                //設置波特率為9600
        u0c1=0x15;                //允許發送,允許接收,發送完成中斷
        p1_6=0;                        //485先設為輸入
}

void _uart0_trance(void)/*串口0發送中斷*/
{
        asm("FSET I");        /*開中斷*/
        if(send_count!=0)
        {
                u0tb=send_data[tx_count];
                send_count--;
                tx_count++;
        }
        else
        {
                p1_6=0;     //發完,485設為輸入
                re_u0c1=1;
        }
}

// 串口接收中斷
void _uart0_receive(void)  
{
        static unsigned int r_data;                                        /*接收暫存*/
        static unsigned int r_crc_data;                                /*CRC暫存*/
        static unsigned char crc_receive;                        /*接收CRC字節標志*/
        asm("FSET I");        /*開中斷*/
        r_data=u0rb;
        if(r_data&0xf000!=0)        //判有沒有出錯
        {
                r_data=u0rb;
                com_count==0;
        }
        r_data&=0x00ff;                //只要低字節
        if(com_count==0)                               /*如果是第一次接收*/
        {
                CRC_data=0xffff;
                count_all=0;
                crc_receive=0;        //接收CRC字節標志
               
                if(r_data==ADDR_s1)        /*地址配對*/
                {
                        recv_data[com_count++]=r_data;
                        CRC_byte(r_data);                /*第一個字節CRC*/
                        //set_time_re(delay15);        /*設定1.5字符時間*/
                        //}
                        //else
                        //{
                        //set_time_re(delay35);                        /*放棄,等待3.5字符時間*/
                }
                else
                {
                        com_count=0;
                        CRC_data=0xffff;
                }
       
        }
        else                /*第二個以后的字節*/
        {
                //if(time_15==0)
                //{
                        recv_data[com_count++]=r_data;
                        if(crc_receive==0)                                      /*沒到CRC字節*/
                        {
                                CRC_byte(r_data);                                /*字節CRC*/
                        }
                        if(com_count==6)                                        /*收到6個字節后通過功能碼判斷這幀數據的長度*/
                        {
                                switch(recv_data[1])                  /*選擇功能碼,好確定接收的總個數*/
                {
                                        case 0x03:
                            {
                                count_all=8;        /*功能為03H的字節數都位8個*/
                                       break;
                                                }
                    case 0x10:
                            {
                                       count_all=(recv_data[5]<<1)+9;        /*功能為10H的字節數為變量個數乘2*/
                                       break;                                                        /*除了變量字節數,還有9個字節*/
                            }
                    default :
                                                {
                                                        com_count=0;
                                                        CRC_data=0xffff;
                                                        break;                                     /*出錯*/
                                                }
                                }
                         }
                         if(com_count==(count_all-2))
                         {
                                crc_receive=1;
                         }
                        if(com_count==count_all)        /*是否收完*/
                        {
                                r_crc_data=(recv_data[com_count-1]<<8)|recv_data[com_count-2];
                                if(CRC_data!=r_crc_data)        /*CRC是否出錯*/
                                {
                                        //time_35=0;
                                        //set_time_re(delay35);        /*放棄,等待3.5字符時間*/
                                        com_count=0;
                                        CRC_data=0xffff;
                                }
                                else        /*接收完成*/
                                {
                                        re_u0c1=0;
                                        recv_ok=1;
                                        crc_receive=0;
                                        count_all=0;
                                        //set_time_re(delay35);        /*重新等待3.5字符時間,收完1幀后復位定時器*/
                                        com_count=0;
                                        CRC_data=0xffff;
                                }
                        }
                        //else
                        //{
                        //        set_time_re(delay15);        /*設定1.5字符時間,收完1個字節后復位定時器*/
                        //}
                //}
                //else        /*1.5字符超時*/
                //{
                //        set_time_re(delay35);        /*重新等待3.5字符時間*/
                //}
                       
        }
}
/********485通訊接收處理*******/
void com_recv(void)
{
        recv_ok=0;
        /*讀寄存器功能碼03H處理*/
        if(recv_data[1]==0x03)        //讀寄存器(功能碼03H)處理
        {
                //if(recv_data[0]!=0)//地址不為0
                //{
                        send_data[0]=ADDR_s1;                        //本機地址
                        send_data[1]=0x03;                                //功能碼
                        send_data[2]=recv_data[5]<<1;        //字節數(變量個數不清 x 2 =字節數)
                        send_count=send_data[2];
                        while(send_count!=0)
                        {
                                send_data[send_i+3]=(ram_data[recv_data[3]+send_j]&0xff00)>>8;        //取變量高字節
                                send_i++;
                                send_data[send_i+3]=ram_data[recv_data[3]+send_j]&0x00ff;                //取變量低字節
                                send_i++;
                                send_j++;
                                send_count--;
                        }
                        CRC_string(send_data[2]+3);                                                //發送數據串CRC校驗  總字節數+開頭的3個字節
                        send_data[send_data[2]+3]=(CRC_data&0x00ff);        //CRC校驗碼低字節
                        send_data[send_data[2]+4]=(CRC_data&0xff00)>>8;        //CRC校驗碼高字節
                        send_count=send_data[2]+5;
                        p1_6=1;                        //485設為輸出
                        re_u0c1=0;                //不允許接收
                        tx_count=1;
                        send_count--;
                        u0tb=send_data[0];
                        CRC_data=0xffff;
                        send_i=0;
                        send_j=0;
                        //red_addr_flg=0;
                //}
                //else
                //{
                //        re_u0c1=1;        //允許串口接收       
                //}
        }
        else
        {
               
        /*  if((status.stu.far_near==1)&&(recv_data[0]!=0))        //為遠程和地址不為0才能設置
                {                       
        //功能碼10H處理                                       
                        if(recv_data[1]==0x10)        //寫寄存器(功能碼10H)處理
                        {
                        //********10H功能給主機返饋***********
                                send_data[0]=ADDR_s1;                        //本機地址
                                send_data[1]=0x10;                                //功能碼
                                send_data[2]=recv_data[2];                //變量起始地址高字節
                                send_data[3]=recv_data[3];                //變量起始地址低字節
                                send_data[4]=recv_data[4];                //變量個數高字節
                                send_data[5]=recv_data[5];                //變量個數低字節
                                CRC_string(6);                                        //發送數據串CRC校驗
                                send_data[6]=(CRC_data&0x00ff);        //CRC校驗碼低字節
                                send_data[7]=(CRC_data&0xff00)>>8;//CRC校驗碼高字節
                                p1_6=1;                                                        //485設為輸出
                                re_u0c1=0;                                                //不允許接收
                                tx_count=1;                                                //指向第二個字節
                                send_count=7;                                        //后續字節在發送中斷中發
                                u0tb=send_data[0];                                //發第一個字節
                                CRC_data=0xffff;
                        //**************************************       
                        //**********裝載收到的數據*************
                                               
                                load_count=recv_data[5];//變量個數
                                send_i=7;                                //recv_data[7]開始為數據
                                while(load_count!=0)
                                {
                                        ram_data[recv_data[3]+send_j]=recv_data[send_i]<<8;
                                        send_i++;
                                        ram_data[recv_data[3]+send_j]=ram_data[recv_data[3]+send_j]|recv_data[send_i];
                                        send_i++;
                                        send_j++;
                                        load_count--;
                                }
                                ram_data[1]=status.stus;//狀態不能寫
                                if((ram_data[16]==0x0008)||(ram_data[16]==0x0009)||(ram_data[16]==0x000a))
                                {
                                        ram_data[16]=0x0008;
                                }
                                send_i=0;
                                send_j=0;
                                //time_spke=0;            //聲音延時時間清零
                                //delay_spke_flg=1;   //聲音延時標志
                        }
                }
                */
                re_u0c1=1;        //允許串口接收
        }
}
回復

使用道具 舉報

13#
ID:789121 發表于 2020-7-14 14:27 | 只看該作者
Ww10W 發表于 2020-7-11 09:44
師兄,我想請問一下,在485通信的基礎上怎么添加modbus協議,小白請教

modbus協議主要是規定了你發送數據的格式,比如說字符串第一個字節代表通信設備的地址 第二個字節表示功能代碼或者寄存器地址……,參考網上的程序和modbus協議封裝成函數就可以
回復

使用道具 舉報

14#
ID:620768 發表于 2022-4-7 17:02 | 只看該作者
發代碼的哥們是真的頂
回復

使用道具 舉報

15#
ID:587810 發表于 2022-4-8 08:08 來自手機 | 只看該作者
硬件部分已經有了,主要是看你的傳感器支持的通訊協議是哪一種,還有就是到那個地址去讀傳感器的數據
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99这里只有精品视频 | 亚洲精品乱码久久久久久久久久 | 亚洲一区二区三区在线视频 | 亚州影院| 国产精品视频久久 | 日本三级播放 | 日韩精品一区二区三区 | 正在播放国产精品 | 欧美专区在线观看 | 91视频官网| 国产在线精品一区二区 | 在线观看不卡av | 亚洲在线一区二区 | 久久人爽 | 久久久亚洲综合 | 国产1区2区在线观看 | 久久久久久国产精品 | 国产一区二区三区高清 | 亚洲视频在线看 | 成人激情视频在线 | 羞羞在线视频 | 中日av| 亚洲午夜精品一区二区三区 | 亚洲欧美激情国产综合久久久 | 久久亚洲国产 | 欧美在线一区视频 | 午夜影院在线 | 日本三级电影在线免费观看 | 国产乡下妇女做爰 | 久久麻豆精品 | 午夜爽爽爽男女免费观看 | 国产精品九九九 | 国产精品3区 | 欧美中文一区 | 一区二区三区av | 国产欧美一区二区久久性色99 | 午夜影院在线观看免费 | 成人二区 | 日本大片在线播放 | 麻豆久久久9性大片 | 91精品久久久久久久久久入口 |