//中断服务程序
void exint0() interrupt 0 //INT0中断入口
{
P10 = !P10; //将测试口取反
}
void exint1() interrupt 2 //INT1中断入口
{
P10 = !P10; //将测试口取反
}
//中断服务程序
void exint2() interrupt 10 //INT2中断入口
{
P10 = !P10; //将测试口取反
// INT_CLKO &= 0xEF; //若需要手动清除中断标志,可先关闭中断,此时系统会自动清除内部的中断标志
// INT_CLKO |= 0x10; //然后再开中断即可
}
//---------------------------------------------
P32 = 1;
IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中断
P33 = 1;
IT1 = 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1 = 1; //使能INT1中断
INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中断
帮我写一个STC15W413AS外部中断0,1,2程序 一个中断对应一个IO口取反
AI
我现在已经掌握了所有必要的信息。根据手册资料:
STC15W413AS(STC15W408AS系列)外部中断配置:
- INT0→ P3.2,
interrupt 0,IT0控制触发方式(IT0=1下降沿,IT0=0上升+下降沿),通过TCON寄存器EX0使能 - INT1→ P3.3,
interrupt 2,IT1控制触发方式(IT1=1下降沿,IT1=0上升+下降沿),通过TCON寄存器EX1使能 - INT2→ P3.6,
interrupt 10,仅下降沿触发,通过INT_CLKO寄存器EX2位(bit4,0x10)使能
现在编写完整程序。用户要求"一个中断对应一个IO口取反",我用P1.0、P1.1、P1.2分别对应INT0、INT1、INT2的取反输出。
以下是完整的 C 代码:
/*============================================================================= STC15W413AS 外部中断0/1/2 测试程序 功能:INT0、INT1、INT2 外部中断,每个中断对应一个IO口取反 INT0 (P3.2) 中断 --> P1.0 取反 INT1 (P3.3) 中断 --> P1.1 取反 INT2 (P3.6) 中断 --> P1.2 取反 硬件连接说明: - INT0 接 P3.2 引脚(按键或信号源) - INT1 接 P3.3 引脚(按键或信号源) - INT2 接 P3.6 引脚(按键或信号源) - 输出取反测试口: P1.0 对应 INT0 中断取反 P1.1 对应 INT1 中断取反 P1.2 对应 INT2 中断取反 触发方式说明: - INT0:IT0=1 仅下降沿触发;IT0=0 上升沿+下降沿均触发 - INT1:IT1=1 仅下降沿触发;IT1=0 上升沿+下降沿均触发 - INT2:仅下降沿触发(STC15系列INT2/3/4固定为下降沿触发) 在 Keil C 环境下编译,选择 Intel 8052 编译器 =============================================================================*/ #include "reg51.h" #include "intrins.h" //------------------- 特殊功能寄存器定义 ------------------- // INT_CLKO(AUXR2)外部中断允许寄存器,地址 8FH sfr INT_CLKO = 0x8F; //------------------- I/O 口位定义(取反测试口)------------------- sbit P10 = P1^0; // INT0 中断取反输出 sbit P11 = P1^1; // INT1 中断取反输出 sbit P12 = P1^2; // INT2 中断取反输出 //------------------- 中断入口引脚定义(用于状态读取)------------------- sbit INT0_PIN = P3^2; // INT0 输入引脚 sbit INT1_PIN = P3^3; // INT1 输入引脚 sbit INT2_PIN = P3^6; // INT2 输入引脚 //------------------- 外部中断0服务程序 ------------------- void Exint0_Routine(void) interrupt 0 // INT0中断入口(中断号0) { P10 = !P10; // 将测试口P1.0取反 } //------------------- 外部中断1服务程序 ------------------- void Exint1_Routine(void) interrupt 2 // INT1中断入口(中断号2) { P11 = !P11; // 将测试口P1.1取反 } //------------------- 外部中断2服务程序 ------------------- void Exint2_Routine(void) interrupt 10 // INT2中断入口(中断号10) { P12 = !P12; // 将测试口P1.2取反 } //------------------- 主函数 ------------------- void main(void) { //----- 外部中断0 (INT0) 配置 ----- INT0_PIN = 1; // INT0 引脚置高(准双向口先写1,确保可检测外部信号) IT0 = 0; // IT0=0: 上升沿+下降沿均触发; IT0=1: 仅下降沿触发 EX0 = 1; // 使能 INT0 中断 //----- 外部中断1 (INT1) 配置 ----- INT1_PIN = 1; // INT1 引脚置高 IT1 = 0; // IT1=0: 上升沿+下降沿均触发; IT1=1: 仅下降沿触发 EX1 = 1; // 使能 INT1 中断 //----- 外部中断2 (INT2) 配置 ----- INT2_PIN = 1; // INT2 引脚置高 INT_CLKO |= 0x10; // EX2=1: 使能 INT2 中断(仅下降沿触发) // INT_CLKO 地址8FH,bit4 为 EX2 //----- 全局中断使能 ----- EA = 1; // 打开总中断 while (1) { // 主循环空闲,等待中断触发 } }程序说明
1. 引脚对应关系
| 外部中断 | 输入引脚 | 中断号 | 取反输出口 |
|---|---|---|---|
| INT0 | P3.2 | 0 | P1.0 |
| INT1 | P3.3 | 2 | P1.1 |
| INT2 | P3.6 | 10 | P1.2 |
2. 寄存器配置要点
- INT0/INT1:通过
TCON寄存器配置,IT0/IT1决定触发方式(=1仅下降沿,=0上升+下降沿),EX0/EX1使能中断。 - INT2:通过
INT_CLKO(AUXR2,地址 8FH)寄存器使能,EX2(bit4)置 1 允许中断。注意:INT2 只支持下降沿触发,这是 STC15 系列硬件固定的。
3. 输出引脚模式说明
取反输出口(P1.0、P1.1、P1.2)默认为准双向口(弱上拉),可以直接驱动 LED(低电平点亮)。如需更大驱动能力,可将其配置为推挽输出,例如:
P1M0 &= ~0x07; // 保持 P1.0~P1.2 为推挽(若配置推挽输出,需确认 P1M1/P1M0 寄存器的设置,可按需调整。)
4. 使用注意事项
- 如果检查中断不触发,请确认输入引脚所接按键是否可靠拉低,且引脚已正确置高为 1。
- 中断引脚若配置为高阻输入或开漏模式,需要外接上拉电阻,否则无法正常检测外部电平变化。
- 如需修改触发方式,只需调整
IT0/IT1的值即可(INT2固定下降沿,无法修改)。
如果需要修改某个中断对应的取反输出口(比如改用其他端口),或者需要改变触发方式,请告诉我,我可以为您调整代码。
信息来源:
- 《STC15系列单片机数据手册》第 17 章「中断系统」
- 《STC15系列单片机数据手册》第 3 章「STC15系列选型简介」管脚对应功能说明
- STC 官网论坛帖子《STC15W413AS有几个外部中断》(tid=25425)确认该型号属于 STC15W408AS 系列
🔍 搜索 "外部中断0 程序 引脚取反"
📌 相关论坛讨论
- STC15W413AS有几个外部中断
- IAP15W4K61S4 LQFP64封装脚位是怎么排列的
- IAP15W413AS
⏱️ 查找用时 16.0s | 总回答用时 33.7s
/*********焊管机切割控制程序************/
/****L558 CODE3082 2026 8 28******/
/*********位置 启动 自动 手动***********/
/*********电机 气缸 手动 自动***********/
#include <REG52.H> // cutting 切割
#include <intrins.h> //
#include <string.h> //
#include "stdio.h" //
#define uint unsigned int //
#define uchar unsigned char //
sfr INT_CLKO=0x8F; //外部中断2 P3.6 扩展寄存器
#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; //Catch_Up接上Catch_Dwon接下
typedef unsigned int WORD;
bit Signauto=0; /*退出循环检测*/
bit Rst_Bit=0; /**/
bit MODE_FLAG; /*工作模式*/
bit AutoCut_FLAG; //自动切割
bit ManualCut_FLAG; //手动切割
bit TableBack_FLAG; //台板退到位
sbit Motor=P1^0; //电机
sbit Cutting_dwon=P1^1; //切割机下降
sbit OUTA=P1^4; //备用
sbit OUTB=P1^5; //时间,模式 位置模式 指示
sbit OUT0=P1^6; //手动循环信号指示
sbit OUT1=P1^7; //定时中断 指示
sbit OUT2=P2^7; //台板
sbit Manual=P1^2; //手动指示
sbit Automatic=P1^3; //自动指示
// sbit INTPUT0=P3^5; //气缸退
// sbit INTPUT1=P3^3; //自动P3^3
// sbit INTPUT2=P3^2; //手动P3^2
// sbit INTPUT3=P3^4; //临时切割3^4
// sbit INTPUT4=P3^5; //定长切割3^5
sbit INTPUT0=P3^2; //定长红外信号
sbit INTPUT1=P3^3; //临时切割
sbit INTPUT2=P3^4; //手动
sbit INTPUT3=P3^5; //自动
sbit INTPUT4=P3^6; //气缸退到位
uint Ad_data;
uint Run_TIME; //
uint DELAY_A,DELAY_B,DELAY_C; //切割延时
uint MODEMARK;
uint aa=0; /****RUN FLAG****/
uint a[10]; //定义数组a
uchar i; //串口接收计数器
uchar k; //信号输入高电平计数器
uint counter; //产量计数器
bit Receive_Flag; //串口接收标志
bit Run_Flag; //自动运行标志
uint FLAG_S; //触摸屏显示标志
uchar kcounter,kstatus; //按键计数标志 按键状态标志
/*----关闭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 delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<1000;j++);
}
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/********************************************/
void resrt_io()
{
FLAG_S=1; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
Motor=1; //电机关
Cutting_dwon=1; //切割机下降
OUTA=1; //
OUTB=1; //
Manual=0; //手动指示
Automatic=1; //自动指示
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
}
/******************************************/
void red_eeprom(void)
{
uint m,n;
m=IapReadByte(IAP_ADDRESS); //时间前八位
n=IapReadByte(IAP_ADDRESS+1); //时间后八位
DELAY_A=m*256+n; //排气一段延时时间
m=IapReadByte(IAP_ADDRESS+2); //时间前八位
n=IapReadByte(IAP_ADDRESS+3); //时间后八位
DELAY_B=m*256+n; //排气一段延时时间
MODEMARK=IapReadByte(IAP_ADDRESS+4);//工作模式
DELAY_C=IapReadByte(IAP_ADDRESS+5);//电机启动后延时切割
}
/******************************************/
void Write_EepromTime()
{
IapEraseSector(IAP_ADDRESS); //扇区擦除
IapProgramByte(IAP_ADDRESS,DELAY_A/256); // 高位
IapProgramByte(IAP_ADDRESS+1,DELAY_A%256); // 低位
IapProgramByte(IAP_ADDRESS+2,DELAY_B/256); // 高位
IapProgramByte(IAP_ADDRESS+3,DELAY_B%256); // 低位
IapProgramByte(IAP_ADDRESS+4,MODEMARK); // 工作模式
IapProgramByte(IAP_ADDRESS+5,DELAY_C%256); // 电机启动后延时切割
}
/*****************************************/
/***产量 工作模式 自动手动 启动Run_TIME***/
void start()
{
Manual=1; //手动指示
Automatic=0; //自动指示
Run_TIME=0; //初始化
if(MODE_FLAG==1) //
{
/*一:启动无输入为1,永久循环*/
FLAG_S=2; // 位置模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
do
{ //INTPUT3 启动信号
if(ManualCut_FLAG==1) //手动临时切割标志
{
ManualCut_FLAG=0;
FLAG_S=2; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Motor=0; //电机开
Delay100ms(DELAY_C); //电机启动后延时切割
Cutting_dwon=0; //切割机下降
Delay100ms(DELAY_B);
Motor=1; //电机关
OUT2=0; //台板返回
Cutting_dwon=1; //切割机上升
FLAG_S=1; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Delay100ms(100); //延时 启动按键释放
}
//INTPUT3 临时切割
if(AutoCut_FLAG==1) //按键低电平
{
AutoCut_FLAG=0;
FLAG_S=2; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Motor=0; //电机开
Delay100ms(DELAY_C); //电机启动后延时切割
Cutting_dwon=0; //切割机下降
Delay100ms(DELAY_B);
Motor=1; //电机关
OUT2=0; //台板返回
//
Cutting_dwon=1; //切割机上升
FLAG_S=1; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
counter++; //产量加1
printf("n0.val=%d\xff\xff\xff",counter); //产量计数
Delay100ms(100); //延时 启动按键释放
}
//INTPUT4 定长切割
RstKey(); //
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //手动按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT2) //手动按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
FLAG_S=1; //1待 机2切割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
FLAG_S=1; //1手 动2自 动
printf("va1.val=%d\xff\xff\xff",FLAG_S); //va1触摸屏变量 发送第一次
resrt_io();
Signauto=0; /*行程输入信号连续检测到3次Signauto=0退出循环*/
Run_Flag=0;
break;
}
//手动退出位置循环
}
while(Run_Flag);
}
//位置模式
else
{
FLAG_S=1; //时间模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
do
{
Delay100ms(10);
Run_TIME++;
printf("n3.val=%d\xff\xff\xff",Run_TIME); //计时器显示
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
FLAG_S=2; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Motor=0; //电机开
Delay100ms(DELAY_C); //电机启动后延时切割
Cutting_dwon=0; //切割机下降
Delay100ms(DELAY_B);
Motor=1; //电机关
Cutting_dwon=1; //切割机上升
FLAG_S=1; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Run_TIME=0; //临时切割 计时器归零
}
if(Run_TIME>=DELAY_A)
{
FLAG_S=2; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Motor=0; //电机开
Delay100ms(DELAY_C); //电机启动后延时切割
Cutting_dwon=0; //切割机下降
Delay100ms(DELAY_B);
Motor=1; //电机关
Cutting_dwon=1; //切割机上升
FLAG_S=1; //1待 机2切 割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
Run_TIME=0; //计时器归零
counter++; //产量加1
printf("n0.val=%d\xff\xff\xff",counter);//产量计数
}
RstKey(); //
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //手动按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT2) //手动按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
FLAG_S=1; //1待 机2切割
printf("va0.val=%d\xff\xff\xff",FLAG_S); //
Delay100ms(2);
FLAG_S=1; //1手 动2自 动
printf("va1.val=%d\xff\xff\xff",FLAG_S); //va1触摸屏变量 发送第一次
Run_TIME=0; //计时器归零
printf("n4.val=%d\xff\xff\xff",Run_TIME);//计时器归零
resrt_io();
Signauto=0; /*行程输入信号连续检测到3次Signauto=0退出循环*/
Run_Flag=0;
break;
}
}
while(Run_Flag);
}
//时间模式
}
/*------------初始化串口---------------------*/
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****/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
}
/**************定时中断*************************/
void timer0() interrupt 1
{
TH0=0X53;
TL0=0X32;
aa++;
if(aa>=300)
{
OUT1=~OUT1;
aa=0;
}
}
//---------外部中断0服务程序 红外检测位置到-----------
void Exint0_Routine(void) interrupt 0 // INT0中断入口(中断号0)
{
uchar j,q;
for(;j<8;) //按键循环5次
{
if(!INTPUT0) //按键低电平
{
j++;
q++;
}
else if(~!INTPUT0) //按键高电平
{
j++;
q=0;
}
if(q>6) //按键低电平
AutoCut_FLAG=1;
else
AutoCut_FLAG=0;
}
}
//----------外部中断1服务程序 手动临时切割-------------------
void Exint1_Routine(void) interrupt 2 // INT1中断入口(中断号2)
{
uchar j,q;
for(;j<8;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
j++;
q++;
}
else if(~!INTPUT1) //按键高电平
{
j++;
q=0;
}
if(q>6) //按键低电平
ManualCut_FLAG=1;
else
ManualCut_FLAG=0;
}
}
//----------外部中断2服务程序 气缸退到位-------------------
void Exint2_Routine(void) interrupt 10 // INT2中断入口(中断号10)
{
uchar j,q;
for(;j<8;) //按键循环5次
{
if(!INTPUT4) //按键低电平
{
j++;
q++;
}
else if(~!INTPUT4) //按键高电平
{
j++;
q=0;
}
if(q>6) //按键低电平
TableBack_FLAG=1; //台板退到位
else
TableBack_FLAG=0; //台板退到位
}
}
/*************************************************/
//E0 00 循环时间
//E0 01 切割时间
//B0 00 显示参数
//printh F0 00 00 00 00 00 FA 电机开启
//printh F0 01 00 00 00 00 FA 电机关闭
//printh F0 02 00 00 00 00 FA 切割开启
//printh F0 03 00 00 00 00 FA 切割关闭
void main( ) /*主程序开始*/
{
INTPUT0=1; //定长红外信号 P3.2
INTPUT1=1; //临时切割 P3.3
INTPUT4=1; //气缸退到位 P3.6
AutoCut_FLAG=0; //自动切割
ManualCut_FLAG=0; //手动切割
TableBack_FLAG=0; //台板退到位
AUXR=0X80; //STC系列的1T 设置
TMOD=0X01;
TH0=0X53;
TL0=0X32;
ET0=1;
TR0=1;
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
/* 4. 开启中断 */
EX0=1; /* 允许INT0中断 */
EX1=1; /* 允许INT1中断 */
IT0 = 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0 = 1; //使能INT0中断
IT1 = 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1 = 1; //使能INT1中断
INT_CLKO |= 0x10; //(EX2 = 1)使能INT2中断
Receive_Flag=0;
delay(20);
InitUart(); //初始化串口
resrt_io();
Delay100ms(20);
red_eeprom(); //
printf("XFF,XFF,XFF"); //
if(MODEMARK==0X55) //工作模式
{
MODE_FLAG=0; // 时间模式
}
else //
{
MODE_FLAG=1; // 位置模式
} //
i=0; //数据接收计数器等于0
Run_Flag=0; //自动标志等于0
counter=0; //产量归零
printf("n0.val=%d\xff\xff\xff",counter); // 产量计数
printf("n0.val=%d\xff\xff\xff",counter); // 产量计数
printf("n1.val=%d\xff\xff\xff",DELAY_A); // 延时切割时间
printf("n2.val=%d\xff\xff\xff",DELAY_B); // 切割时间
printf("n4.val=%d\xff\xff\xff",DELAY_C);//切割时间 校对
printf("n5.val=%d\xff\xff\xff",MODEMARK);//切割时间 校对
if(MODE_FLAG==0)
{
FLAG_S=1; // 时间模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
}
else if(MODE_FLAG==1)
{
FLAG_S=2; // 位置模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
}
while(1)
{
OUT0=~OUT0; //手动循环信号指示
Delay100ms(20);
////////////////////////////////
RstKey(); //按键复位
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey();
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey();
}
}
if(kstatus>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
Run_Flag=1; //自动运行标志
}
//自动
if(Receive_Flag==1) //串口数据更新标志
{
Receive_Flag=0;
if(a[0]==0XE0) //EEPROM参数存储
{
OUT0=0; //写EEPROM指示
if(a[1]==0X00)
{
DELAY_A=a[3]*256+a[2]; //延时切割时间
}
else if(a[1]==0X01)
{
DELAY_B=a[3]*256+a[2]; //延时切割时间
}
else if(a[1]==0X02)
{
DELAY_C=a[3]*256+a[2]; //延时切割时间
}
Write_EepromTime();
red_eeprom();
printf("n1.val=%d\xff\xff\xff",DELAY_A);//切割循环时间 校对
printf("n1.val=%d\xff\xff\xff",DELAY_A);//切割循环时间 校对
printf("n2.val=%d\xff\xff\xff",DELAY_B);//切割时间 校对
printf("n4.val=%d\xff\xff\xff",DELAY_C);//切割时间 校对
printf("n5.val=%d\xff\xff\xff",MODEMARK);//切割时间 校对
}
//
else if(a[0]==0XB0) //B0 00发送主画面 内容
{
if(a[1]==0X00) //
{
red_eeprom();
printf("n1.val=%d\xff\xff\xff",DELAY_A);//切割循环时间 校对
printf("n1.val=%d\xff\xff\xff",DELAY_A);//切割循环时间 校对
printf("n2.val=%d\xff\xff\xff",DELAY_B);//切割时间 校对
printf("n4.val=%d\xff\xff\xff",DELAY_C);//切割时间 校对
printf("n5.val=%d\xff\xff\xff",MODEMARK);//切割时间 校对
}
}
//发送参数到触摸屏
else if(a[0]==0XC0) //控制模式
{
if(a[1]==0X00) //
{
OUTB=0;
MODE_FLAG=0; /*时间模式*/
MODEMARK=0X55;
Write_EepromTime();
FLAG_S=1; // 时间模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
}
else if(a[1]==0X01) //
{
OUTB=1;
MODE_FLAG=1; /*位置模式*/
MODEMARK=0XAA;
Write_EepromTime();
FLAG_S=2; // 时间模式
printf("va2.val=%d\xff\xff\xff",FLAG_S); //定时器刷新标志
}
}
//工作模式
else if(a[0]==0XF0) //B0 00发送主画面 内容
{
if(a[1]==0X00) //电机开启
{
Motor=0;
}
else if(a[1]==0X01) //电机关闭
{
Motor=1;
}
else if(a[1]==0X02) //电机开启
{
Cutting_dwon=0; //切割机下降
}
else if(a[1]==0X03) //电机关闭
{
Cutting_dwon=1; //切割机下降
}
}
}
//
if(Run_Flag==1) //自动运行标志
{
printf("page 0\XFF\XFF\XFF"); //自动界面显示
Manual=1; //手动指示
Automatic=0; //自动指示
FLAG_S=2; //1手 动2自 动
printf("va1.val=%d\xff\xff\xff",FLAG_S); //va1触摸屏变量 发送第一次
Delay100ms(5);
start(); //自动运行循环子程序
}
}
} //L558 CODE3082 2026 5 14