📄 ei10.c
字号:
#include <reg52.h>
#include <absacc.h>
#define Address 0x01 //本地址:
#define uchar unsigned char
#define uint unsigned int
#define BYTE unsigned char
#define WORD unsigned int
#define CS 01
#define CSTIME 10//超时时间
#define STOP 0x00//停
#define UPSTEP0 0x08
#define UPSTEP1 0x01
#define UPSTEP2 0x02
#define UPSTEP3 0x03
#define UPSTEP4 0x04
#define UPSTEP5 0x05
#define UPSTEP6 0x06
#define UPSTEP7 0x07
#define DOWNSTEP0 0x88
#define DOWNSTEP1 0x81
#define DOWNSTEP2 0x82
#define DOWNSTEP3 0x83
#define DOWNSTEP4 0x84
#define DOWNSTEP5 0x85
#define DOWNSTEP6 0x86
#define DOWNSTEP7 0x87
#define Bsf(bt) bt = 1;
#define Bcf(bt) bt = 0;
#define KS_IN X00//上接近开关
#define KZ_IN X01//下接近开关
#define KX_IN X02//中接近开关
#define KRUN_IN X03//运行开关
#define TIME0_IN X04//设定绕度1
#define TIME1_IN X05//设定绕度2
#define TIME2_IN X06//设定绕度3
#define TIME3_IN X07//设定绕度4
#define TIME4_IN X10//设定绕度5
#define TIME5_IN X11//设定绕度6
#define TIME6_IN X12//设定绕度7
#define M0_OUT Y00//正转/停
#define M1_OUT Y01//反转/停
#define M2_OUT Y02//故障清除
#define M3_OUT Y03//多段指令1
#define M4_OUT Y04//多段指令2
#define M5_OUT Y05//多段指令3
#define BJ_OUT Y06//
sbit IN00 = P2^3;
sbit IN01 = P3^6;
sbit IN02 = P3^7;
sbit IN03 = P3^5;
sbit IN04 = P3^4;
sbit IN05 = P3^3;
sbit IN06 = P3^2;
sbit IN07 = P1^6;
sbit IN10 = P1^7;
sbit IN11 = P1^5;
sbit IN12 = P1^4;
sbit OUT00 = P2^4;
sbit OUT01 = P2^5;
sbit OUT02 = P2^6;
sbit OUT03 = P2^7;
sbit OUT04 = P0^4;
sbit OUT05 = P0^5;
sbit OUT06 = P0^3;
sbit OUT07 = P0^2;
sbit OUT10 = P0^1;
sbit OUT11 = P0^0;
sbit RCK595= P0^7;
sbit SEG595= P2^0;
sbit SRCK595=P2^1;
sbit SC75176= P0^6;
//sbit SC75176=P2^2;
sbit WTDCS = P1^0;
sbit SOUT = P1^1;
sbit SCK = P1^2;
sbit SIN = P1^3;
uchar bdata flag;
uchar bdata X0;//
uchar bdata X1;//
uchar bdata Y0;//
uchar bdata Y1;//
typedef struct
{
uchar AutoStep;//自动步
uint RunMsTick;//运行毫秒滴答
uchar RunMsTickFlag;//运行毫秒滴答标志
uint TestMsTick;//测试运行毫秒滴答
uint SMsTickSave;//保存向上运行毫秒滴答
uint XMsTickSave;//保存向下运行毫秒滴答
uchar XStatus;//下限运行到位
uchar SStatus;//上限运行到位
uchar ZStatus;//中限运行到位
uchar Speed;//速度
uchar OverScecond;//超时
uchar OverScecondFlag;//超时标志
uchar Run;//开始运行
uchar Worm;//报警
uint AddStep;//每步加的时间
void (*GetStus)();//得到自动运行状态
void (*PutCon)();//输出控制
uint (*GetAddStep)();//得到步数细分
}SYS,* PSYS;
SYS SysAuto;
PSYS PSysAuto;
typedef struct
{
uchar Step;//自动步
uint UpTime;//运行毫秒滴答
uchar UPTimeFlag;//运行毫秒滴答标志
}KEY1,* PKEY1;
KEY1 Key;
PKEY1 PKey;
static unsigned char idata LED[03];//定义X0,X1,RUN ,POWER,STOP,Y0,Y1输出显示
//static unsigned char idata check _at_ 0x80;
sbit X00 = X0^0;
sbit X01 = X0^1;
sbit X02 = X0^2;
sbit X03 = X0^3;
sbit X04 = X0^4;
sbit X05 = X0^5;
sbit X06 = X0^6;
sbit X07 = X0^7;
sbit X10 = X1^0;
sbit X11 = X1^1;
sbit X12 = X1^2;
sbit X13 = X1^3;
sbit X14 = X1^4;
sbit X15 = X1^5;
sbit X16 = X1^6;
sbit X17 = X1^7;
///////////////////////
sbit Y00 = Y0^0;
sbit Y01 = Y0^1;
sbit Y02 = Y0^2;
sbit Y03 = Y0^3;
sbit Y04 = Y0^4;
sbit Y05 = Y0^5;
sbit Y06 = Y0^6;
sbit Y07 = Y0^7;
sbit Y10 = Y1^0;
sbit Y11 = Y1^1;
sbit Y12 = Y1^2;
sbit Y13 = Y1^3;
sbit Y14 = Y1^4;
sbit Y15 = Y1^5;
sbit Y16 = Y1^6;
sbit Y17 = Y1^7;
sbit Y03_LED = ACC^0;
sbit Y04_LED = ACC^1;
sbit Y05_LED = ACC^2;
sbit Y06_LED = ACC^3;
sbit Y07_LED = ACC^4;
sbit Y11_LED = ACC^5;
sbit Y10_LED = ACC^6;
sbit Y00_LED = ACC^7;
////////////////////////
sbit POWER_LED=ACC^0;
sbit RUN_LED = ACC^1;
sbit STOP_LED =ACC^2;
sbit Y01_LED = ACC^3;
sbit Y02_LED = ACC^4;
sbit X07_LED = ACC^5;
sbit X06_LED = ACC^6;
sbit X05_LED = ACC^7;
////////////////////////
sbit X04_LED = ACC^0;
sbit X03_LED = ACC^1;
sbit X12_LED = ACC^2;
sbit X11_LED = ACC^3;
sbit X10_LED = ACC^4;
sbit X00_LED = ACC^5;
sbit X01_LED = ACC^6;
sbit X02_LED = ACC^7;
sfr T2MOD = 0xC9;
void Init();//主程序初始化
void GetKey();//开关输入
void Out();//输出更新
alien void WDT_EN();
alien uchar UpDate(uchar tt);//更新595汇编模块中的程序
void Delay(uchar time);//延时1*Xms
void AutoRun();//自动运行
void GetStus();//得到自动运行状态
void PutCon();//输出控制
uint GetAddStep();//得到步数细分
void main()
{
Init();//主程序初始化
// WDT_EN();//开看门狗
Delay(250);//延时250ms
WTDCS=~WTDCS;
Delay(250);//延时250ms
WTDCS=~WTDCS;
Delay(250);//延时250ms
WTDCS=~WTDCS;
Delay(250);//延时250ms
PSysAuto = &SysAuto;
PSysAuto->GetStus = GetStus;
PSysAuto->PutCon = PutCon;
PSysAuto->GetAddStep = GetAddStep;
PKey = &Key;
while(1)
{
WTDCS=~WTDCS;
GetKey();//开关输入
AutoRun();//自动运行
Out();//输出更新
}
}
//功能:自动运行
void AutoRun()
{
//得到输入信号
PSysAuto->GetStus();
PSysAuto->AddStep = PSysAuto->GetAddStep();//得到步数细分
if(PSysAuto->AutoStep > 6 | PSysAuto->Run == 0 | PSysAuto->Worm == CS)
{
PSysAuto->AutoStep = 0;
if(PSysAuto->Run == 0)
{
PSysAuto->Worm = 0;
}
}
switch(PSysAuto->AutoStep)
{
case 0:
PSysAuto->Speed = STOP;
PSysAuto->AutoStep++;
break;//保护功能
case 1:
if(PSysAuto->XStatus)
{
PSysAuto->AutoStep = 2;
}
else
{
PSysAuto->Speed = DOWNSTEP2;
PSysAuto->OverScecond = CSTIME;
Bcf(PSysAuto->OverScecondFlag);
PSysAuto->AutoStep++;
}
break;//找初始态Then 系统往下
case 2:
if(PSysAuto->XStatus)
{
PSysAuto->Speed = UPSTEP1;
PSysAuto->TestMsTick = 0;
PSysAuto->OverScecond = CSTIME;
Bcf(PSysAuto->OverScecondFlag);
PSysAuto->AutoStep++;
}
if(PSysAuto->OverScecondFlag)
{
PSysAuto->Worm = CS;
PSysAuto->AutoStep = 0;
}
break;//找到初始态Then 系统往上
case 3:
if(PSysAuto->ZStatus)
{
PSysAuto->SMsTickSave = PSysAuto->TestMsTick;
PSysAuto->Speed = DOWNSTEP2;
PSysAuto->TestMsTick = 0;
PSysAuto->OverScecond = CSTIME;
Bcf(PSysAuto->OverScecondFlag);
PSysAuto->AutoStep++;
}
if(PSysAuto->OverScecondFlag)
{
PSysAuto->Worm = CS;
PSysAuto->AutoStep = 0;
}
break;//得到向上时间then 系统向下
case 4:
if(PSysAuto->XStatus)
{
PSysAuto->XMsTickSave = PSysAuto->TestMsTick;
PSysAuto->Speed = UPSTEP1;
PSysAuto->RunMsTick = PSysAuto->SMsTickSave+PSysAuto->AddStep;
Bcf(PSysAuto->RunMsTickFlag);
PSysAuto->OverScecond = CSTIME;
Bcf(PSysAuto->OverScecondFlag);
PSysAuto->AutoStep++;
}
if(PSysAuto->OverScecondFlag)
{
PSysAuto->Worm = CS;
PSysAuto->AutoStep = 0;
}
break;//得到向下时间then 系统向上即运行开始
case 5:
if(PSysAuto->RunMsTickFlag)
{
PSysAuto->Speed = DOWNSTEP2;
PSysAuto->RunMsTick = PSysAuto->XMsTickSave;
Bcf(PSysAuto->RunMsTickFlag)
PSysAuto->OverScecond = CSTIME;
Bcf(PSysAuto->OverScecondFlag);
PSysAuto->AutoStep++;
}
if(PSysAuto->SStatus)
{
PSysAuto->AutoStep = 1;
}//结束一个周期
if(PSysAuto->OverScecondFlag)
{
PSysAuto->Worm = CS;
PSysAuto->AutoStep = 0;
}
break;//向上运行时间到then 系统向下
case 6:
if(PSysAuto->RunMsTickFlag)
{
PSysAuto->Speed = UPSTEP1;
PSysAuto->RunMsTick = PSysAuto->SMsTickSave+PSysAuto->AddStep;
Bcf(PSysAuto->RunMsTickFlag);
PSysAuto->AutoStep = 5;
}
if(PSysAuto->OverScecondFlag)
{
PSysAuto->Worm = CS;
PSysAuto->AutoStep = 0;
}
break;//向上运行时间到then 系统向下
}
PSysAuto-> PutCon();
}
/*
得到步数细分
*/
uint GetAddStep()
{
uint temp;
temp = 0;
if(TIME0_IN) temp |= (0x01<<0);
if(TIME1_IN) temp |= (0x01<<1);
if(TIME2_IN) temp |= (0x01<<2);
if(TIME3_IN) temp |= (0x01<<3);
if(TIME4_IN) temp |= (0x01<<4);
if(TIME5_IN) temp |= (0x01<<5);
if(TIME6_IN) temp |= (0x01<<6);
return (temp+1);
}
//输出控制
void PutCon()
{
M0_OUT = 0;
M1_OUT = 0;
M2_OUT = 0;
M3_OUT = 0;
M4_OUT = 0;
M5_OUT = 0;
if(PSysAuto->Worm)
{
BJ_OUT = 1;
}
else
{
BJ_OUT = 0;
}
if(PSysAuto->Speed == 0)
{
return;
}
if(PSysAuto->Speed &0x80)
{
M0_OUT = 1;
}
else
{
M1_OUT = 1;
}
if(PSysAuto->Speed &0X01)
{
M3_OUT = 1;
}
else
{
M3_OUT = 0;
}
if(PSysAuto->Speed &0X02)
{
M4_OUT = 1;
}
else
{
M4_OUT = 0;
}
if(PSysAuto->Speed &0X04)
{
M5_OUT = 1;
}
else
{
M5_OUT = 0;
}
}
//功能:得到自动运行状态
void GetStus()
{
if(KS_IN)
{
PSysAuto->XStatus = 1;
}
else
{
PSysAuto->XStatus = 0;
}
if(KX_IN)
{
PSysAuto->SStatus = 1;
}
else
{
PSysAuto->SStatus = 0;
}
if(KZ_IN)
{
PSysAuto->ZStatus = 1;
}
else
{
PSysAuto->ZStatus = 0;
}
if(KRUN_IN)
{
PSysAuto->Run = 1;
}
else
{
PSysAuto->Run = 0;
}
}
/*
功能:主程序初始化
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void Init()
{
TMOD = 0x21;
TR0 = 1;
ET0 = 1;
EA = 1;
TH0 = 0;
TL0 = 0;
Delay(1);
}
void GetKey()
{
static uchar Temp1,Temp2,Tempp1,Tempp2;
uchar Temp,Tempp;
if(PKey->UPTimeFlag)
{
PKey->UpTime = 0;
Bcf(PKey->UPTimeFlag);
Temp=0; Tempp=0;
IN00=1;IN01=1;IN02=1;IN03=1;IN04=1;IN05=1;IN06=1;IN07=1;
IN10=1;IN11=1;IN12=1;
if(IN00) Temp=Temp&0xfe;
else Temp=Temp|0x01;
if(IN01) Temp=Temp&0xfd;
else Temp=Temp|0x02;
if(IN02) Temp=Temp&0xfb;
else Temp=Temp|0x04;
if(IN03) Temp=Temp&0xf7;
else Temp=Temp|0x08;
if(IN04) Temp=Temp&0xef;
else Temp=Temp|0x10;
if(IN05) Temp=Temp&0xdf;
else Temp=Temp|0x20;
if(IN06) Temp=Temp&0xbf;
else Temp=Temp|0x40;
if(IN07) Temp=Temp&0x7f;
else Temp=Temp|0x80;
if(IN10) Tempp=Tempp&0xfe;
else Tempp=Tempp|0x01;
if(IN11) Tempp=Tempp&0xfd;
else Tempp=Tempp|0x02;
if(IN12) Tempp=Tempp&0xfb;
else Tempp=Tempp|0x04;
switch(PKey->Step & 0x1)
{
case 0:
if(Temp!=Temp1||Tempp!=Tempp1)
{
PKey->Step = 1;
Temp2=Temp; Tempp2=Tempp;
}
break;
case 1:
if(Temp==Temp2&&Tempp==Tempp2)
{
Temp1=Temp;Tempp1=Tempp;
X0=Temp;X1=Tempp;
}
PKey->Step = 0;
break;
}
}
}
/*
功能:输出更新
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void Out()
{
/*
;Y03_LED BIT ACC.0
;Y04_LED BIT ACC.1
;Y05_LED BIT ACC.2
;Y06_LED BIT ACC.3
;Y07_LED BIT ACC.4
;Y11_LED BIT ACC.5
;Y10_LED BIT ACC.6
;Y00_LED BIT ACC.7
*/
Y03_LED = Y03;
Y04_LED = Y04;
Y05_LED = Y05;
Y06_LED = Y06;
Y07_LED = Y07;
Y11_LED = Y11;
Y10_LED = Y10;
Y00_LED = Y00;
LED[2] = ACC;//送显示缓冲LED2
/*
;POWER_LED BIT ACC.0
;RUN_LED BIT ACC.1
;STOP_LED BIT ACC.2
;Y01_LED BIT ACC.3
;Y02_LED BIT ACC.4
;X07_LED BIT ACC.5
;X06_LED BIT ACC.6
;X05_LED BIT ACC.7
*/
POWER_LED=1;
RUN_LED=1;
STOP_LED=0;
Y01_LED = Y01;
Y02_LED = Y02;
X07_LED = X07;
X06_LED = X06;
X05_LED = X05;
LED[1] = ACC;//送显示缓冲LED1
/*
;X04_LED BIT ACC.0
;X03_LED BIT ACC.1
;X12_LED BIT ACC.2
;X11_LED BIT ACC.3
;X10_LED BIT ACC.4
;X00_LED BIT ACC.5
;X01_LED BIT ACC.6
;X02_LED BIT ACC.7
*/
X04_LED = X04;
X03_LED = X03;
X12_LED = X12;
X11_LED = X11;
X10_LED = X10;
X00_LED = X00;
X01_LED = X01;
X02_LED = X02;
LED[0] = ACC;//送显示缓冲LED0
UpDate(&LED);//更新595
OUT00 = ~Y00;
OUT01 = ~Y01;
OUT02 = ~Y02;
OUT03 = ~Y03;
OUT04 = ~Y04;
OUT05 = ~Y05;
OUT06 = ~Y06;
OUT07 = ~Y07;
OUT10 = ~Y10;
OUT11 = ~Y11; //更新Y
}
/*
功能:延时程序
输入参数:time
输出参数:NC
作者:徐益武
2006/3/2
修改次数:0
*/
void Delay(uchar time)
{
uint i;
for(;time>0;time--){
for(i=0;i<76;i++);
}
}
/*
功能:定时程序
输入参数:NC
输出参数:NC
作者:徐益武
2006/1/15
修改次数:0
*/
void TMER0() interrupt 1 using 2
{
static uchar i;
TH0 = ((unsigned int)(~10000))/256;
TL0 = ((unsigned int)(~10000))%256;
Bsf(PKey->UPTimeFlag);//10ms
PSysAuto->TestMsTick++;//测试
if(--PSysAuto->RunMsTick == 0)
{
Bsf(PSysAuto->RunMsTickFlag);
}// 10Ms
if(++i==100)
{
i = 0;
if(--PSysAuto->OverScecond == 0)
{
// Bsf(PSysAuto->OverScecondFlag);
}
}// 1s
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -