大家可以用MODBUS协议通过人机界面来调试程序或学习通信协议。
1.使用前,需要安装GUIBuild触摸屏组态软件,软件在"\单片机开发工具\GUIBuild触摸屏组态软件"
2.使用GUIBuild和OPS6触摸软件前,先双击学习光盘中的“KeiLib.exe”
3.软件安装好后,双击Test.op6 即可运行程序。
4.使用GUIBuild触摸屏软件时,先编译,再选择在线模拟,再选择正确的COM口后点击连接。
单片机源程序如下:
- /******************************************************************************************************************
- 标题: 综合程序 *
- * 此程序包含了板中大部分的功能,配合上位机一起使用 编译前请双击Keillib.exe *
- * *
- *******************************************************************************************************************/
- #include <system.h>
- #define NOP() _nop_() /* 定义空指令 */
- #define TRUE 0xff
- #define FALSE 0
- //6T/12T工作模式
- #define Model_6T 0
- unsigned char bdata X0,X1,Y0,Key;
- unsigned int Tick_10ms=0; //时间片计数器
- sbit K0=Key^0;
- sbit K1=Key^1;
- sbit K2=Key^2;
- sbit K3=Key^3;
- sbit K4=Key^4;
- sbit K5=Key^5;
- sbit K6=Key^6;
- sbit K7=Key^7;
- bit K0J,K1J,K2J,K3J,K4J,K5J;
- #define M_Sum 32
- #define D_Sum 185
- unsigned char idata M[M_Sum];
- unsigned short xdata D[D_Sum];
- unsigned int TestDelay1, TestDelay2, TestDelay3;
- unsigned int T[6];
- //*********************************************************************
- #define UCHAR unsigned char
- void delay(unsigned int i)
- {
- UCHAR j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
- /*************************************************************************
- * 函数名称: ConversionStr(void)
- * 功能描述: 字符串转换函数
- * 输 入: *Register, *str
- ***************************************************************************/
- void ConversionStr(unsigned short *Register,unsigned char code *str)
- {
- unsigned char sL,sH;
- while(1)
- {
- if(*str == '\0') break;
- sL=(*str++);
- sH=(*str++);
- *Register++=sH<<8|sL;
- }
- }
- /*************************************************************
- * (T0) 10 ms 时钟冲断
- ;************************************************************/
- void T0zd(void) interrupt 1
- {
- //TH0=0xC4; //18.432M
- //TL0=0x00;
- #if Model_6T
- TH0=0xB8; //22.1184M
- TL0=0x00;
- #else
- TH0=0xDC; //11.0592M
- TL0=0x00;
- #endif
- Tick_10ms++;
- }
- /***********************************************************
- purpose: 系统初始化
- /**********************************************************/
- void system_Ini()
- {
- TMOD|= 0x11;
- //TH0=0xC4; //18.432M
- //TL0=0x00;
- #if Model_6T
- TH0=0xB8; //22.1184M
- TL0=0x00;
- #else
- TH0=0xDC; //11.0592M
- TL0=0x00;
- #endif
- IE = 0x8A;
- TR0 = 1;
- //PWM
- //TH1 = 0xfe; //11.0592
- //TL1 = 0x33;
- //TR1 = 1;
- }
- //***********************************************************
- main()
- { unsigned char Input;
- unsigned char i,j;
- unsigned char code str1[] = "PLC动作版本 V1.05 ";
- unsigned char code str2[] = "51板程序版本 V3.28 ";
- system_Ini();
- InitMotor();
- Input=ReHC74165();
- X0=Input;
- #if Model_6T // 晶振 波特率 站号
- Modbus_Init(221184, 57600, 1, &M[0], &D[0]);
- #else
- //Modbus_Init(110592, 19200, 1, &M[0], &D[0]);
- Modbus_Init(120000, 19200, 1, &M[0], &D[0]);
- #endif
- //Modbus_Init(184320, 57600, X1, &M[0], &D[0]);
- for(i=0; i<M_Sum; i++) M[i]=0;
- for(i=0; i<D_Sum; i++) D[i]=i;
- Y0=0;
- D[12]=1;
- D[24]=0;
- D[28]=100;
- D[30]=50;
- D[100]=0; //PLC-K0~K3控制画面切换OFF
- D[180]=0; //AD采样控制
- D[181]=0; //曲线黑色背景
- ConversionStr(&D[50],str1);
- ////////////////////////////////////////////////////////////////////////
- while(1)
- {
- Input=ReHC74165();
- X0=Input;
- Key=X0;
- if(K0&K0J) //单次图片切换 D27
- {
- M[0]=~M[0];
- if(++D[27]>5) D[27]=0;
- if(D[100]) D[24]=10; //控制触摸屏(显示画面号=10)
- }
- K0J=~K0;
-
- //由K1~K5微分控制, 交替切换M1~M5
- if(K1&K1J)
- {
- M[1]=~M[1];
- if(D[100]) D[24]=17; //控制触摸屏(显示画面号=17)
- }
- K1J=~K1;
-
- if(K2&K2J)
- {
- M[2]=~M[2];
- if(D[100])D[24]=29; //控制触摸屏(显示画面号=29)
- }
- K2J=~K2;
-
- if(K3&K3J)
- {
- M[3]=~M[3];
- if(D[100])D[24]=30; //控制触摸屏(显示画面号=30)
- }
- K3J=~K3;
- if(K4&K4J)M[4]=~M[4]; K4J=~K4;
- if(K5&K5J)M[5]=~M[5]; K5J=~K5;
- if(M[1]) //自动图片切换 D[27] 间隔10ms*D[28] 加加一次
- {
- if(TickOut(&T[0],D[28])) if(++D[27]>5) D[27]=0; //10ms*D[28]
- }
- //显示下位机程序版本
- if(K0) ConversionStr(&D[50],str1);
- if(K1) ConversionStr(&D[50],str2);
- //动态文本画面数据测试
- if(TickOut(&T[1],D[30])) //D[30]位人机设定的动作速度
- {
- //报警信息
- if((K0)&&(D[21]<58)) ++D[21];
- if((K1)&&(D[21]>0)) --D[21];
- //动作信息
- if((K2)&&(D[22]<9)) ++D[22];
- if((K3)&&(D[22]>0)) --D[22];
- //温度状态反色显示
- D[90]++;
- //周期时间
- D[93]++;
-
- //按下S5(单ON/双OFF),控制报警自动变化
- if(M[4])
- {
- if(++D[21]>57) D[21]=0;
- }
- //按下S6(单ON/双OFF),控制动作自动变化
- if(M[5])
- {
- if(!M[6]) //动作++
- {
- if(++D[22]>8)
- {
- D[22]=8;
- M[6]=TRUE;
- }
- }
- else //动作--
- {
- if(--D[22]==0) M[6]=FALSE;
- }
- }
- }
复制代码
//拨码开关控制[运行状态显示]
D[99]=0;
if(X1&0x10) D[99]=1; //拨码开关1
if(X1&0x20) D[99]=2; //拨码开关2
if(X1&0x40) D[99]=3; //拨码开关3
if(X1&0x80) D[99]=4; //拨码开关4
以上代码下载:
27 组态例程.rar
(2.02 MB, 下载次数: 25)
|