单片机自动脱模剂喷雾控制系统
/***实现功能:检测报警信号,脱模剂开模数计数信号***//***参数:1:脱模剂开模数 2:喷雾时间 3:延时时间 ***//***串口接收触摸屏参数设置字符串,接收并保存******//***端子输入口读开模数,比较设定值后输出到电磁阀**//***端子输入口读报警信号,到设定值关闭电机及加热**/#include REG52.H#include intrins.H#include stdio.h#define uint unsigned int#define uchar unsigned char#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;typedef unsigned int WORD;uchar s;sbit AUXP5^5; /****RoLa***/sbit MD0MD1P3^2; /****RoLa***/sbit OUT1P1^0; /****输出***/sbit WARNINGP1^1; /****输入***/sbit INTPUT1P1^6; /****输入***/uchar v; /*从机号*/uchar Modulus; //开模数uchar Spray_Time; //喷雾时间uchar Delay_Time; //延时时间uchar kcounter,kstatus; //按键计数标志 按键状态标志bit Receive_Flag;uchar DAT20;static uint val1,val2,val3,val4,val5;uint TIME0; //实际开模数uint a[10]; //定义数组a 存储串口数据串/*---------------延时子程序----------------*/void delay1 (uint ms){uint i,j;for(i0;ims;i)for(j0;j200;j);}/*------------------延时子程序------------------------*/void delay10ms(uint x){uint i, j;for (i0;ix;i)for (j0;j500;j);}/*-----------延时100ms子程序12MHz --------*/void Delay_100ms(uint x) //{uint i,j;for(i0;ix;i){for(j0;j18000;j);}}/****************按键计数器状态寄存器归零*************/void RstKey(){kcounter0; //按键计数器归零kstatus0; //状态寄存器归零}/*****************按键低电平检测函数*****************/void LowVoltKey(void) //按键计数器状态标志加一{kcounter;kstatus;_nop_(); //延时}/*****************按键高电平检测函数*****************/void HighVoltKey(void) //按键计数器加一 状态标志归零{kcounter; //按键计数器加一kstatus0; //按键状态标志归零_nop_(); //延时}/*----关闭IAP----------------------------*/void IapIdle(){IAP_CONTR0; //关闭IAP功能IAP_CMD0; //清除命令寄存器IAP_TRIG0; //清除触发寄存器IAP_ADDRH0X80; //将地址设置到非IAP区域IAP_ADDRL0;}/*-从ISP/IAP/EEPROM区域读取一字节-*/BYTE IapReadByte(WORD addr){BYTE dat; //数据缓冲区IAP_CONTRENABLE_IAP; //使能IAPIAP_CMDCMD_READ; //设置IAP命令IAP_ADDRLaddr; //设置IAP低地址IAP_ADDRHaddr8; //设置IAP高地址IAP_TRIG0x5a; //写触发命令(0x5a)IAP_TRIG0xa5; //写触发命令(0xa5)_nop_(); //等待ISP/IAP/EEPROM操作完成datIAP_DATA; //读ISP/IAP/EEPROM数据IapIdle(); //关闭IAP功能return dat; //返回}/*-写一字节数据到ISP/IAP/EEPROM区域-*/void IapProgramByte(WORD addr, BYTE dat){IAP_CONTRENABLE_IAP; //使能IAPIAP_CMDCMD_PROGRAM; //设置IAP命令IAP_ADDRLaddr; //设置IAP低地址IAP_ADDRHaddr8; //设置IAP高地址IAP_DATAdat; //写ISP/IAP/EEPROM数据IAP_TRIG0x5a; //写触发命令(0x5a)IAP_TRIG0xa5; //写触发命令(0xa5)_nop_(); //等待ISP/IAP/EEPROM操作完成IapIdle();}/*---扇区擦除---------------*/void IapEraseSector(WORD addr){IAP_CONTRENABLE_IAP; //使能IAP valIapReadByte(IAP_ADDRESS1);IAP_CMDCMD_ERASE; //设置IAP命令IAP_ADDRLaddr; //设置IAP低地址IAP_ADDRHaddr8; //设置IAP高地址IAP_TRIG0x5a; //写触发命令(0x5a)IAP_TRIG0xa5; //写触发命令(0xa5)_nop_(); //等待ISP/IAP/EEPROM操作完成IapIdle();}/*************写参数到EEPROM*******************************/void Write_EepromTime(){IapEraseSector(IAP_ADDRESS); //扇区擦除IapProgramByte(IAP_ADDRESS0,val1/256); /*设定间距高八位*/IapProgramByte(IAP_ADDRESS1,val1%256); /*设定间距低八位*/IapProgramByte(IAP_ADDRESS2,val2/256); /*电机速度高八位*/IapProgramByte(IAP_ADDRESS3,val2%256); /*电机速度低八位*/IapProgramByte(IAP_ADDRESS4,val2);/*比例系数高八位*/IapProgramByte(IAP_ADDRESS5,val2);/*比例系数低八位*/IapProgramByte(IAP_ADDRESS6,val3/256); /*顶进时间高八位*/IapProgramByte(IAP_ADDRESS7,val3%256); /*顶进时间低八位*/IapProgramByte(IAP_ADDRESS8,val4/256); /*顶退时间高八位*/IapProgramByte(IAP_ADDRESS9,val4%256); /*顶退时间低八位*/IapProgramByte(IAP_ADDRESS10,val5/256); /*开闸时间高八位*/IapProgramByte(IAP_ADDRESS11,val5%256); /*开闸时间低八位*/}/***********************************/void red_eeprom(void){uint m,n;mIapReadByte(IAP_ADDRESS0); //开模数高八位nIapReadByte(IAP_ADDRESS1); //开模数低八位val1m*256n; //开模数mIapReadByte(IAP_ADDRESS2); //喷雾时间高八位nIapReadByte(IAP_ADDRESS3); //喷雾时间低八位val2m*256n; //喷雾时间mIapReadByte(IAP_ADDRESS4); //喷雾延时时间高八位nIapReadByte(IAP_ADDRESS5); //喷雾延时时间低八位val3m*256n; //喷雾延时时间mIapReadByte(IAP_ADDRESS6); //报警延时关加热电机高八位nIapReadByte(IAP_ADDRESS7); //报警延时关加热电机低八位val4m*256n; //报警延时关加热电机时间mIapReadByte(IAP_ADDRESS8); //备用高八位nIapReadByte(IAP_ADDRESS9); //备用低八位val5m*256n; //备用}/*------------初始化串口---------------------*/void InitUart(){SCON0X50; //8位数据可变波特率AUXR|0x01; //串口1选择定时器2为波特率发生器AUXR|0X04; //定时器2时钟为Fosc即1TT2L0XE0; //设置定时器处置 110592》9600T2H0XFE; //设置定时器处置 110592》9600AUXR|0X10; //启动定时器2TI1;ES1; //EA1;}/**************串口发送*****************************/void Send(uchar temp){unsigned serial;serialtemp;SBUF(uchar)temp;while(TI!1);TI0;}/*--------UART 中断服务程序----BuffSBUF---------------*/void Uart() interrupt 4 using 1{if(RI){DAT2SBUF; //数组下标位置的数据等于jRI0; //Receive_Flag1; //接收数据标志置一}}/*------------------主循环程序----------------*/void main( ) /*主程序开始*/{ /**加一**/AUXR0X80; //STC系列的1T 设置TMOD0X01;delay1(2000);delay1(2000);InitUart(); //初始化串口MD0MD10; //delay1(200);OUT10;delay1(2000);red_eeprom();OUT11;P_SW10x40; //RXD_2/P3.6, TXD_2/P3.7printf(0XFF,0XFF,0XFF); //向串口屏发启动信号printf(t1.txt\系统启动\ ); //printf(n0.val%d\xff\xff\xff,val1);printf(n1.val%d\xff\xff\xff,val2);printf(n2.val%d\xff\xff\xff,val3);printf(n3.val%d\xff\xff\xff,val4);printf(n4.val%d\xff\xff\xff,val5);printf(n5.val%d\xff\xff\xff,TIME); //实际开模数delay1(2000);P_SW10x00; //RXD/P3.0, TXD/P3.1delay1(2000); //Receive_Flag0; //接收数据标志置零while(1){if(Receive_Flag1) //接收标志为1{Receive_Flag0; //接收标志归零 重新接收if (a[0]0XC0a[1]0X01) //{val1a[3]*256a[2]; //开模数printf(n0.val%d\xff\xff\xff,val1); //返回数据核对}else if (a[0]0XC0a[1]0X02){val4a[3]*256a[2]; //喷雾时间printf(n1.val%d\xff\xff\xff,val2); //返回数据核对}else if (a[0]0XC0a[1]0X03) //{val3a[3]*256a[2]; //喷雾延时printf(n2.val%d\xff\xff\xff,val3); //返回数据核对}else if (a[0]0XC0a[1]0X04){val2a[3]*256a[2]; //报警延时关电机加热printf(n3.val%d\xff\xff\xff,val4); //返回数据核对}else if (a[0]0XC0a[1]0X05){val3a[3]*256a[2]; //备用参数printf(n4.val%d\xff\xff\xff,val5); //返回数据核对}Write_EepromTime();delay10ms(500);}//RstKey(); //开模完低电平信号for(;kcounter5;) //按键循环5次{if(!INTPUT1) //按键低电平{LowVoltKey(); //按键低电平 计数器加一状态标志加一}else if(~!INTPUT1) //按键高电平{HighVoltKey(); //按键计数器加一 状态标志归零}}if(kstatus3) /*按键状态标志大于等于3为有效值*/{TIME;printf(n5.val%d\xff\xff\xff,TIME); //实际开模数if(TIMEval1){OUT10; /****输出***/Delay_100ms(val2);OUT11; /****输出***/}}RstKey();for(;kcounter5;) //按键循环5次{if(~!INTPUT1) //按键高电平{kcounter; //高电平加1}else if(!INTPUT1) //按键低电平{kcounter0; //低电平开模完未复位,继续循环检测}}//RstKey(); //按键自动for(;kcounter5;) //按键循环5次{if(!WARNING) //按键低电平{LowVoltKey(); //按键低电平 计数器加一状态标志加一}else if(~!WARNING) //按键高电平{HighVoltKey(); //按键计数器加一 状态标志归零}}if(kstatus3) /*按键状态标志大于等于3为有效值*/{P_SW10x00; //RXD/P3.0, TXD/P3.1delay1(2000); //报警信号Send(v); //发送从机编号}}}