不锈钢焊管自动切割程序

发布时间:2026/8/29 9:30:06

不锈钢焊管自动切割程序
切割机控制板代码修改 单选框和双态按钮联动beep 50r1.val0bt0.val1bt0.txt时间方式printh C0 00 00 00 00 00 FAbeep 50r0.val0bt0.val0bt0.txt位置方式printh C0 01 00 00 00 00 FAif(bt0.val1){//此时按键是按下的bt0.txt时间方式r0.val1r1.val0printh C0 01 00 00 00 00 FA}else{//此时按键是弹起的r0.val0r1.val1bt0.txt位置方式printh C0 00 00 00 00 00 FA}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);//切割时间 校对}if(a[1]0X01) //{if(MODE_FLAG0){FLAG_S1; // 时间模式printf(r0.val%d\xff\xff\xff,FLAG_S);//printf(bt0.val%d\xff\xff\xff,FLAG_S);//FLAG_S0; // 时间模式printf(r1.val%d\xff\xff\xff,FLAG_S);//}else if(MODE_FLAG1){FLAG_S0; // 位置模式printf(r0.val%d\xff\xff\xff,FLAG_S);//printf(bt0.val%d\xff\xff\xff,FLAG_S);//FLAG_S1;printf(r1.val%d\xff\xff\xff,FLAG_S);//}}}//发送参数到触摸屏单片机型号/*********焊管机切割控制程序************//***L667 CODE3561 2026 8 29 IAP15E413AS*//*********位置 启动 自动 手动***********//*********电机 气缸 手动 自动***********/#include REG52.H // cutting 切割#include intrins.h //#include string.h //#include stdio.h //#define uint unsigned int //#define uchar unsigned char //sfr INT_CLKO0x8F; //外部中断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 SYSCLK20MHz#define IAP_ADDRESS 0x0000 //时间 EEPROM首地址typedef unsigned char BYTE; //Catch_Up接上Catch_Dwon接下typedef unsigned int WORD;bit Signauto0; /*退出循环检测*/bit Rst_Bit0; /**/bit MODE_FLAG; /*工作模式*/bit AutoCut_FLAG; //自动切割bit ManualCut_FLAG; //手动切割bit TableBack_FLAG; //台板退到位sbit MotorP1^0; //电机sbit Cutting_dwonP1^1; //切割机下降sbit OUTAP1^4; //备用sbit OUTBP1^5; //时间模式 位置模式 指示sbit OUT0P1^6; //手动循环信号指示sbit OUT1P1^7; //定时中断 指示sbit OUT2P2^7; //台板sbit ManualP1^2; //手动指示sbit AutomaticP1^3; //自动指示// sbit INTPUT0P3^5; //气缸退// sbit INTPUT1P3^3; //自动P3^3// sbit INTPUT2P3^2; //手动P3^2// sbit INTPUT3P3^4; //临时切割3^4// sbit INTPUT4P3^5; //定长切割3^5sbit INTPUT0P3^2; //定长红外信号sbit INTPUT1P3^3; //临时切割sbit INTPUT2P3^4; //手动sbit INTPUT3P3^5; //自动sbit INTPUT4P3^6; //气缸退到位uint Ad_data;uint Run_TIME; //uint DELAY_A,DELAY_B,DELAY_C; //切割延时uint MODEMARK;uint aa0; /****RUN FLAG****/uint a[10]; //定义数组auchar 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; //使能IAPIAP_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; //使能IAPIAP_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 valIapReadByte(IAP_ADDRESS1);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(i0;it;i)for(j0;j1000;j);}/*-----------(1)延时子程序12MHz 加千百十个显示--------*/void Delay100ms(uint x) //{uint i,j;for(i0;ix;i)for(j0;j11000;j);}/********************************************/void resrt_io(){FLAG_S1; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //Motor1; //电机关Cutting_dwon1; //切割机下降OUTA1; //OUTB1; //Manual0; //手动指示Automatic1; //自动指示}/****************按键计数器状态寄存器归零*************/void RstKey(){kcounter0; //按键计数器归零kstatus0; //状态寄存器归零}/*****************按键低电平检测函数*****************/void LowVoltKey(void) //按键计数器状态标志加一{kcounter;kstatus;}/*****************按键高电平检测函数*****************/void HighVoltKey(void) //按键计数器加一 状态标志归零{kcounter; //按键计数器加一kstatus0; //按键状态标志归零}/******************************************/void red_eeprom(void){uint m,n;mIapReadByte(IAP_ADDRESS); //时间前八位nIapReadByte(IAP_ADDRESS1); //时间后八位DELAY_Am*256n; //排气一段延时时间mIapReadByte(IAP_ADDRESS2); //时间前八位nIapReadByte(IAP_ADDRESS3); //时间后八位DELAY_Bm*256n; //排气一段延时时间MODEMARKIapReadByte(IAP_ADDRESS4);//工作模式DELAY_CIapReadByte(IAP_ADDRESS5);//电机启动后延时切割}/******************************************/void Write_EepromTime(){IapEraseSector(IAP_ADDRESS); //扇区擦除IapProgramByte(IAP_ADDRESS,DELAY_A/256); // 高位IapProgramByte(IAP_ADDRESS1,DELAY_A%256); // 低位IapProgramByte(IAP_ADDRESS2,DELAY_B/256); // 高位IapProgramByte(IAP_ADDRESS3,DELAY_B%256); // 低位IapProgramByte(IAP_ADDRESS4,MODEMARK); // 工作模式IapProgramByte(IAP_ADDRESS5,DELAY_C%256); // 电机启动后延时切割}/*****************************************//***产量 工作模式 自动手动 启动Run_TIME***/void start(){Manual1; //手动指示Automatic0; //自动指示Run_TIME0; //初始化if(MODE_FLAG1) //{/*一:启动无输入为1,永久循环*/FLAG_S2; // 位置模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志do{ //INTPUT3 启动信号if(ManualCut_FLAG1) //手动临时切割标志{ManualCut_FLAG0;FLAG_S2; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Motor0; //电机开Delay100ms(DELAY_C); //电机启动后延时切割Cutting_dwon0; //切割机下降Delay100ms(DELAY_B);Motor1; //电机关Delay100ms(10); //延时1秒OUT20; //台板返回TableBack_FLAG1; //台板退标志Cutting_dwon1; //切割机上升FLAG_S1; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Delay100ms(100); //延时 启动按键释放}//INTPUT3 临时切割if(AutoCut_FLAG1) //按键低电平{AutoCut_FLAG0;FLAG_S2; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Motor0; //电机开Delay100ms(DELAY_C); //电机启动后延时切割Cutting_dwon0; //切割机下降Delay100ms(DELAY_B);Motor1; //电机关Delay100ms(10); //延时1秒OUT20; //台板返回TableBack_FLAG1; //台板退标志//Cutting_dwon1; //切割机上升FLAG_S1; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志counter; //产量加1printf(n0.val%d\xff\xff\xff,counter); //产量计数Delay100ms(100); //延时 启动按键释放}//INTPUT4 定长切割RstKey(); //for(;kcounter5;) //按键循环5次{if(!INTPUT2) //手动按键低电平 INTPUT2P3^4{LowVoltKey(); //按键低电平 计数器加一状态标志加一}else if(~!INTPUT2) //手动按键高电平{HighVoltKey(); //按键计数器加一 状态标志归零}}if(kstatus3) /*按键状态标志大于等于3为有效值*/{FLAG_S1; //1待 机2切割printf(va0.val%d\xff\xff\xff,FLAG_S); //FLAG_S1; //1手 动2自 动printf(va1.val%d\xff\xff\xff,FLAG_S); //va1触摸屏变量 发送第一次resrt_io();Signauto0; /*行程输入信号连续检测到3次Signauto0退出循环*/Run_Flag0;break;}//手动退出位置循环}while(Run_Flag);}//位置模式else{FLAG_S1; //时间模式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(;kcounter5;) //按键循环5次{if(!INTPUT3) //按键低电平{LowVoltKey(); //按键低电平 计数器加一状态标志加一}else if(~!INTPUT3) //按键高电平{HighVoltKey(); //按键计数器加一 状态标志归零}}if(kstatus3) /*按键状态标志大于等于3为有效值*/{FLAG_S2; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Motor0; //电机开Delay100ms(DELAY_C); //电机启动后延时切割Cutting_dwon0; //切割机下降Delay100ms(DELAY_B);Motor1; //电机关Cutting_dwon1; //切割机上升FLAG_S1; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Run_TIME0; //临时切割 计时器归零}if(Run_TIMEDELAY_A){FLAG_S2; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Motor0; //电机开Delay100ms(DELAY_C); //电机启动后延时切割Cutting_dwon0; //切割机下降Delay100ms(DELAY_B);Motor1; //电机关Cutting_dwon1; //切割机上升FLAG_S1; //1待 机2切 割printf(va0.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志Run_TIME0; //计时器归零counter; //产量加1printf(n0.val%d\xff\xff\xff,counter);//产量计数}RstKey(); //for(;kcounter5;) //按键循环5次{if(!INTPUT2) //手动按键低电平{LowVoltKey(); //按键低电平 计数器加一状态标志加一}else if(~!INTPUT2) //手动按键高电平{HighVoltKey(); //按键计数器加一 状态标志归零}}if(kstatus3) /*按键状态标志大于等于3为有效值*/{FLAG_S1; //1待 机2切割printf(va0.val%d\xff\xff\xff,FLAG_S); //Delay100ms(2);FLAG_S1; //1手 动2自 动printf(va1.val%d\xff\xff\xff,FLAG_S); //va1触摸屏变量 发送第一次Run_TIME0; //计时器归零printf(n4.val%d\xff\xff\xff,Run_TIME);//计时器归零resrt_io();Signauto0; /*行程输入信号连续检测到3次Signauto0退出循环*/Run_Flag0;break;}}while(Run_Flag);}//时间模式}/*------------初始化串口---------------------*/void InitUart(){SCON0X50; //8位数据可变波特率AUXR|0x01; //串口1选择定时器2为波特率发生器AUXR|0X04; //定时器2时钟为Fosc即1TT2L0XE0; //设置定时器处置 110592》9600T2H0XFE; //设置定时器处置 110592》9600AUXR|0X10; //启动定时器2TI1;ES1; //EA1;}/*×--------UART 中断服务程序-------------------**//**×**把接收到的数据存进数组a[i]**i开机初始化****//***×*接收到触摸屏结束码Receive_Flag标志位置1****/void Uart() interrupt 4 using 1{if(RI){if(SBUF0XFA) //触摸屏结束码{Receive_Flag1; //接收数据标志置一RI0; //i0; //数组计数器归零}else{a[i]SBUF; //数组下标位置的数据等于SBUFRI0; //i;}}}/**************定时中断*************************/void timer0() interrupt 1{TH00X53;TL00X32;aa;if(aa300){OUT1~OUT1;aa0;}}//---------外部中断0服务程序 红外检测位置到-----------void Exint0_Routine(void) interrupt 0 // INT0中断入口中断号0{uchar j,q;for(;j8;) //按键循环5次{if(!INTPUT0) //按键低电平{j;q;}else if(~!INTPUT0) //按键高电平{j;q0;}if(q6) //按键低电平AutoCut_FLAG1;elseAutoCut_FLAG0;}}//----------外部中断1服务程序 手动临时切割-------------------void Exint1_Routine(void) interrupt 2 // INT1中断入口中断号2{uchar j,q;for(;j8;) //按键循环5次{if(!INTPUT1) //按键低电平{j;q;}else if(~!INTPUT1) //按键高电平{j;q0;}if(q6) //按键低电平ManualCut_FLAG1;elseManualCut_FLAG0;}}//----------外部中断2服务程序 气缸退到位-------------------void Exint2_Routine(void) interrupt 10 // INT2中断入口中断号10{uchar j,q;if(TableBack_FLAG1) //台板退{for(;j8;) //按键循环8次{if(!INTPUT4) //按键低电平 P3^6;{j;q;}else if(~!INTPUT4) //按键高电平{j;q0;}if(q6) //检测有效值{OUT21; //台板TableBack_FLAG0; //台板退到位}}}}/*************************************************///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( ) /*主程序开始*/{INTPUT01; //定长红外信号 P3.2INTPUT11; //临时切割 P3.3INTPUT41; //气缸退到位 P3.6AutoCut_FLAG0; //自动切割ManualCut_FLAG0; //手动切割TableBack_FLAG0; //台板退到位AUXR0X80; //STC系列的1T 设置TMOD0X01;TH00X53;TL00X32;ET01;TR01;P_SW10x00; //RXD/P3.0, TXD/P3.1/* 4. 开启中断 */EX01; /* 允许INT0中断 */EX11; /* 允许INT1中断 */IT0 1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)EX0 1; //使能INT0中断IT1 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)EX1 1; //使能INT1中断INT_CLKO | 0x10; //(EX2 1)使能INT2中断Receive_Flag0;delay(20);InitUart(); //初始化串口resrt_io();Delay100ms(20);red_eeprom(); //printf(XFF,XFF,XFF); //if(MODEMARK0X55) //工作模式{MODE_FLAG0; // 时间模式FLAG_S1; // 时间模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志}else //{MODE_FLAG1; // 位置模式FLAG_S2; // 位置模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志} //i0; //数据接收计数器等于0Run_Flag0; //自动标志等于0counter0; //产量归零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);//切割时间 校对while(1){OUT0~OUT0; //手动循环信号指示Delay100ms(20);////////////////////////////////RstKey(); //按键复位for(;kcounter5;) //按键循环5次{if(!INTPUT3) //自动 INTPUT3 P3^5;按键低电平{LowVoltKey();}else if(~!INTPUT3) //按键高电平{HighVoltKey();}}if(kstatus4) /*按键状态标志大于等于3为有效值*/{ /*循环检测 */Run_Flag1; //自动运行标志}//自动if(Receive_Flag1) //串口数据更新标志{Receive_Flag0;if(a[0]0XE0) //EEPROM参数存储{OUT00; //写EEPROM指示if(a[1]0X00){DELAY_Aa[3]*256a[2]; //延时切割时间}else if(a[1]0X01){DELAY_Ba[3]*256a[2]; //延时切割时间}else if(a[1]0X02){DELAY_Ca[3]*256a[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);//切割时间 校对if(MODEMARK0X55) //工作模式{MODE_FLAG0; // 时间模式FLAG_S1; // 时间模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志}else //{MODE_FLAG1; // 位置模式FLAG_S2; // 位置模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志} //}if(a[1]0X01) //{if(MODE_FLAG0) // 时间模式{FLAG_S1;printf(r0.val%d\xff\xff\xff,FLAG_S);//printf(bt0.val%d\xff\xff\xff,FLAG_S);//FLAG_S0; // 时间模式printf(r1.val%d\xff\xff\xff,FLAG_S);//FLAG_S1;printf(n3.val%d\xff\xff\xff,1);// 时间模式}else if(MODE_FLAG1) // 位置模式{FLAG_S0;printf(r0.val%d\xff\xff\xff,FLAG_S);//printf(bt0.val%d\xff\xff\xff,FLAG_S);//FLAG_S1;printf(r1.val%d\xff\xff\xff,FLAG_S);//FLAG_S2;printf(n3.val%d\xff\xff\xff,2);// 位置模式}}}//发送参数到触摸屏else if(a[0]0XC0) //控制模式{if(a[1]0X00) //{OUTB0;MODE_FLAG0; /*时间模式*/MODEMARK0X55;Write_EepromTime();FLAG_S1; // 时间模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志}else if(a[1]0X01) //{OUTB1;MODE_FLAG1; /*位置模式*/MODEMARK0XAA;Write_EepromTime();FLAG_S2; // 时间模式printf(va2.val%d\xff\xff\xff,FLAG_S); //定时器刷新标志}}//工作模式else if(a[0]0XF0) //B0 00发送主画面 内容{if(a[1]0X00) //电机开启{Motor0;}else if(a[1]0X01) //电机关闭{Motor1;}else if(a[1]0X02) //电机开启{Cutting_dwon0; //切割机下降}else if(a[1]0X03) //电机关闭{Cutting_dwon1; //切割机下降}}}//if(Run_Flag1) //自动运行标志{printf(page 0\XFF\XFF\XFF); //自动界面显示Manual1; //手动指示Automatic0; //自动指示FLAG_S2; //1手 动2自 动printf(va1.val%d\xff\xff\xff,FLAG_S); //va1触摸屏变量 发送第一次Delay100ms(5);start(); //自动运行循环子程序}}} //L667 CODE3561 2026 8 29TAP15W413EEOROM 字节读写程序AI让我查看一个相关帖子和获取更多关于STC15W4K系列EEPROM地址的信息。根据手册中的示例程序STC15W4K系列的IAP测试地址是0x0400这可以从手册示例确认。让我确认一下手册中关于EEPROM地址的描述。根据已获取的手册内容我可以为您编写STC15W4K系列EEPROM的字节读写程序了。手册中的示例已经提供了完整的代码框架。但需要说明的是您写的型号TAP15W413E从字面上看不太像标准的STC型号可能是笔误。根据手册参数STC15W4K系列是该系列中最常见的型号。让我确认您的意思。关于您所说的TAP15W413E我推测您可能指的是STC15W4K系列如STC15W4K32S4、STC15W4K56S4等或者是IAP15W4K系列。请您确认一下具体型号因为不同型号的EEPROM大小不同EEPROM起始地址也不同。不过无论具体型号EERPOM字节读写操作的原理完全一致。下面我直接给出基于STC15W4K系列的完整EEPROM字节读写程序该程序在Keil C51环境下编译采用Intel 8052模式。STC15W4K系列 EEPROM 字节读写程序/*------------------------------------------------------------------ STC15W4K系列单片机 EEPROM(IAP) 字节读写演示程序 编译器Keil C51选择Intel 8052模式头文件包含reg51.h即可 晶振假定为18.432MHz注意ENABLE_IAP等待时间宏需按实际频率选择 ------------------------------------------------------------------*/ #include reg51.h #include intrins.h typedef unsigned char BYTE; typedef unsigned int WORD; //--------------------------------------- // IAP/EEPROM 特殊功能寄存器定义 //--------------------------------------- sfr IAP_DATA 0xC2; // IAP数据寄存器 sfr IAP_ADDRH 0xC3; // IAP地址寄存器高字节 sfr IAP_ADDRL 0xC4; // IAP地址寄存器低字节 sfr IAP_CMD 0xC5; // IAP命令寄存器 sfr IAP_TRIG 0xC6; // IAP命令触发寄存器 sfr IAP_CONTR 0xC7; // IAP控制寄存器 //--------------------------------------- // IAP 命令定义 //--------------------------------------- #define CMD_IDLE 0 // 空闲模式 #define CMD_READ 1 // IAP字节读命令 #define CMD_PROGRAM 2 // IAP字节编程命令 #define CMD_ERASE 3 // IAP扇区擦除命令 //--------------------------------------- // IAP 使能及等待时间设置 // 按系统时钟频率选择合适的ENABLE_IAP值 //--------------------------------------- //#define ENABLE_IAP 0x80 // if SYSCLK30MHz //#define ENABLE_IAP 0x81 // if SYSCLK24MHz #define ENABLE_IAP 0x82 // if SYSCLK20MHz (本例按18.432MHz) //#define ENABLE_IAP 0x83 // if SYSCLK12MHz //#define ENABLE_IAP 0x84 // if SYSCLK6MHz //#define ENABLE_IAP 0x85 // if SYSCLK3MHz //#define ENABLE_IAP 0x86 // if SYSCLK2MHz //#define ENABLE_IAP 0x87 // if SYSCLK1MHz //--------------------------------------- // EEPROM 测试起始地址 // STC15W4K32S4 的 EEPROM 起始地址为 0x0400 // 具体请按您的型号和ISP软件中设置的EEPROM大小确定 //--------------------------------------- #define IAP_ADDRESS 0x0400 //--------------------------------------- // 函数声明 //--------------------------------------- void Delay(BYTE n); void IapIdle(void); BYTE IapReadByte(WORD addr); void IapProgramByte(WORD addr, BYTE dat); void IapEraseSector(WORD addr); /*------------------------------------------------------------------ 主函数演示 擦除-写入-校验 完整流程 ------------------------------------------------------------------*/ void main(void) { WORD i; BYTE dat; P1 0xfe; // 1111,1110 系统初始化OK Delay(10); // 1. 扇区擦除EEPROM只能按扇区擦除512字节/扇区 IapEraseSector(IAP_ADDRESS); // 2. 检测擦除是否成功全FF检测 for (i 0; i 512; i) { if (IapReadByte(IAP_ADDRESS i) ! 0xff) goto Error; // 如果出错则退出 } P1 0xfc; // 1111,1100 擦除成功 Delay(10); // 3. 字节编程写入512字节数据 for (i 0; i 512; i) { IapProgramByte(IAP_ADDRESS i, (BYTE)i); } P1 0xf8; // 1111,1000 编程完成 Delay(10); // 4. 校验512字节 for (i 0; i 512; i) { if (IapReadByte(IAP_ADDRESS i) ! (BYTE)i) goto Error; // 如果校验错误则退出 } P1 0xf0; // 1111,0000 测试完成 // 5. 单独演示字节读操作 dat IapReadByte(IAP_ADDRESS); // 读取地址0x0400的数据 // 此时 dat 应该等于 0x00 while (1); // 程序停在这里 Error: P1 0x7f; // 0xxx,xxxx IAP操作失败 while (1); } /*------------------------------------------------------------------ 软件延时函数 ------------------------------------------------------------------*/ void Delay(BYTE n) { WORD x; while (n--) { x 0; while (x); } } /*------------------------------------------------------------------ 关闭IAP功能安全操作 ------------------------------------------------------------------*/ void IapIdle(void) { IAP_CONTR 0; // 关闭IAP功能 IAP_CMD 0; // 清除命令寄存器 IAP_TRIG 0; // 清除触发寄存器 IAP_ADDRH 0x80; // 将地址设置到非IAP区域 IAP_ADDRL 0; } /*------------------------------------------------------------------ 从ISP/IAP/EEPROM区域读取一字节 入口参数addr - 要读取的EEPROM地址 返回读取到的数据 ------------------------------------------------------------------*/ BYTE IapReadByte(WORD addr) { BYTE dat; // 数据缓冲区 EA 0; // 关闭总中断 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功能 EA 1; // 恢复总中断 return dat; // 返回读取的数据 } /*------------------------------------------------------------------ 写一字节数据到ISP/IAP/EEPROM区域 注意目标字节必须是FFH空才能编程 否则需先进行扇区擦除 入口参数addr - 要写入的EEPROM地址 dat - 要写入的数据 ------------------------------------------------------------------*/ void IapProgramByte(WORD addr, BYTE dat) { EA 0; // 关闭总中断 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(); // 关闭IAP功能 EA 1; // 恢复总中断 } /*------------------------------------------------------------------ 扇区擦除没有字节擦除只有扇区擦除512字节/扇区 入口参数addr - 扇区内任意一个字节地址 ------------------------------------------------------------------*/ void IapEraseSector(WORD addr) { EA 0; // 关闭总中断 IAP_CONTR ENABLE_IAP; // 使能IAP 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(); // 关闭IAP功能 EA 1; // 恢复总中断 }使用要点说明EEPROM 地址STC15W4K32S4 的数据FlashEEPROM起始地址为0x0400即程序Flash空间之后。不同型号的EEPROM大小和起始地址不同具体请根据手册中该型号的数据Flash大小确定。例如STC15W4K16S4数据Flash 4K起始地址 0x0400STC15W4K32S4数据Flash 26K起始地址 0x040026K数据Flash在32K程序之后注实际EEPROM起始地址需根据您用ISP软件下载时选择的EEPROM大小设置来确定。在STC-ISP软件中可以设置程序区和EEPROM区的分界。三个基本操作来自手册字节读从DataFlash/EEPROM区读一字节字节编程只能将1写成1或0将0写成0。如果某字节是FFH才可字节编程否则须先扇区擦除。扇区擦除只有扇区擦除才可能将0擦除为1512字节/扇区。关键注意事项每次IAP操作需对IAP_TRIG先写0x5A再写0xA5每次都需如此。IAP操作不会自动增减地址需手动设置IAP_ADDRH/IAP_ADDRL。必须在触发前关闭总中断EA0操作完成后恢复防止IAP触发序列被中断打断导致出错。等待时间宏ENABLE_IAP必须按实际系统时钟频率选择否则写入/擦除可能失败。关于型号确认您写的TAP15W413E不是标准STC型号我按STC15W4K系列编写。如果您实际使用的是其他具体型号请确认我可以帮您调整EEPROM起始地址和等待时间参数。如果您能确认具体型号例如 STC15W4K56S4、IAP15W4K58S4 等我可以帮您进一步核对EEPROM起始地址和实际地址分配。需要我继续完善吗 搜索 TAP15W413EEOROM 字节读写程序 相关论坛讨论IAP15W413ASSTC15W413AS有几个外部中断 | 挺好STC32G12K128设置128K eeprom 烧录isp后串口烧录ap程序后问题⏱️ 查找用时 8.9s | 总回答用时 32.9s

相关新闻

Tair 监控指标体系:QPS/延迟/命中率/内存全维度告警配置

Tair 监控指标体系:QPS/延迟/命中率/内存全维度告警配置

2026/8/29 9:30:06

构建一套完善的监控指标体系是保障 Tair(Redis 企业版)稳定运行的关键。瑶池数据库旗下的 Tair 在控制台内置了涵盖 QPS、延迟、缓存命中率、内存使用率、连接数、带宽等全维度监控指标,并支持与阿里云云监控深度集成实现智能告警。本文系统梳…

众包平台停运启示:构建外部依赖清单与最小迁移预案

众包平台停运启示:构建外部依赖清单与最小迁移预案

2026/8/29 9:20:06

我的一个朋友做自然语言处理项目,项目里有一段数据标注流水线,依赖一个众包平台,跑了好几个月,一直没出什么大问题。直到有一天他看到一条消息:Amazon Mechanical Turk 这个平台将在 9 月 30 日停止运营。他当时的反应…

ai-memory-importer:从其他Wiki工具迁移数据完整指南

ai-memory-importer:从其他Wiki工具迁移数据完整指南

2026/8/29 9:20:06

ai-memory-importer:从其他Wiki工具迁移数据完整指南 【免费下载链接】ai-memory Solution for long term memory for agent coding CLIs and to facilitate handoff between different agent vendors 项目地址: https://gitcode.com/GitHub_Trending/ai/ai-memor…

AI工程范式切换:从模型能力竞赛到智能体工作流落地

AI工程范式切换:从模型能力竞赛到智能体工作流落地

2026/8/29 10:30:09

过去一两年,很多人对人工智能的判断是“一条直线”:模型越大,能力越强;能力越强,应用自然越多。但最近一段时间的真实体感,不是线性增长,而是频繁出现的转折和重新定义。模型更新节奏在加快&…

具身智能与城市机器人试验场:从仿真到真机的系统工程

具身智能与城市机器人试验场:从仿真到真机的系统工程

2026/8/29 10:30:09

机器人要真正走进城市,并不只是“造一台更聪明的机器”那么简单。当一台具备感知、决策、自主移动能力的设备被放到真实街道、园区、楼宇和交通枢纽中,考验的就不再是某一个算法,而是从传感器、算力、通信到数据闭环的一整套系统工程。长沙正…

低功耗物联网组网实战:智能楼宇传感器部署与协议选型指南

低功耗物联网组网实战:智能楼宇传感器部署与协议选型指南

2026/8/29 10:30:09

做智能楼宇项目这几年,我越来越清楚地感受到,低功耗物联网(IoT)组网不是低成本替代品,而是真正决定项目能不能落地、能不能长期运行的关键。环境传感器、水电表、门锁、照明控制……这些看起来简单的点位,一…

AI Agent工具部署实战:OpenClaw、Hermes Agent与Buzz选型对比

AI Agent工具部署实战:OpenClaw、Hermes Agent与Buzz选型对比

2026/8/29 10:30:09

如果只看项目首页,2025 年的 AI Agent 工具一个比一个美好:一行命令安装,一个配置文件启动,支持钉钉、飞书、微信,还能接上 DeepSeek、本地模型、NVIDIA NIM。但真到动手部署那天,很多人会发现事情没有那么…

法国营销电话新规下的呼叫中心外呼合规改造与拦截技术解析

法国营销电话新规下的呼叫中心外呼合规改造与拦截技术解析

2026/8/29 10:30:09

最近法国宣布将禁止未经用户同意的主动营销电话,也就是常说的 unsolicited telemarketing calls。虽然这看起来是一条政策新闻,但它背后直接影响的是呼叫中心的外呼策略、号码标记体系、CRM/CTI 系统的同意管理逻辑,以及普通用户手机上的骚扰…

Proxmox VE + VDI-WEB 云桌面离线安装包更新指南

Proxmox VE + VDI-WEB 云桌面离线安装包更新指南

2026/8/29 10:20:09

如果你所在的生产环境是内网隔离网络,没有外网、没有可用的软件源缓存,只有一台 Proxmox VE 服务器和一套已经跑了大半年的平台,那么每次升级都是一次对运维习惯和备份意识的检验。很多团队在部署云桌面时优先选择 Proxmox VDI-WEB 组合&…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/27 11:10:02

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/29 10:22:10

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/28 7:34:42

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

四款热门降AI工具测评:研究生和本科生怎么选?

四款热门降AI工具测评:研究生和本科生怎么选?

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

论文降AI率免费攻略:自查、提示词与工具推荐

论文降AI率免费攻略:自查、提示词与工具推荐

2026/8/29 0:09:39

马上要交论文了,最近真的被论文ai率折磨的够呛。 明明查重都没问题了,但是ai率就是居高不下,崩溃了,明明都是我自己写的,天杀的,明明都是我亲生的啊 改来改去,终于给我搞出一套完美的降ai方案…

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

北京GEO优化服务商推荐:预算型企业如何选北京GEO优化服务商?

2026/8/29 0:09:39

前言:预算有限的企业更关心投入能否形成可持续的品牌资产。评估北京GEO优化服务商时,不能只比较单篇内容或单月报价,还要看是否能够把问题词、官网、信源和监测串成完整链路。本期重点放在预算配置、试点范围和交付边界,帮助企业先…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…