标题:
单片机组态例程
[打印本页]
作者:
老手
时间:
2021-4-17 11:16
标题:
单片机组态例程
大家可以用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)
2021-4-17 11:15 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1