/***豆腐干下位机测试 L573 CODE 3919 2021 1 25***/
/***STC8G1K08 三段时间控制程序 电机自动启停***/
#include <REG52.H> //下降一段设置
#include <intrins.h> //保压时间
#include <string.h>
#define FOSC 11059200UL //晶振频率
#define BRT (256-FOSC/9600/32) //波特率除/32 9600/32 或者115200/32
#include "stdio.h"
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
uchar data_i=0;
sbit INTPUT1=P5^4; //启动信号
sbit DOWN=P3^2; //下降
sbit UP=P3^3; //上升
sbit LED=P5^5; //EEPROM写指示
uint FLAG_S;
#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首地址
typedef unsigned char BYTE;
typedef unsigned int WORD;
/**********************/
static uint RUN_TIME; //运行总时间 累计
/*************周期一*********/
static uint RunTime_A; //停顿时间 第一段
static uint Wait_A; //停顿时间
static uint Press_A; //压榨时间
/*************周期二*********/
static uint RunTime_B; //停顿时间 第二段
static uint Wait_B; //停顿时间
static uint Press_B; //压榨时间
/*************周期二*********/
static uint RunTime_C; //停顿时间 第三段
static uint Wait_C; //停顿时间
static uint Press_C; //压榨时间
/*************系统参数*******/
static uint Back_Time; //回程时间
static uint Down_Time; //下降一时间
static uint Press_Time; //保压时间
/**********************/
bit Receive_Flag;
bit Run_Flag;
bit Dataa_Flag;
bit Datab_Flag;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uint a[8]; //定义数组a 存储串口数据串
/*------------------------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;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++);
printf("n6.val=%d\xff\xff\xff",i);//
}
}
/*----关闭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); //时间后八位
RunTime_A=m*256+n; //周期一压榨总时
m=IapReadByte(IAP_ADDRESS+2); //时间前八位
n=IapReadByte(IAP_ADDRESS+3); //时间后八位
Wait_A=m*256+n; //周期一停顿时间
m=IapReadByte(IAP_ADDRESS+4); //时间前八位
n=IapReadByte(IAP_ADDRESS+5); //时间后八位
Press_A=m*256+n; //周期一压榨时间
m=IapReadByte(IAP_ADDRESS+6); //时间前八位
n=IapReadByte(IAP_ADDRESS+7); //时间后八位
RunTime_B=m*256+n; //周期二压榨总时
m=IapReadByte(IAP_ADDRESS+8); //时间前八位
n=IapReadByte(IAP_ADDRESS+9); //时间后八位
Wait_B=m*256+n; //周期二停顿时间
m=IapReadByte(IAP_ADDRESS+10); //时间前八位
n=IapReadByte(IAP_ADDRESS+11); //时间后八位
Press_B=m*256+n; //周期二压榨时间
Back_Time=IapReadByte(IAP_ADDRESS+12); //回程时间时间后八位
Down_Time=IapReadByte(IAP_ADDRESS+13); //下降一时间后八位
m=IapReadByte(IAP_ADDRESS+14); //时间前八位
n=IapReadByte(IAP_ADDRESS+15); //时间后八位
Press_Time=m*256+n; //保压时间
RunTime_C=IapReadByte(IAP_ADDRESS+16); //周期三压榨总时
Wait_C=IapReadByte(IAP_ADDRESS+17); //周期三停顿时间
Press_C=IapReadByte(IAP_ADDRESS+18); //周期三压榨时间
}
/*************写时间参数到EEPROM*******************************/
void Write_EepromTime()
{
LED=0;
IapEraseSector(IAP_ADDRESS); //扇区擦除
IapProgramByte(IAP_ADDRESS+0,RunTime_A/256); /*周期一压榨总时高八位*/
IapProgramByte(IAP_ADDRESS+1,RunTime_A%256); /*周期一压榨总时低八位*/
IapProgramByte(IAP_ADDRESS+2,Wait_A/256); /*周期一停顿时间高八位*/
IapProgramByte(IAP_ADDRESS+3,Wait_A%256); /*周期一停顿时间低八位*/
IapProgramByte(IAP_ADDRESS+4,Press_A/256); /*周期一压榨时间高八位*/
IapProgramByte(IAP_ADDRESS+5,Press_A%256); /*周期一压榨时间低八位*/
IapProgramByte(IAP_ADDRESS+6,RunTime_B/256); /*周期二压榨总时高八位*/
IapProgramByte(IAP_ADDRESS+7,RunTime_B%256); /*周期二压榨总时低八位*/
IapProgramByte(IAP_ADDRESS+8,Wait_B/256); /*周期二停顿时间高八位*/
IapProgramByte(IAP_ADDRESS+9,Wait_B%256); /*周期二停顿时间低八位*/
IapProgramByte(IAP_ADDRESS+10,Press_B/256); /*周期二压榨时间高八位*/
IapProgramByte(IAP_ADDRESS+11,Press_B%256); /*周期二压榨时间低八位*/
IapProgramByte(IAP_ADDRESS+12,Back_Time); /*写入回程时间*/
IapProgramByte(IAP_ADDRESS+13,Down_Time); /*下降一时间*/
IapProgramByte(IAP_ADDRESS+14,Press_Time/256); /*写入保压时间高八位*/
IapProgramByte(IAP_ADDRESS+15,Press_Time%256); /*写入保压时间低八位*/
IapProgramByte(IAP_ADDRESS+16,RunTime_C); /*周期三压榨总时*/
IapProgramByte(IAP_ADDRESS+17,Wait_C); /*周期三停顿时间*/
IapProgramByte(IAP_ADDRESS+18,Press_C); /*周期三压榨时间*/
}
/*************关所有输出*******************************/
void reset_io()
{
P3M0=0X00;
P3M1=0X00;
P5M0=0;
P5M1=0;
DOWN=1; //气缸下降
UP=1; //气缸上升
INTPUT1=1; //
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
delay(5); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
Delay100ms(5); //延时
}
/*------------page 0页面显示---------------------*/
void disdata_a()//周期一参数 周期二参数
{
red_eeprom();
printf("n0.val=%d\xff\xff\xff",RunTime_A); //第一段周期总时
printf("n0.val=%d\xff\xff\xff",RunTime_A); //第一段周期总时
printf("n1.val=%d\xff\xff\xff",Wait_A); //第一段停顿时间
printf("n2.val=%d\xff\xff\xff",Press_A); //第一段压榨时间
printf("n3.val=%d\xff\xff\xff",RunTime_B); //第二段周期总时
printf("n4.val=%d\xff\xff\xff",Wait_B); //第二段停顿时间
printf("n5.val=%d\xff\xff\xff",Press_B); //第二段压榨时间
LED=1;
}
/*------------page 2页面显示---------------------*/
void disdata_b()// //周期三参数 系统参数
{
red_eeprom();
printf("n0.val=%d\xff\xff\xff",RunTime_C); //第三段周期总时
printf("n0.val=%d\xff\xff\xff",RunTime_C); //第三段周期总时
printf("n1.val=%d\xff\xff\xff",Wait_C); //第三段停顿时间
printf("n2.val=%d\xff\xff\xff",Press_C); //第三段压榨时间
printf("n3.val=%d\xff\xff\xff",Down_Time); //下降一时间
printf("n4.val=%d\xff\xff\xff",Press_Time); //保压时间
printf("n5.val=%d\xff\xff\xff",Back_Time); //回程时间
LED=1;
}
/*------------自动压榨开始---------------------*/
void start()
{
uint t1;
RUN_TIME=0; //压榨总时间清零
printf("page 4\XFF\XFF\XFF"); //第三段周期界面显示
disdata_a();
FLAG_S=1; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //触摸屏变量va0,用于定时器判断变量显示中文内容
Delay100ms(5); //延时(5);
DOWN=0; //
UP=1; //
Delay_100ms(Down_Time*10); //下降一时间
RUN_TIME+=Down_Time*10; //
DOWN=1;
FLAG_S=3; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S);//
Run_Flag=1; //自动运行标志
while(Run_Flag)
{
Delay100ms(Wait_A*10); //周期一停顿时间
RUN_TIME+=Wait_A*10;
DOWN=0; //下降
FLAG_S=1; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
Delay100ms(Press_A); //压榨时间
RUN_TIME+=Press_A;
DOWN=1; //停止
FLAG_S=3; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
if(RUN_TIME>=RunTime_A*10) //总时间大于等于设定值
Run_Flag=0; //自动运行标志 结束周期一循环
printf("n7.val=%d\xff\xff\xff",RUN_TIME/10); //
}
//周期一结束
FLAG_S=8; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
Delay100ms(5); //延时(5);
RUN_TIME=0; //计时器归零
printf("n7.val=%d\xff\xff\xff",RUN_TIME); //
Run_Flag=1; //自动运行标志,启动周期二循环
while(Run_Flag)
{
Delay100ms(Wait_B*10); //周期二停顿时间
RUN_TIME+=Wait_B*10;
DOWN=0; //下降
FLAG_S=1; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
Delay100ms(Press_B); //压榨时间
RUN_TIME+=Press_B;
DOWN=1; //停止
FLAG_S=3; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
if(RUN_TIME>=RunTime_B*10) //总时间大于等于设定值
Run_Flag=0; //自动运行标志 结束周期二循环
printf("n7.val=%d\xff\xff\xff",RUN_TIME/10); //
}
//周期二结束
FLAG_S=9; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
printf("page 5\XFF\XFF\XFF"); //第三段周期界面显示
disdata_b();
RUN_TIME=0; //计时器归零
printf("n7.val=%d\xff\xff\xff",RUN_TIME); //时间运行显示
Run_Flag=1; //自动运行标志,启动周期三循环
while(Run_Flag)
{ //Delay100ms
for(t1=0;t1<Wait_C*60;t1++) //
{
Delay100ms(10); //1ms
printf("n7.val=%d\xff\xff\xff",t1);//
}
RUN_TIME+=Wait_C;
DOWN=0; //下降
FLAG_S=1; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
for(t1=0;t1<Press_C*60;t1++)
{
Delay100ms(10); //1ms
printf("n7.val=%d\xff\xff\xff",t1);//
}
RUN_TIME+=Press_C;
DOWN=1; //停止
FLAG_S=3; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一8周期二9周期三
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
if(RUN_TIME>=RunTime_C) //总时间大于等于设定值
Run_Flag=0; //自动运行标志 结束周期三循环
printf("n7.val=%d\xff\xff\xff",RUN_TIME); //总时间显示
}
//周期三结束
DOWN=0;
FLAG_S=5; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二 9周期三
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
RUN_TIME=0; //计时器归零
printf("n7.val=%d\xff\xff\xff",RUN_TIME/10); //
Delay_100ms(Press_Time*10); //保压
DOWN=1; //关下降
FLAG_S=2; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二 9周期三
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
UP=0; //开上升
Delay_100ms(Back_Time*10); //
UP=1; //关上升
FLAG_S=4; //1 下降 2上升 3停止 4结束 5保压 6待机 7周期一 8周期二 9周期三
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
printf("page 0\XFF\XFF\XFF"); //第三段周期界面显示
Delay100ms(10); //延时(10);
disdata_a();
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON = 0x50;
TMOD = 0x20;
TL1 = BRT;
TH1 = BRT;
TR1 = 1;
AUXR = 0x40;
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) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
data_i=0; //数组计数器归零
}
else
{
a[data_i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
data_i++;
}
}
}
/*************************************************/
void main( ) /*主程序开始*/
{
reset_io();
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
Receive_Flag=0;
InitUart(); //初始化串口
printf("0XFF,0XFF,0XFF");
Delay100ms(10); //延时(10);
disdata_a();
Run_Flag=0;
Delay100ms(10); //延时(10);
Dataa_Flag=0;
Datab_Flag=0;
data_i=0;
while(1) //INTPUT1
{
if(Dataa_Flag==1)
{
Dataa_Flag=0;
disdata_a();
}
if(Datab_Flag==1)
{
Datab_Flag=0;
disdata_b();
}
if(Receive_Flag==1)
{
Receive_Flag=0; //重新接收
/*************周期一*********/
if(a[0]==0XE0)
{
if(a[1]==0X00) //周期一
{
RunTime_A=a[3]*256+a[2]; //周期一压榨总时
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",RunTime_A);//数据校对
}
else if(a[1]==0X01)
{
Wait_A=a[3]*256+a[2]; //周期一停顿时间
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",Wait_A); //
}
else if(a[1]==0X02)
{
Press_A=a[3]*256+a[2]; //周期一压榨时间
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",Press_A); //
}
/*************周期二*********/
else if(a[1]==0X03)
{
RunTime_B=a[3]*256+a[2]; //周期二压榨总时
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",RunTime_B); //
}
else if(a[1]==0X04)
{
Wait_B=a[3]*256+a[2]; //周期二停顿时间
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",Wait_B); //
}
else if(a[1]==0X05)
{
Press_B=a[3]*256+a[2]; //周期二压榨时间
Dataa_Flag=1;
printf("n6.val=%d\xff\xff\xff",Press_B); //
}
/*************周期三*********/
else if(a[1]==0X06)
{
RunTime_C=a[2]; //周期三压榨总时
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",RunTime_C); //
}
else if(a[1]==0X07)
{
Wait_C=a[2]; //周期三停顿时间
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",Wait_C); //
}
else if(a[1]==0X08)
{
Press_C=a[2]; //周期三压榨时间
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",Press_C); //
}
//系统参数
/*************系统参数*******/
else if(a[1]==0X09)
{
Down_Time=a[2]; //下降一时间
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",Down_Time); //
}
else if(a[1]==0X0A)
{
Press_Time=a[3]*256+a[2]; //保压时间
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",Press_Time); //
}
else if(a[1]==0X0B)
{
Back_Time=a[2]; //回程时间
Datab_Flag=1;
printf("n6.val=%d\xff\xff\xff",Back_Time); //
}
Write_EepromTime();
}
else if(a[0]==0XE2) //主画面后初始化事件
{
if(a[1]==0X20) //
{
UP=0; //气缸上升
}
else if(a[1]==0X21) //
{
DOWN=0; //气缸下降
}
else if(a[1]==0X22) //
{
DOWN=1; //关闭气缸下降
UP=1; //关闭气缸上升
}
else if(a[1]==0XA1) // 周期一参数 周期二参数
{
LED=0;
Delay100ms(20); //延时(10);
Dataa_Flag=1;
// disdata_a(); //
}
else if(a[1]==0XA2) //周期三参数 系统参数
{
LED=0;
Delay100ms(20); //延时(10);
Datab_Flag=1;
//disdata_b(); //周期一参数
}
if(a[1]==0XE2) //数据全部删除
{
RUN_TIME=0; //运行总时间 累计
/*************周期一*********/
RunTime_A=0; //停顿时间 第一段
Wait_A=0; //停顿时间
Press_A=0; //压榨时间
/*************周期二*********/
RunTime_B=0; //停顿时间 第二段
Wait_B=0; //停顿时间
Press_B=0; //压榨时间
/*************周期二*********/
RunTime_C=0; //停顿时间 第三段
Wait_C=0; //停顿时间
Press_C=0; //压榨时间
/*************系统参数*******/
Back_Time=0; //回程时间
Down_Time=0; //下降一时间
Press_Time=0; //保压时间
Write_EepromTime();
}
}
}
///
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
start();
}
}
} //L573 CODE 3919 2021 1 25