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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
看到51hei上面有多人需要給大家分享下顯控HMI與單片機通訊案例(含單片機底層),顯控觸摸屏盒51單片機通過MODBUS協議通訊,讀寫數據和監視位狀態,附觸摸屏案例和單片機工程源碼與快速接線模塊。

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



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

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

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


  24. #include"main.h"

  25. u8 Reciver_Buf;
  26. u8 rece_index=0;
  27. u8 idata sendBuf[75];  //定義發送數組,最大允許發送32個字,64個字節
  28. u8 idata receBuf[75];        //定義接收數組,最大允許接收32個字,64個字節寫入
  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. /*初始化函數*/
  37. void init()
  38. {
  39.   int i;

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

  46.   REN=1;      //運行串口接收數據,REN=1允許串口接收,REN=0禁止串口接收數據
  47.   SM0=0;      //設置串口工作方式為1,即10位異步通信,1起始位,8數據位,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;            //復位所有輸出                  
  54.   relay=1;
  55.   bee=1;
  56.   
  57.   for(i=0;i<32;i++)          //復位所有
  58.   {
  59.    *(pb+i)=0;
  60.    *(pw+i)=0;
  61.    inputBit[i]=0;
  62.   }
  63.   for(i=0;i<32;i++)                   //讀出存在內部E2PROM內的值
  64.   {
  65.      R_ISP_L=read_ISP(0x2000+i*2);     //讀出數據低位
  66.          R_ISP_H=read_ISP(0x2000+i*2+1);   //讀出數據高位
  67.     *(pw+i)=((R_ISP_H<<8)&0xff00)+(R_ISP_L&0Xff); //組合數據
  68.   }

  69. }

  70. /*********************************************************************************
  71. 手動調試函數,通過在觸摸屏上操作相對應的位來控制單片機的手動輸出
  72. 相對應的位說明:
  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. 將數值保存在內部E2PROM中
  89. 0x11:在觸摸屏上的保存按鈕
  90. ************************************************************************************/
  91. void saveData()
  92. {
  93.   u8 i;
  94.   sectorerase(0x2000);           //擦除扇區,這邊寫入的是第一扇區,在擦除是整個扇區被擦除
  95.   for(i=0;i<32;i++)
  96.   {
  97.     write_ISP((0X2000+i*2),(*(pw+i)&0xff));     //保存低8位數據
  98.         write_ISP((0x2000+i*2+1),((*(pw+i)>>8)&0xff));  //保存高8位數據
  99.   }
  100.     *(pb+11)=0;                   //保存按妞復位
  101.    
  102. }

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

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

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

  122. /*T0中斷服務程序*/

  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;                     //幀接收,對標志位清零                  
  133.      if((*(pr+0)==0x01||*(pr+0)==0x00)&&rece_index>=8)    //判斷是否為本站地址或者是廣播地址,有效報文的字節數量最少是8個字節
  134.        {
  135.               AnalyzeRecieve();                              //分析并生成響應報文
  136.                   if(*(pr+0)==0x01)                              //廣播模式下不用返回
  137.               send_comm();                                   //發送響應報文
  138.        }             
  139.         comm_END=4;                                //重新賦延時初值
  140.         rece_index=0;                                   //數組長度清零
  141.         for(i=0;i<75;i++)                            //清空接收數組
  142.         receBuf[i]=0;
  143.         Reciver_Buf=0;                          
  144.    }
  145.          

  146. }                                       
