找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

顯控HMI與單片機(jī)通訊案例(含單片機(jī)底層程序源碼)

  [復(fù)制鏈接]
ID:283200 發(fā)表于 2018-4-20 09:25 | 顯示全部樓層 |閱讀模式
看到51hei上面有多人需要給大家分享下顯控HMI與單片機(jī)通訊案例(含單片機(jī)底層),顯控觸摸屏盒51單片機(jī)通過MODBUS協(xié)議通訊,讀寫數(shù)據(jù)和監(jiān)視位狀態(tài),附觸摸屏案例和單片機(jī)工程源碼與快速接線模塊。

還附帶了單片機(jī)MODBUS通信測試.drw文件.

0.jpg

單片機(jī)源程序如下:
  1. /********************************************
  2.   samkoon深圳顯控自動化技術(shù)
  3. **********************************************/
  4. /********文件信息*****************************
  5. 名稱:main.c
  6. 功能:系統(tǒng)執(zhí)行文件
  7. 創(chuàng)建者:徐思*
  8. 適用工程:MODBUS RTU SALVE 通信單片機(jī)底層案例
  9. ***********************************************/

  10. /********************************************************************************
  11. 本段程序用于和samkoon觸摸屏使用MODBUS RTU協(xié)議通信,單片機(jī)作為從站,232連接
  12. samkoon MODBUS 主站功能碼說明:
  13. 1、0x:讀寫位狀態(tài),讀時發(fā)功能碼 01 寫時發(fā)功能碼05;
  14. 2、1x:讀輸入位狀態(tài);發(fā)功能碼 02;
  15. 3、3x:讀輸入寄存器,發(fā)功能碼 04;
  16. 4、4x:讀寫寄存器,讀時發(fā)功能碼 03,寫時發(fā)功能碼 06,寫32位時發(fā)功能碼 10;
  17. 5、3X-D:讀兩個寄存器 功能碼:03;
  18. 6、4X-D:寫兩個寄存器,功能碼 10,讀32位時讀上來的數(shù)據(jù)和使用4X高低字節(jié)剛好相反
  19. 7、3x_bit:讀輸入寄存器的位,發(fā)功能碼:04;
  20. 8、4x_bit:讀寫寄存器的位,讀時發(fā)功能碼:03,寫時發(fā)功能碼:06;
  21. **********************************************************************************/

  22. /*---如果要在程序使用該程序,請在程序中注明使用了顯控公司資料---*/
  23. /*---如果要在文章使用該程序,請在文章中注明使用了顯控公司資料---*/


  24. #include"main.h"

  25. u8 Reciver_Buf;
  26. u8 rece_index=0;
  27. u8 idata sendBuf[75];  //定義發(fā)送數(shù)組,最大允許發(fā)送32個字,64個字節(jié)
  28. u8 idata receBuf[75];        //定義接收數(shù)組,最大允許接收32個字,64個字節(jié)寫入
  29. u8 *ps=sendBuf;
  30. u8 *pr=receBuf;
  31. u8 comm_END;
  32. u8 comm_time_out;
  33. u8 Reciver_bit=0;
  34. u16 R_ISP_L;
  35. u16 R_ISP_H;

  36. /*初始化函數(shù)*/
  37. void init()
  38. {
  39.   int i;

  40.   TMOD=0X21;   //設(shè)定定時器1的工作方式為2,及8位初值自動重裝的8位定時器,用于產(chǎn)生波特率,T0工作方式1,用于判斷通信幀結(jié)束
  41.   TH1=0XFD;    //設(shè)置定時器的初值為0xfd,是按照9600的波特率計算出來的數(shù)值
  42.   TL1=0XFD;    //定時器高低位數(shù)值一樣,方式2下,定時器自動將高位的數(shù)值裝入低位,所以設(shè)定的時間要一致
  43.   TH0=(65536-11111)/256;  //T0設(shè)定為1ms定時器, 用于判斷通信幀結(jié)束,同時可用于其他的定時作用
  44.   TL0=(65536-11111)%256;  //T0低位
  45.   TR1=1;       //啟動T1定時器

  46.   REN=1;      //運行串口接收數(shù)據(jù),REN=1允許串口接收,REN=0禁止串口接收數(shù)據(jù)
  47.   SM0=0;      //設(shè)置串口工作方式為1,即10位異步通信,1起始位,8數(shù)據(jù)位,1停止位
  48.   SM1=1;      //同上,REN、SM0、SM1同屬于SCON寄存器,但是SCON寄存器允許位尋址
  49.   EA=1;       //開總中斷
  50.   ES=1;       //開串口中斷
  51.   ET0=1;      //開定時器中斷
  52.   TR0=1;       //啟動T0定時器

  53.   P1=0xff;            //復(fù)位所有輸出                  
  54.   relay=1;
  55.   bee=1;
  56.   
  57.   for(i=0;i<32;i++)          //復(fù)位所有
  58.   {
  59.    *(pb+i)=0;
  60.    *(pw+i)=0;
  61.    inputBit[i]=0;
  62.   }
  63.   for(i=0;i<32;i++)                   //讀出存在內(nèi)部E2PROM內(nèi)的值
  64.   {
  65.      R_ISP_L=read_ISP(0x2000+i*2);     //讀出數(shù)據(jù)低位
  66.          R_ISP_H=read_ISP(0x2000+i*2+1);   //讀出數(shù)據(jù)高位
  67.     *(pw+i)=((R_ISP_H<<8)&0xff00)+(R_ISP_L&0Xff); //組合數(shù)據(jù)
  68.   }

  69. }

  70. /*********************************************************************************
  71. 手動調(diào)試函數(shù),通過在觸摸屏上操作相對應(yīng)的位來控制單片機(jī)的手動輸出
  72. 相對應(yīng)的位說明:
  73. 0x0: 手動自動切換位,0:自動,1:手動
  74. 0x1-0x10;輸出口1-10;
  75. ***********************************************************************************/
  76. void adj()
  77. {
  78.      u8 i,j=0;       //j要有初值=0;
  79.          for(i=1;i<9;i++)
  80.          {
  81.            j=(u8)((*(pb+i)&0x01)<<(i-1))+j;
  82.          }          
  83.          P1=~j;
  84.         relay=(~(*(pb+9)))&0x01;
  85.         bee=(~(*(pb+10)))&0x01;

  86. }

  87. /**********************************************************************************

  88. 將數(shù)值保存在內(nèi)部E2PROM中
  89. 0x11:在觸摸屏上的保存按鈕
  90. ************************************************************************************/
  91. void saveData()
  92. {
  93.   u8 i;
  94.   sectorerase(0x2000);           //擦除扇區(qū),這邊寫入的是第一扇區(qū),在擦除是整個扇區(qū)被擦除
  95.   for(i=0;i<32;i++)
  96.   {
  97.     write_ISP((0X2000+i*2),(*(pw+i)&0xff));     //保存低8位數(shù)據(jù)
  98.         write_ISP((0x2000+i*2+1),((*(pw+i)>>8)&0xff));  //保存高8位數(shù)據(jù)
  99.   }
  100.     *(pb+11)=0;                   //保存按妞復(fù)位
  101.    
  102. }

  103. /*主函數(shù)*/
  104. void main()
  105. {

  106. init();                    //執(zhí)行初始化程序
  107. while(1)                  //執(zhí)行運行程序
  108. {
  109.    if(*(pb+0)) adj();         //手動調(diào)試
  110.    if(*(pb+11)) saveData();   //保存數(shù)值

  111. }
  112. }
  113. /*串口中斷服務(wù)*/
  114. void ser() interrupt 4           //串口中斷的序號是4
  115. {
  116.          RI=0;                        //產(chǎn)生串口中斷時RI被硬件置1,在串口中斷服務(wù)程序中需要用軟件清0;
  117.          comm_END=4;                  //9600的波特率下,等待3.5個字節(jié)需要約4ms的時間
  118.          Reciver_bit=1;              //產(chǎn)生一次中斷置一次位
  119.          Reciver_Buf=SBUF;                    //將接收到的數(shù)據(jù)賦給一個變量;
  120.          receBuf[rece_index++]=Reciver_Buf;   //將接收到的數(shù)據(jù)存入接收數(shù)組                  
  121. }

  122. /*T0中斷服務(wù)程序*/

  123. void comm_stop() interrupt 1
  124. {
  125.   u8 i;
  126.   TH0=(65536-11111)/256;  //重裝T0
  127.   TL0=(65536-11111)%256;  //T0低位
  128.   if(Reciver_bit&&comm_END!=0)
  129.     comm_END--;
  130.   if(comm_END==0)
  131.    {
  132.      Reciver_bit=0;                     //幀接收,對標(biāo)志位清零                  
  133.      if((*(pr+0)==0x01||*(pr+0)==0x00)&&rece_index>=8)    //判斷是否為本站地址或者是廣播地址,有效報文的字節(jié)數(shù)量最少是8個字節(jié)
  134.        {
  135.               AnalyzeRecieve();                              //分析并生成響應(yīng)報文
  136.                   if(*(pr+0)==0x01)                              //廣播模式下不用返回
  137.               send_comm();                                   //發(fā)送響應(yīng)報文
  138.        }             
  139.         comm_END=4;                                //重新賦延時初值
  140.         rece_index=0;                                   //數(shù)組長度清零
  141.         for(i=0;i<75;i++)                            //清空接收數(shù)組
  142.         receBuf[i]=0;
  143.         Reciver_Buf=0;                          
  144.    }
  145.          

  146. }                                       
