/***********立式波纹管手动PAST **********/
/***********L604 CODE 3202 2021 3 3**********/
/***半自动打一个波,全自动打一节,再按键循环***/
#include <REG52.H> //开机第一个参数设置翻页需改进
#include <intrins.h> //保压时间
#include <string.h>
#include "stdio.h"
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
sbit Led=P5^4; //EEPROM写指示
sbit Auto_Led=P5^5; //自动运行指示
sbit CP1=P3^7; //
sbit DIR1=P3^6; //
sbit CP2=P3^5; //
sbit DIR2=P3^4; //
sbit YL=P1^1; /****压力输出信号****/
sbit GZ=P1^0; /****鼓涨输出信号****/
sbit GS=P1^6; /****鼓松输出信号****/
sbit S1=P3^2; /***步进电机限位*2016 5 14 5.5改1.7****/
sbit INTPUT1=P3^3; //
uint FLAG_S; //运行标志
uchar i,k; //循环总变量i
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
#define IAP_ADDRESS 0x0000 //时间 EEPROM首地址
bit manu; /****手动标志位 0 1****/
bit semiauto; /*半自动运行标志*/
bit MOTORRUN=0; //电机运行标志
typedef unsigned char BYTE;
typedef unsigned int WORD;
uint ScaleFactor;
uint val0,val1,val2,val3,val4; /*0产量计数器1设定波值2鼓涨时间3鼓松时间4电机速度*/
uint vala,valb,val5,val6,val7; /*5电机计数6实际波值7运行时间缓冲 */
uint val8; //顶出距离
int func; /*功能标志0:break 1:波值 2:鼓涨时间3:鼓松时间4:电机速度5:电机计数6:归零*/
bit Receive_Flag;
uint Run_Flag; //手动 半自动 自动 运行标志
bit Signauto; /*检测接近开关自动运行标志*/
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint a[10]; //定义数组a 存储串口数据串
/*------------------------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*------------------延时子程序------------------------*/
void delay10ms(uint x)
{
int i, j;
for (i=0; i<x; i++)
for (j=0; j<10; j++);
}
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay_100ms(uint x) //page 5 保压,上升计时 Delay100ms
{
uint i,j;
for(i=0;i<x;i++)
{
for(j=0;j<9200;j++);
}
}
/*----关闭IAP----------------------------*/
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
/*-从ISP/IAP/EEPROM区域读取一字节-*/
BYTE IapReadByte(WORD addr)
{
BYTE dat; //数据缓冲区
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_READ; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
dat = IAP_DATA; //读ISP/IAP/EEPROM数据
IapIdle(); //关闭IAP功能
return dat; //返回
}
/*-写一字节数据到ISP/IAP/EEPROM区域-*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP; //使能IAP
IAP_CMD = CMD_PROGRAM; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/*---扇区擦除---------------*/
void IapEraseSector(WORD addr)
{
IAP_CONTR = ENABLE_IAP; //使能IAP val=IapReadByte(IAP_ADDRESS+1);
IAP_CMD = CMD_ERASE; //设置IAP命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //等待ISP/IAP/EEPROM操作完成
IapIdle();
}
/***********************************/
void red_eeprom(void)
{
uint m,n;
m=IapReadByte(IAP_ADDRESS+0); //设定波值前八位
n=IapReadByte(IAP_ADDRESS+1); //设定波值后八位
val1=m*256+n; //设定波值
m=IapReadByte(IAP_ADDRESS+2); //电机速度前八位
n=IapReadByte(IAP_ADDRESS+3); //电机速度后八位
val4=m*256+n; //电机速度
m=IapReadByte(IAP_ADDRESS+4); //比例系数前八位
n=IapReadByte(IAP_ADDRESS+5); //比例系数后八位
ScaleFactor=m*256+n; //比例系数
m=IapReadByte(IAP_ADDRESS+6); //鼓涨时间前八位
n=IapReadByte(IAP_ADDRESS+7); //鼓涨时间后八位
val2=m*256+n; //鼓涨时间
m=IapReadByte(IAP_ADDRESS+8); //鼓松时间前八位
n=IapReadByte(IAP_ADDRESS+9); //鼓松时间后八位
val3=m*256+n; //鼓松时间
m=IapReadByte(IAP_ADDRESS+10); //顶出距离前八位
n=IapReadByte(IAP_ADDRESS+11); //顶出距离后八位
val8=m*256+n; //顶出距离
Led=1;
}
/*************写时间参数到EEPROM*******************************/
void Write_EepromTime()
{
IapEraseSector(IAP_ADDRESS); //扇区擦除
IapProgramByte(IAP_ADDRESS+0,val1/256); /*设定波值高八位*/
IapProgramByte(IAP_ADDRESS+1,val1%256); /*设定波值低八位*/
IapProgramByte(IAP_ADDRESS+2,val4/256); /*电机速度高八位*/
IapProgramByte(IAP_ADDRESS+3,val4%256); /*电机速度低八位*/
IapProgramByte(IAP_ADDRESS+4,ScaleFactor/256);/*比例系数高八位*/
IapProgramByte(IAP_ADDRESS+5,ScaleFactor%256);/*比例系数低八位*/
IapProgramByte(IAP_ADDRESS+6,val2/256); /*鼓涨时间高八位*/
IapProgramByte(IAP_ADDRESS+7,val2%256); /*鼓涨时间低八位*/
IapProgramByte(IAP_ADDRESS+8,val3/256); /*鼓松时间高八位*/
IapProgramByte(IAP_ADDRESS+9,val3%256); /*鼓松时间低八位*/
IapProgramByte(IAP_ADDRESS+10,val3/256); /*顶出距离高八位*/
IapProgramByte(IAP_ADDRESS+11,val3%256); /*顶出距离低八位*/
Led=1;
}
/*************关所有输出*******************************/
void reset_io()
{
P3M0=0X00;
P3M1=0X00;
P5M0=0X00;
P5M1=0X00;
CP1=1; //
DIR1=1; //
CP2=1; //
DIR2=1; //
YL=1; /****压力输出信号****/
GZ=1; /****鼓涨输出信号****/
GS=1; /****鼓松输出信号****/
S1=1; /***伺服电机限位*2016 5 14 5.5改1.7****/
INTPUT1=1; //
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
delay(5); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
delay(5); //延时
}
/*------------page 0页面显示---------------------*/
void disdata_a()//
{
red_eeprom();
printf("n0.val=%d\xff\xff\xff",val1); //设定波值
printf("n0.val=%d\xff\xff\xff",val1); //设定波值
}
/*------------page 1页面显示---------------------*/
void disdata_b()//
{
red_eeprom();
printf("n0.val=%d\xff\xff\xff",ScaleFactor); //比例系数
printf("n0.val=%d\xff\xff\xff",ScaleFactor); //比例系数
printf("n1.val=%d\xff\xff\xff",val2); //鼓涨时间
printf("n2.val=%d\xff\xff\xff",val3); //鼓松时间 val8
printf("n3.val=%d\xff\xff\xff",val8); //顶出距离
printf("n4.val=%d\xff\xff\xff",val4); //电机速度
}
/*----------电机前进------------*/
void MotorForward( ) /**/
{
for(val7>0;val7--;)
{
for(k=0;k<20;k++) //
{
CP1=0; /*子函数开始*/
delay10ms(val4);
CP1=1;
delay10ms(val4);
}
}
}
/*************手动电机上升****/
void Motor_Up() //
{
DIR1=1;
MOTORRUN=1;
while(MOTORRUN)
{
CP1=0;
delay(val4);
CP1=1;
delay(val4);
}
}
/*************手动电机下降****/
void Motor_Dwon() //
{
DIR1=0;
MOTORRUN=1;
while(MOTORRUN)
{
CP1=0;
delay(val4);
CP1=1;
delay(val4);
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
MOTORRUN=0; //电机下限位电机运行标志关
}
}
DIR1=1; //
}
/*----------手动电机下降------------*/
void MotorBack( ) /**/
{ /*子函数开始*/
CP1=0;
delay10ms(val4);
CP1=1;
delay10ms(val4);
}
/*----------鼓涨输出------------*/
void OUTA( ) //鼓涨
{
GZ=0;
YL=0;
}
/*----------鼓松输出------------*/
void OUTB( ) //鼓松
{
GS=0;
YL=0;
}
/*----------鼓涨关闭------------*/
void GOUTA( ) //鼓涨关
{
GZ=1;
YL=1;
}
/*----------鼓松关闭------------*/
void GOUTB( ) // 鼓松关
{
GS=1;
YL=1;
}
/*----------实际波值加-----------------*/
void workwaveon( ) /*实际波值加子函数*/
{ /*子函数开始*/
val6=val6+1; /**加一**/
if(val6>999) /*大于999*/
{
val6=0; /*归零*/
} // val0
}
/*----------产量加一-----------------*/
void totaladd( )
{
val0=val0+1;
if(val0>9999) /*大于999*/
{
val0=0; /*归零*/
}
}
/*----------------自动运行程序----------------*/
void autorun()
{
printf("n2.val=%d\xff\xff\xff",val0); //显示产量
printf("n0.val=%d\xff\xff\xff",val1); //显示设定波值
while(manu) /*循环条件为manu=1 按手动时manu=0*/
{
OUTA(); //鼓涨输出
printf("t5.txt=\"鼓涨\"\XFF\XFF\XFF"); //显示鼓涨
val7=val2; //鼓涨时间交缓冲器
// xsdjs(); //倒计时显示
GOUTA(); //关
OUTB(); //鼓松输出
printf("t5.txt=\"鼓松\"\XFF\XFF\XFF"); //显示鼓松
val7=val3; //鼓松时间交缓冲器
// xsdjs(); //倒计时显示
GOUTB(); //关鼓松
printf("t5.txt=\"顶出\"\XFF\XFF\XFF"); //显示顶出
val7=val5; //顶出计数交缓冲器
MotorForward(); //顶出
if(semiauto) //判断自动半自动标志
{
workwaveon( ); //实际值加一
printf("n1.val=%d\xff\xff\xff",val6); //显示实际值
if(val6>=val1) //如果实际值大于等于设定值
{
manu=0; //运行标志关
printf("t5.txt=\"顶退\"\XFF\XFF\XFF"); //显示顶退
DIR1=0; //步进电机方向使能开
delay(1000); //
Signauto=1; /*行程输入信号检测标志无输入为1,永久循环*/
k=0; /*抗干扰计数器*/
do
{
if(~!S1) /*顶退行程开关高电平*/
for(;k<=3;) /*小于等于3循环*/
{
if(!S1) /*检测顶退为低电平?*/
{ /*循环检测 */
_nop_();
_nop_();
k++;
}
else if(~!S1) /*检测顶退为高电平?*/
{
MotorBack( ); //顶退 检测限位开关
k=0; /*寄存器复位*/
}
}
Signauto=0; /*行程输入信号连续检测到3次Signauto=0退出循环*/
totaladd(); //产量加一
printf("n2.val=%d\xff\xff\xff",val0); //显示产量
}
while(Signauto); //while 结束
printf("t4.txt=\"手动\"\XFF\XFF\XFF"); //显示手动
val6=0; //实际波值归零
printf("n1.val=%d\xff\xff\xff",val6); //显示实际值
}
DIR1=1; //步进电机方向使能复位
}
else if(!semiauto)
{
manu=0; //运行标志manu 置0
}
}
Auto_Led=1; //
}
/*----------------半自动运行程序----------------*/
void Run()
{
OUTA(); //鼓涨输出
printf("t5.txt=\"鼓 涨\"\XFF\XFF\XFF"); //显示鼓涨
Delay_100ms(val2); //
GOUTA(); //关
OUTB(); //鼓松输出
printf("t5.txt=\"鼓 松\"\XFF\XFF\XFF"); //显示鼓松
Delay_100ms(val3); //
GOUTB(); //关鼓松
printf("t5.txt=\"顶 出\"\XFF\XFF\XFF"); //显示顶出
val7=val8;
MotorForward(); //顶出
delay(200);
printf("t5.txt=\"待 机\"\XFF\XFF\XFF"); //显示顶出
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50;
//8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1; //
ES=1; //
EA=1; //
}
/*×--------UART 中断服务程序-------------------**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA||SBUF==0XFF) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
if(Receive_Flag==1) //关手动伺服电机工作
{
if(a[0]==0XA0) //
{
if(a[1]==0X00) //
{
Receive_Flag=0; //串口中断接收标志置零
i=0; //数组计数器归零
MOTORRUN=0; //关伺服电机
}
}
}
}
/*************************************************/
void main( ) /*主程序开始*/
{
reset_io();
Led=0;
Delay_100ms(300); //延时(30)等触摸屏先启动
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
Receive_Flag=0;
InitUart(); //初始化串口
printf("0XFF,0XFF,0XFF");
red_eeprom();
disdata_a();
Run_Flag=0;
FLAG_S=6; //1下降 2上升 3停止 4结束5保压6待机7周期一8周期二9周期三
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
i=0; //数据接收计数器等于0
while(1) //INTPUT1
{
if(Receive_Flag==1)
{
Receive_Flag=0; //重新接收
/*************周期一*********/
if(a[0]==0XE0)
{
if(a[1]==0XA1) //给单片机发顶 进信号
{
MOTORRUN=1; //电机运行标志
Motor_Up(); //顶 进
}
else if(a[1]==0XA2) //给单片机发顶 退信号
{
MOTORRUN=1; //电机运行标志
Motor_Dwon();
}
else if(a[1]==0XA3) //给单片机发鼓 涨信号
{
OUTA(); //鼓涨
}
else if(a[1]==0XA4) //给单片机发鼓 松信号
{
OUTB(); //鼓松
}
else if(a[1]==0XA5) //关鼓涨鼓松输出
{
GS=1;
GZ=1;
YL=1;
}
}
else if(a[0]==0XE1) //出厂数据恢复
{
if(a[1]==0XA1) //
{
disdata_a(); //page0
}
else if(a[1]==0XA2) //
{
disdata_b(); //page1
}
if(a[1]==0XE1) //数据全部删除
{
Led=0;
val1=10; //设定波值
val2=12; //鼓涨时间
val3=12; //鼓松时间
val4=2; //电机速度
val8=20; //顶出距离
ScaleFactor=6; //比例系数
Write_EepromTime();
disdata_b(); //
}
}
else if(a[0]==0XC0) //出厂数据恢复
{
if(a[1]==0X01) //数据全部删除
{
val1=a[3]*256+a[2]; //设定波值
}
else if(a[1]==0X02) //数据全部删除
{
val4=a[3]*256+a[2]; //电机速度
}
else if(a[1]==0X03) //数据全部删除
{
ScaleFactor=a[3]*256+a[2]; //比例系数
}
else if(a[1]==0X04) //数据全部删除
{
val2=a[3]*256+a[2]; //鼓涨时间
}
else if(a[1]==0X05) //数据全部删除
{
val3=a[3]*256+a[2]; //鼓松时间
}
else if(a[1]==0X06) //数据全部删除
{
val8=a[3]*256+a[2]; //顶出距离
}
Write_EepromTime();
}
else if(a[0]==0XB0) //手动半自动全自动
{
if(a[1]==0XA1) //手动
{
Auto_Led=1; //
Run_Flag=0; //手动
}
else if(a[1]==0XA2) //半自动
{
Auto_Led=1; //
Run_Flag=1; //半自动
Run();
}
else if(a[1]==0XA3) //自动
{
Run_Flag=2; //自动
Auto_Led=0; //
}
}
/****************/
///
RstKey();
if(Run_Flag==2) //自动运行标志为2
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
autorun();
}
}
}
}
} //L604 CODE 3202 2021 3 3