復制代碼
  1. /********************************************
  2.   samkoon
  3. **********************************************/
  4. /********文件信息*****************************
  5. 名稱:main.h
  6. 功能:本段程序實現數據的E2PROM操作,實現數據斷電保持功能
  7. 創建者:徐思坤
  8. 適用工程:MODBUS RTU SALVE 通信單片機底層案例
  9. ***********************************************/

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

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

  15. /***************************************************************
  16. * 定義ISP/IAP操作命令,控制寄存器地址:ISP_CMD E5H             *
  17. * 1、0x00:  待機命令,ISP無操作;                              *
  18. * 2、0x01: 對用戶的應用程序FLASH區及數據FLASH區字節讀         *
  19. * 3、0x02:  對用戶的應用程序FLASH區及數據FLASH區字節編程       *
  20. * 4、0x03:        對用戶的應用程序FLASH區及數據FLASH區字節擦除       *
  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數據寄存區
  28. sfr ISP_ADDRH=0xE3;        //FLASH高字節地址寄存器
  29. sfr ISP_ADDRL=0xE4;        //FLASH低字節地址寄存器
  30. sfr ISP_CMD=0xE5;       //FLASH命令寄存器
  31. sfr ISP_TRIG=0xE6;       //FLASH命令觸發寄存器
  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. /*關閉ISP/IAP功能*/

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

  51. /*建立公用觸發函數*/

  52. void go_ISP(void)
  53. {

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

  58. /*扇區擦除函數*/

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

  69. /*寫數據函數(單個字節寫入)*/

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

  81. /*讀數據函數(讀單個字節)*/

  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;                          //關閉總中斷
  88.   ISP_enable();                 //打開ISP/IAP功能
  89.   ISP_CMD=RDCommand;           //從新給ISP命令寄存器賦值,這邊賦的是0x01,表示讀出
  90.   go_ISP();                    //觸發寫入
  91.   ISP_disable();               //關閉ISP功能
  92.   return (ISP_DATA);          //返回讀出的數據
  93. ……………………

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

所有資料51hei提供下載:

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


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:53978 發表于 2018-5-19 21:55 | 只看該作者
謝謝 下載來學習學習
回復

使用道具 舉報

板凳
ID:362603 發表于 2018-7-1 17:10 | 只看該作者
你好,我用功能代碼1通訊,老是通訊超時,這個怎么辦
回復

使用道具 舉報

地板
ID:362603 發表于 2018-7-1 17:12 | 只看該作者
你好,我用功能代碼01通訊,老是超時,怎么辦了
回復

使用道具 舉報

5#
ID:386692 發表于 2018-8-21 20:01 | 只看該作者
51單片機接收到01,02,03等會作出響應。那顯控觸摸屏是在哪里設置發送01,02,03等modbus碼??
回復

使用道具 舉報

6#
ID:150905 發表于 2018-10-22 14:54 | 只看該作者
還附帶了單片機MODBUS通信測試.drw文件
回復

使用道具 舉報

7#
ID:428974 發表于 2018-11-19 08:08 | 只看該作者
什么是特定用戶啊 ,為什么我不能下載呢,我正在用一塊顯控屏 和AVr單片機的通信,正好借看下 先謝謝了
回復

使用道具 舉報

8#
ID:430332 發表于 2018-11-21 08:41 | 只看該作者
好復雜
回復

使用道具 舉報

9#
ID:307784 發表于 2018-11-29 20:24 | 只看該作者
過來學習了
回復

使用道具 舉報

10#
ID:307784 發表于 2018-11-29 20:26 | 只看該作者
之前都是威綸通的,顯控的modbus地址寫不進去,不管從站或主站
各們可以說下是什么問題嗎
回復

使用道具 舉報

11#
ID:448641 發表于 2018-12-18 09:54 | 只看該作者
我正在用一塊顯控屏 和RL78單片機的通信,正好借看下 先謝謝了
回復

使用道具 舉報

12#
ID:419837 發表于 2019-3-14 08:29 | 只看該作者
真好,正好要學習。
回復

使用道具 舉報

13#
ID:138443 發表于 2019-3-17 19:39 | 只看該作者
支持支持,多謝
回復

使用道具 舉報

14#
ID:544217 發表于 2019-5-21 21:38 | 只看該作者
非常好,支持
回復

使用道具 舉報

15#
ID:138443 發表于 2019-7-20 00:09 | 只看該作者
太好了,支持一下,謝謝
回復

使用道具 舉報

16#
ID:428400 發表于 2019-7-22 21:33 | 只看該作者
這個鏈接顯控哪一款的觸摸屏啊
回復

使用道具 舉報

17#
ID:602115 發表于 2019-8-25 19:58 | 只看該作者
已下載,謝謝分享。
回復

使用道具 舉報

18#
ID:398080 發表于 2019-9-2 19:37 | 只看該作者
一下載,感謝分享
回復

使用道具 舉報

19#
ID:109277 發表于 2019-11-6 15:54 | 只看該作者
謝謝分享,看看
回復

使用道具 舉報

20#
ID:428400 發表于 2019-11-7 18:54 | 只看該作者
怎么修改輸出點?有大師請指點下!謝謝
回復

使用道具 舉報

21#
ID:722051 發表于 2020-4-4 06:29 | 只看該作者
怎樣下載
回復

使用道具 舉報

22#
ID:1004539 發表于 2022-2-9 16:54 | 只看該作者
正在學習,很需要這方面的資料,謝謝
回復

使用道具 舉報

23#
ID:228452 發表于 2022-4-7 04:42 | 只看該作者
Hello
What kind of HMI to use
回復

使用道具 舉報

24#
ID:1045493 發表于 2022-10-25 23:09 | 只看該作者
單片機用的啥型號的?
回復

使用道具 舉報

25#
ID:228452 發表于 2022-11-21 02:12 | 只看該作者
MCU is  C51 modbus code
回復

使用道具 舉報

26#
ID:310569 發表于 2023-3-20 15:59 | 只看該作者
很好,這個正想學習
回復

使用道具 舉報

27#
ID:1006852 發表于 2023-10-21 11:56 | 只看該作者
有沒有指定具體需要用哪個型號的單片機?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草在线中文888 | 亚洲精品一区二区三区蜜桃久 | 国产精品一区在线观看 | 在线看片网站 | 精品欧美黑人一区二区三区 | 怡红院免费的全部视频 | 精品一区二区三区91 | 亚洲iv一区二区三区 | 久久精品中文字幕 | 欧美日韩不卡合集视频 | 亚洲精品乱码久久久久久按摩 | japanhd成人| 国产欧美在线观看 | 欧美中文在线 | 91伊人| 人人干人人草 | 国产成人精品一区二区三区在线 | 日韩一级不卡 | 特级黄一级播放 | 91亚洲一区 | 中国一级特黄真人毛片 | 亚洲国产中文字幕 | 九九综合九九 | 欧美黄色小视频 | 欧美一区二区三区大片 | 久久久国产一区二区三区 | 午夜视频大全 | 国产97色 | 久久不射电影网 | 国产精品99 | 精品96久久久久久中文字幕无 | 午夜视频在线免费观看 | 国产精品夜夜春夜夜爽久久电影 | 久久亚洲国产 | 精品综合久久久 | 亚洲97 | 日韩一区二区三区视频 | 国产精品大片在线观看 | 一区二区三区在线免费观看 | 一区二区三区在线看 | 亚洲成人精品一区 |