復(fù)制代碼
  1. /********************************************
  2.   samkoon
  3. **********************************************/
  4. /********文件信息*****************************
  5. 名稱:main.h
  6. 功能:本段程序?qū)崿F(xiàn)數(shù)據(jù)的E2PROM操作,實現(xiàn)數(shù)據(jù)斷電保持功能
  7. 創(chuàng)建者:徐思坤
  8. 適用工程:MODBUS RTU SALVE 通信單片機(jī)底層案例
  9. ***********************************************/

  10. /*---如果要在程序使用該程序,請在程序中注明使用了顯控公司資料---*/
  11. /*---如果要在文章使用該程序,請在文章中注明使用了顯控公司資料---*/

  12. #include <intrins.h>
  13. #include"main.h"
  14. //#define _nop_()     //定義一個空函數(shù)

  15. /***************************************************************
  16. * 定義ISP/IAP操作命令,控制寄存器地址:ISP_CMD E5H             *
  17. * 1、0x00:  待機(jī)命令,ISP無操作;                              *
  18. * 2、0x01: 對用戶的應(yīng)用程序FLASH區(qū)及數(shù)據(jù)FLASH區(qū)字節(jié)讀         *
  19. * 3、0x02:  對用戶的應(yīng)用程序FLASH區(qū)及數(shù)據(jù)FLASH區(qū)字節(jié)編程       *
  20. * 4、0x03:        對用戶的應(yīng)用程序FLASH區(qū)及數(shù)據(jù)FLASH區(qū)字節(jié)擦除       *
  21. ***************************************************************/
  22. #define RDCommand 0x01
  23. #define PRGCommand 0x02
  24. #define ERASECommand 0x03


  25. #define waittime 0x01       //定義CPU的等待時間

  26. /*開始ISP寄存器聲明*/

  27. sfr ISP_DATA=0xE2;         //FLASH數(shù)據(jù)寄存區(qū)
  28. sfr ISP_ADDRH=0xE3;        //FLASH高字節(jié)地址寄存器
  29. sfr ISP_ADDRL=0xE4;        //FLASH低字節(jié)地址寄存器
  30. sfr ISP_CMD=0xE5;       //FLASH命令寄存器
  31. sfr ISP_TRIG=0xE6;       //FLASH命令觸發(fā)寄存器
  32. sfr ISP_CONTR=0xE7;       //ISP/IAP控制寄存器


  33. /*打開ISP/IAP功能*/

  34. void ISP_enable(void)
  35. {
  36.        
  37. //        ISP_CONTR=ISP_CONTR&0X18;     //初始化SP/IAP控制寄存器;
  38.         ISP_CONTR=waittime;           //寫入硬件延時,注意這邊是“|”運算
  39.         ISP_CONTR=ISP_CONTR|0x80;      //打開ISPEN,運行寫入,注意是“|”運算
  40.        
  41.          
  42. }

  43. /*關(guān)閉ISP/IAP功能*/

  44. void ISP_disable(void)
  45. {
  46.   ISP_CONTR=ISP_CONTR&0x00;      //關(guān)閉ISPEN,運行寫入,注意是“&”運算
  47.   ISP_TRIG=0x00;                 //清空ISP命令控制觸發(fā)器
  48.   ISP_CMD=0x00;
  49. // EA=1;                          //打開中斷
  50. }

  51. /*建立公用觸發(fā)函數(shù)*/

  52. void go_ISP(void)
  53. {

  54.   ISP_TRIG=0x46;         //觸發(fā)ISP/IAP命令字節(jié)1,(固定)
  55.   ISP_TRIG=0xB9;         //觸發(fā)ISP/IAP命令字節(jié)2,(固定)
  56.   _nop_();              //執(zhí)行一個空函數(shù)
  57. }

  58. /*扇區(qū)擦除函數(shù)*/

  59. void sectorerase(u16 addr)
  60. {
  61.    ISP_ADDRH=(u8)(addr>>8);        /*取地址的高位*/
  62.    ISP_ADDRL=(u8)(addr&0xff);           //地址的低位
  63. //  EA=0;             //關(guān)閉總中斷
  64.    ISP_enable();          //打開ISP/IAP功能
  65.    ISP_CMD=ERASECommand;   //從新給ISP命令寄存器賦值,這邊賦的是0x03,表示擦除
  66.    go_ISP();                       //執(zhí)行觸發(fā)命令,將擦除命令寫入
  67.    ISP_disable();                  //關(guān)閉ISP功能
  68. }

  69. /*寫數(shù)據(jù)函數(shù)(單個字節(jié)寫入)*/

  70. void write_ISP(u16 st_addr,u8 w_data)
  71. {
  72.   ISP_DATA=w_data;                //將要寫入的數(shù)據(jù)存入ISP FLASH數(shù)據(jù)寄存區(qū)
  73.   ISP_ADDRH=(u8)(st_addr>>8);        /*取地址的高位*/
  74.   ISP_ADDRL=(u8)(st_addr&0xff);           //地址的低位
  75. // EA=0;             //關(guān)閉總中斷
  76.   ISP_enable();          //打開ISP/IAP功能
  77.   ISP_CMD=PRGCommand;   //從新給ISP命令寄存器賦值,這邊賦的是0x02,表示寫入
  78.   go_ISP();                    //觸發(fā)寫入
  79.   ISP_disable();               //關(guān)閉ISP功能
  80. }

  81. /*讀數(shù)據(jù)函數(shù)(讀單個字節(jié))*/

  82. u8 read_ISP(u16 rd_addr)
  83. {
  84.   ISP_ADDRH=(u8)(rd_addr>>8);        /*取地址的高位*/
  85.   ISP_ADDRL=(u8)(rd_addr&0x00ff);           //地址的低位
  86.   ISP_CMD=ISP_CMD&0xF8;           // 清空ISP命令寄存器的第三位
  87. //  EA=0;                          //關(guān)閉總中斷
  88.   ISP_enable();                 //打開ISP/IAP功能
  89.   ISP_CMD=RDCommand;           //從新給ISP命令寄存器賦值,這邊賦的是0x01,表示讀出
  90.   go_ISP();                    //觸發(fā)寫入
  91.   ISP_disable();               //關(guān)閉ISP功能
  92.   return (ISP_DATA);          //返回讀出的數(shù)據(jù)
  93. ……………………

  94. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:

顯控HMI與單片機(jī)通訊案例(含單片機(jī)底層) (0).rar (809.72 KB, 下載次數(shù): 431)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復(fù)

使用道具 舉報

ID:53978 發(fā)表于 2018-5-19 21:55 | 顯示全部樓層
謝謝 下載來學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:362603 發(fā)表于 2018-7-1 17:10 | 顯示全部樓層
你好,我用功能代碼1通訊,老是通訊超時,這個怎么辦
回復(fù)

使用道具 舉報

ID:362603 發(fā)表于 2018-7-1 17:12 | 顯示全部樓層
你好,我用功能代碼01通訊,老是超時,怎么辦了
回復(fù)

使用道具 舉報

ID:386692 發(fā)表于 2018-8-21 20:01 | 顯示全部樓層
51單片機(jī)接收到01,02,03等會作出響應(yīng)。那顯控觸摸屏是在哪里設(shè)置發(fā)送01,02,03等modbus碼??
回復(fù)

使用道具 舉報

ID:150905 發(fā)表于 2018-10-22 14:54 | 顯示全部樓層
還附帶了單片機(jī)MODBUS通信測試.drw文件
回復(fù)

使用道具 舉報

ID:428974 發(fā)表于 2018-11-19 08:08 | 顯示全部樓層
什么是特定用戶啊 ,為什么我不能下載呢,我正在用一塊顯控屏 和AVr單片機(jī)的通信,正好借看下 先謝謝了
回復(fù)

使用道具 舉報

ID:430332 發(fā)表于 2018-11-21 08:41 | 顯示全部樓層
好復(fù)雜
回復(fù)

使用道具 舉報

ID:307784 發(fā)表于 2018-11-29 20:24 | 顯示全部樓層
過來學(xué)習(xí)了
回復(fù)

使用道具 舉報

ID:307784 發(fā)表于 2018-11-29 20:26 | 顯示全部樓層
之前都是威綸通的,顯控的modbus地址寫不進(jìn)去,不管從站或主站
各們可以說下是什么問題嗎
回復(fù)

使用道具 舉報

ID:448641 發(fā)表于 2018-12-18 09:54 | 顯示全部樓層
我正在用一塊顯控屏 和RL78單片機(jī)的通信,正好借看下 先謝謝了
回復(fù)

使用道具 舉報

ID:419837 發(fā)表于 2019-3-14 08:29 | 顯示全部樓層
真好,正好要學(xué)習(xí)。
回復(fù)

使用道具 舉報

ID:138443 發(fā)表于 2019-3-17 19:39 | 顯示全部樓層
支持支持,多謝
回復(fù)

使用道具 舉報

ID:544217 發(fā)表于 2019-5-21 21:38 | 顯示全部樓層
非常好,支持
回復(fù)

使用道具 舉報

ID:138443 發(fā)表于 2019-7-20 00:09 | 顯示全部樓層
太好了,支持一下,謝謝
回復(fù)

使用道具 舉報

ID:428400 發(fā)表于 2019-7-22 21:33 | 顯示全部樓層
這個鏈接顯控哪一款的觸摸屏啊
回復(fù)

使用道具 舉報

ID:602115 發(fā)表于 2019-8-25 19:58 | 顯示全部樓層
已下載,謝謝分享。
回復(fù)

使用道具 舉報

ID:398080 發(fā)表于 2019-9-2 19:37 | 顯示全部樓層
一下載,感謝分享
回復(fù)

使用道具 舉報

ID:109277 發(fā)表于 2019-11-6 15:54 | 顯示全部樓層
謝謝分享,看看
回復(fù)

使用道具 舉報

ID:428400 發(fā)表于 2019-11-7 18:54 | 顯示全部樓層
怎么修改輸出點?有大師請指點下!謝謝
回復(fù)

使用道具 舉報

ID:722051 發(fā)表于 2020-4-4 06:29 | 顯示全部樓層
怎樣下載
回復(fù)

使用道具 舉報

ID:1004539 發(fā)表于 2022-2-9 16:54 | 顯示全部樓層
正在學(xué)習(xí),很需要這方面的資料,謝謝
回復(fù)

使用道具 舉報

ID:228452 發(fā)表于 2022-4-7 04:42 | 顯示全部樓層
Hello
What kind of HMI to use
回復(fù)

使用道具 舉報

ID:1045493 發(fā)表于 2022-10-25 23:09 | 顯示全部樓層
單片機(jī)用的啥型號的。
回復(fù)

使用道具 舉報

ID:228452 發(fā)表于 2022-11-21 02:12 | 顯示全部樓層
MCU is  C51 modbus code
回復(fù)

使用道具 舉報

ID:310569 發(fā)表于 2023-3-20 15:59 | 顯示全部樓層
很好,這個正想學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:1006852 發(fā)表于 2023-10-21 11:56 | 顯示全部樓層
有沒有指定具體需要用哪個型號的單片機(jī)?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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