欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
顯控HMI與單片機通訊案例(含單片機底層程序源碼)
[打印本頁]
作者:
liucongjun
時間:
2018-4-20 09:25
標題:
顯控HMI與單片機通訊案例(含單片機底層程序源碼)
看到51hei上面有多人需要給大家分享下顯控HMI與單片機通訊案例(含單片機底層),顯控觸摸屏盒51單片機通過MODBUS協議通訊,讀寫數據和監視位狀態,附觸摸屏案例和單片機工程源碼與快速接線模塊。
還附帶了單片機MODBUS通信測試.drw文件.
0.jpg
(27.36 KB, 下載次數: 137)
下載附件
2018-4-20 14:58 上傳
單片機源程序如下:
/********************************************
samkoon深圳顯控自動化技術
**********************************************/
/********文件信息*****************************
名稱:main.c
功能:系統執行文件
創建者:徐思*
適用工程:MODBUS RTU SALVE 通信單片機底層案例
***********************************************/
/********************************************************************************
本段程序用于和samkoon觸摸屏使用MODBUS RTU協議通信,單片機作為從站,232連接
samkoon MODBUS 主站功能碼說明:
1、0x:讀寫位狀態,讀時發功能碼 01 寫時發功能碼05;
2、1x:讀輸入位狀態;發功能碼 02;
3、3x:讀輸入寄存器,發功能碼 04;
4、4x:讀寫寄存器,讀時發功能碼 03,寫時發功能碼 06,寫32位時發功能碼 10;
5、3X-D:讀兩個寄存器 功能碼:03;
6、4X-D:寫兩個寄存器,功能碼 10,讀32位時讀上來的數據和使用4X高低字節剛好相反
7、3x_bit:讀輸入寄存器的位,發功能碼:04;
8、4x_bit:讀寫寄存器的位,讀時發功能碼:03,寫時發功能碼:06;
**********************************************************************************/
/*---如果要在程序使用該程序,請在程序中注明使用了顯控公司資料---*/
/*---如果要在文章使用該程序,請在文章中注明使用了顯控公司資料---*/
#include"main.h"
u8 Reciver_Buf;
u8 rece_index=0;
u8 idata sendBuf[75]; //定義發送數組,最大允許發送32個字,64個字節
u8 idata receBuf[75]; //定義接收數組,最大允許接收32個字,64個字節寫入
u8 *ps=sendBuf;
u8 *pr=receBuf;
u8 comm_END;
u8 comm_time_out;
u8 Reciver_bit=0;
u16 R_ISP_L;
u16 R_ISP_H;
/*初始化函數*/
void init()
{
int i;
TMOD=0X21; //設定定時器1的工作方式為2,及8位初值自動重裝的8位定時器,用于產生波特率,T0工作方式1,用于判斷通信幀結束
TH1=0XFD; //設置定時器的初值為0xfd,是按照9600的波特率計算出來的數值
TL1=0XFD; //定時器高低位數值一樣,方式2下,定時器自動將高位的數值裝入低位,所以設定的時間要一致
TH0=(65536-11111)/256; //T0設定為1ms定時器, 用于判斷通信幀結束,同時可用于其他的定時作用
TL0=(65536-11111)%256; //T0低位
TR1=1; //啟動T1定時器
REN=1; //運行串口接收數據,REN=1允許串口接收,REN=0禁止串口接收數據
SM0=0; //設置串口工作方式為1,即10位異步通信,1起始位,8數據位,1停止位
SM1=1; //同上,REN、SM0、SM1同屬于SCON寄存器,但是SCON寄存器允許位尋址
EA=1; //開總中斷
ES=1; //開串口中斷
ET0=1; //開定時器中斷
TR0=1; //啟動T0定時器
P1=0xff; //復位所有輸出
relay=1;
bee=1;
for(i=0;i<32;i++) //復位所有
{
*(pb+i)=0;
*(pw+i)=0;
inputBit[i]=0;
}
for(i=0;i<32;i++) //讀出存在內部E2PROM內的值
{
R_ISP_L=read_ISP(0x2000+i*2); //讀出數據低位
R_ISP_H=read_ISP(0x2000+i*2+1); //讀出數據高位
*(pw+i)=((R_ISP_H<<8)&0xff00)+(R_ISP_L&0Xff); //組合數據
}
}
/*********************************************************************************
手動調試函數,通過在觸摸屏上操作相對應的位來控制單片機的手動輸出
相對應的位說明:
0x0: 手動自動切換位,0:自動,1:手動
0x1-0x10;輸出口1-10;
***********************************************************************************/
void adj()
{
u8 i,j=0; //j要有初值=0;
for(i=1;i<9;i++)
{
j=(u8)((*(pb+i)&0x01)<<(i-1))+j;
}
P1=~j;
relay=(~(*(pb+9)))&0x01;
bee=(~(*(pb+10)))&0x01;
}
/**********************************************************************************
將數值保存在內部E2PROM中
0x11:在觸摸屏上的保存按鈕
************************************************************************************/
void saveData()
{
u8 i;
sectorerase(0x2000); //擦除扇區,這邊寫入的是第一扇區,在擦除是整個扇區被擦除
for(i=0;i<32;i++)
{
write_ISP((0X2000+i*2),(*(pw+i)&0xff)); //保存低8位數據
write_ISP((0x2000+i*2+1),((*(pw+i)>>8)&0xff)); //保存高8位數據
}
*(pb+11)=0; //保存按妞復位
}
/*主函數*/
void main()
{
init(); //執行初始化程序
while(1) //執行運行程序
{
if(*(pb+0)) adj(); //手動調試
if(*(pb+11)) saveData(); //保存數值
}
}
/*串口中斷服務*/
void ser() interrupt 4 //串口中斷的序號是4
{
RI=0; //產生串口中斷時RI被硬件置1,在串口中斷服務程序中需要用軟件清0;
comm_END=4; //9600的波特率下,等待3.5個字節需要約4ms的時間
Reciver_bit=1; //產生一次中斷置一次位
Reciver_Buf=SBUF; //將接收到的數據賦給一個變量;
receBuf[rece_index++]=Reciver_Buf; //將接收到的數據存入接收數組
}
/*T0中斷服務程序*/
void comm_stop() interrupt 1
{
u8 i;
TH0=(65536-11111)/256; //重裝T0
TL0=(65536-11111)%256; //T0低位
if(Reciver_bit&&comm_END!=0)
comm_END--;
if(comm_END==0)
{
Reciver_bit=0; //幀接收,對標志位清零
if((*(pr+0)==0x01||*(pr+0)==0x00)&&rece_index>=8) //判斷是否為本站地址或者是廣播地址,有效報文的字節數量最少是8個字節
{
AnalyzeRecieve(); //分析并生成響應報文
if(*(pr+0)==0x01) //廣播模式下不用返回
send_comm(); //發送響應報文
}
comm_END=4; //重新賦延時初值
rece_index=0; //數組長度清零
for(i=0;i<75;i++) //清空接收數組
receBuf[i]=0;
Reciver_Buf=0;
}
}
復制代碼
/********************************************
samkoon
**********************************************/
/********文件信息*****************************
名稱:main.h
功能:本段程序實現數據的E2PROM操作,實現數據斷電保持功能
創建者:徐思坤
適用工程:MODBUS RTU SALVE 通信單片機底層案例
***********************************************/
/*---如果要在程序使用該程序,請在程序中注明使用了顯控公司資料---*/
/*---如果要在文章使用該程序,請在文章中注明使用了顯控公司資料---*/
#include <intrins.h>
#include"main.h"
//#define _nop_() //定義一個空函數
/***************************************************************
* 定義ISP/IAP操作命令,控制寄存器地址:ISP_CMD E5H *
* 1、0x00: 待機命令,ISP無操作; *
* 2、0x01: 對用戶的應用程序FLASH區及數據FLASH區字節讀 *
* 3、0x02: 對用戶的應用程序FLASH區及數據FLASH區字節編程 *
* 4、0x03: 對用戶的應用程序FLASH區及數據FLASH區字節擦除 *
***************************************************************/
#define RDCommand 0x01
#define PRGCommand 0x02
#define ERASECommand 0x03
#define waittime 0x01 //定義CPU的等待時間
/*開始ISP寄存器聲明*/
sfr ISP_DATA=0xE2; //FLASH數據寄存區
sfr ISP_ADDRH=0xE3; //FLASH高字節地址寄存器
sfr ISP_ADDRL=0xE4; //FLASH低字節地址寄存器
sfr ISP_CMD=0xE5; //FLASH命令寄存器
sfr ISP_TRIG=0xE6; //FLASH命令觸發寄存器
sfr ISP_CONTR=0xE7; //ISP/IAP控制寄存器
/*打開ISP/IAP功能*/
void ISP_enable(void)
{
// ISP_CONTR=ISP_CONTR&0X18; //初始化SP/IAP控制寄存器;
ISP_CONTR=waittime; //寫入硬件延時,注意這邊是“|”運算
ISP_CONTR=ISP_CONTR|0x80; //打開ISPEN,運行寫入,注意是“|”運算
}
/*關閉ISP/IAP功能*/
void ISP_disable(void)
{
ISP_CONTR=ISP_CONTR&0x00; //關閉ISPEN,運行寫入,注意是“&”運算
ISP_TRIG=0x00; //清空ISP命令控制觸發器
ISP_CMD=0x00;
// EA=1; //打開中斷
}
/*建立公用觸發函數*/
void go_ISP(void)
{
ISP_TRIG=0x46; //觸發ISP/IAP命令字節1,(固定)
ISP_TRIG=0xB9; //觸發ISP/IAP命令字節2,(固定)
_nop_(); //執行一個空函數
}
/*扇區擦除函數*/
void sectorerase(u16 addr)
{
ISP_ADDRH=(u8)(addr>>8); /*取地址的高位*/
ISP_ADDRL=(u8)(addr&0xff); //地址的低位
// EA=0; //關閉總中斷
ISP_enable(); //打開ISP/IAP功能
ISP_CMD=ERASECommand; //從新給ISP命令寄存器賦值,這邊賦的是0x03,表示擦除
go_ISP(); //執行觸發命令,將擦除命令寫入
ISP_disable(); //關閉ISP功能
}
/*寫數據函數(單個字節寫入)*/
void write_ISP(u16 st_addr,u8 w_data)
{
ISP_DATA=w_data; //將要寫入的數據存入ISP FLASH數據寄存區
ISP_ADDRH=(u8)(st_addr>>8); /*取地址的高位*/
ISP_ADDRL=(u8)(st_addr&0xff); //地址的低位
// EA=0; //關閉總中斷
ISP_enable(); //打開ISP/IAP功能
ISP_CMD=PRGCommand; //從新給ISP命令寄存器賦值,這邊賦的是0x02,表示寫入
go_ISP(); //觸發寫入
ISP_disable(); //關閉ISP功能
}
/*讀數據函數(讀單個字節)*/
u8 read_ISP(u16 rd_addr)
{
ISP_ADDRH=(u8)(rd_addr>>8); /*取地址的高位*/
ISP_ADDRL=(u8)(rd_addr&0x00ff); //地址的低位
ISP_CMD=ISP_CMD&0xF8; // 清空ISP命令寄存器的第三位
// EA=0; //關閉總中斷
ISP_enable(); //打開ISP/IAP功能
ISP_CMD=RDCommand; //從新給ISP命令寄存器賦值,這邊賦的是0x01,表示讀出
go_ISP(); //觸發寫入
ISP_disable(); //關閉ISP功能
return (ISP_DATA); //返回讀出的數據
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
顯控HMI與單片機通訊案例(含單片機底層) (0).rar
(809.72 KB, 下載次數: 431)
2018-4-20 09:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
smartphone
時間:
2018-5-19 21:55
謝謝 下載來學習學習
作者:
葉偉哲
時間:
2018-7-1 17:10
你好,我用功能代碼1通訊,老是通訊超時,這個怎么辦
作者:
葉偉哲
時間:
2018-7-1 17:12
你好,我用功能代碼01通訊,老是超時,怎么辦了
作者:
huangjianfeng
時間:
2018-8-21 20:01
51單片機接收到01,02,03等會作出響應。那顯控觸摸屏是在哪里設置發送01,02,03等modbus碼??
作者:
DSCX05
時間:
2018-10-22 14:54
還附帶了單片機MODBUS通信測試.drw文件
作者:
tangquan2019
時間:
2018-11-19 08:08
什么是特定用戶啊 ,為什么我不能下載呢,我正在用一塊顯控屏 和AVr單片機的通信,正好借看下 先謝謝了
作者:
jiajie168
時間:
2018-11-21 08:41
好復雜
作者:
yxr201314
時間:
2018-11-29 20:24
過來學習了
作者:
yxr201314
時間:
2018-11-29 20:26
之前都是威綸通的,顯控的modbus地址寫不進去,不管從站或主站
各們可以說下是什么問題嗎
作者:
p0083
時間:
2018-12-18 09:54
我正在用一塊顯控屏 和RL78單片機的通信,正好借看下 先謝謝了
作者:
lieyanfeiyang
時間:
2019-3-14 08:29
真好,正好要學習。
作者:
lizhendong
時間:
2019-3-17 19:39
支持支持,多謝
作者:
HHHHP
時間:
2019-5-21 21:38
非常好,支持
作者:
lizhendong
時間:
2019-7-20 00:09
太好了,支持一下,謝謝
作者:
難得糊涂2018
時間:
2019-7-22 21:33
這個鏈接顯控哪一款的觸摸屏啊
作者:
細洗席
時間:
2019-8-25 19:58
已下載,謝謝分享。
作者:
osjzbing
時間:
2019-9-2 19:37
一下載,感謝分享
作者:
zcq222
時間:
2019-11-6 15:54
謝謝分享,看看
作者:
難得糊涂2018
時間:
2019-11-7 18:54
怎么修改輸出點?有大師請指點下!謝謝
作者:
muxiaoyu240
時間:
2020-4-4 06:29
怎樣下載
作者:
wangjjqd
時間:
2022-2-9 16:54
正在學習,很需要這方面的資料,謝謝
作者:
mick32
時間:
2022-4-7 04:42
Hello
What kind of HMI to use
作者:
jinshan
時間:
2022-10-25 23:09
單片機用的啥型號的啊?
作者:
mick32
時間:
2022-11-21 02:12
MCU is C51 modbus code
作者:
tyghbn
時間:
2023-3-20 15:59
很好,這個正想學習
作者:
percy
時間:
2023-10-21 11:56
有沒有指定具體需要用哪個型號的單片機?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1