版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
造纸原料蒸煮过程压力微机控制系统——《微型计算机控制技术》课程设计学院:信息工程学院班级:自动化0501班学号:05001154姓名:尚伟指导教师:贾敏智目录工艺要求---------------------------------------------------------------------------------------3二、系统的组成和工作原理----------------------------------------------------------------------4三、硬件电路----------------------------------------------------------------------------------------51、压力变送及A/D转换电路--------------------------------------------------------------52、D/A转换及隔离输出电路--------------------------------------------------------------63、显示电路------------------------------------------------------------------------------------84.上下限报警电路---------------------------------------------------------------------------95.控制系统的总电路图-------------------------------------------------------------------10四、数字控制器的设计--------------------------------------------------------------------------11五、软件设计---------------------------------------------------------------------------------------121、内存地址分配-----------------------------------------------------------------------------122、主程序流程图---------------------------------------------------------------------------123、定时中断处理程序流程图----------------------------------------------------------144、AD转换自检程序流程图-----------------------------------------------------------155.DA转换自检程序流程图----------------------------------------------------------166.RAM自检程序流程图--------------------------------------------------------------167.按键处理程序流程图---------------------------------------------------------------18数字控制器流程图-----------------------------------------------------------------19六、程序清单---------------------------------------------------------------------------------------201.主程序-------------------------------------------------------------------------------------202.AD转换程序-------------------------------------------------------------------------------253.标度变换程序------------------------------------------------------------------------------274.滤波程序-----------------------------------------------------------------------------------275.RAM自检程序-----------------------------------------------------------------------------296.数字控制器程序---------------------------------------------------------------------------307.显示及按键处理程序--------------------------------------------------------------------318.DA转换程序-------------------------------------------------------------------------------40七、系统调试---------------------------------------------------------------------------------------41八、设计总结---------------------------------------------------------------------------------------42九、参考文献---------------------------------------------------------------------------------------42一、工艺要求造纸原料蒸煮过程压力微机控制系统蒸煮过程是制浆造纸生产中的关键工序之一,对于整个造纸生产过程中纸浆得率和纸的质量有很大影响,它要求根据原料的特点、纸浆的质量和生产设备的实际情况制定出合理的蒸煮工艺,确定装球量、用碱量、蒸煮温度和压力。造纸厂蒸煮车间有五个蒸球,依靠调节其进气量以到达控制蒸球工作压力和温度,调节喷料阀控制装料量。用微机控制技术实现该过程的自动控制,要求蒸球的实际工作压力准确跟踪给定压力曲线。P1:低压保压值,P2:高压保压值,T1:空转时间,T2:升低压时间,T3:低压保持时间,T4:升高压时间,T5:高压保持时间装料控制系统示意图二、系统的组成和工作原理本压力控制系统的原理框图如下列图所示它采用Atmel公司的AT89S51单片机作为控制核心,AT89S51是低功耗的8位CMOS单片机,具有8K字节在线可编程Flash存储器,内部有带看门狗。通过其ISP接口线可以方便地在线调试程序。A/D转换器采用具有8通道输入的ADC0809。DBY-131型压力变送器将0-1.28Mpa的压力信号转换为0-10mA的电流输出,通过500Ω电阻转化为0-5V的电压信号供应A/D转换器采样。单片机定时〔预定值为5s,用户可根据实际在调试时进行修改〕依次对5个蒸球的压力进行采样。采样值经过内部程序数字滤波后与给定值进行比拟〔给定值通过程序计算按照用户给定的压力曲线变化〕,得到的偏差信号经PID算法程序后输出8位的阀门控制数字量。该数字量经D/A转换器AD558转换成0-10V的电压信号,0-10V的电压信号再经隔离放大器ICISO1002与工业现场隔离,输出4-20mA的标准电流信号控制蒸汽调节阀的开度。当蒸球的压力大于给定值时,偏差信号E=R-C小于零,经PID运算后输出量减小,蒸汽调节阀的开度随之减小,从而使蒸球内的压力降低,重新回到平衡状态。通过对PID参数的整定可以使蒸球的实际工作压力准确跟踪给定压力曲线。三、硬件电路1、压力变送及A/D转换电路电路如下图:压力变送器为DBY-131型,其量程可调范围为0~1Mpa至0~3Mpa。本系统中调整为0~1.28Mpa。ADC0809的每个输入通道前对地接有一500Ω的电阻,用于将压力变送器送来的0~10mA电流信号转换为0~5V的电压信号,ADC0809八个输入通道的地址为FE00H~FE07H。单片机执行写总线指令后启动A/D转换,通过查询EOC的状态判断转换是否结束。执行读总线指令后将转换后的数据读入单片机内部。被测压力与输出量关系:压力〔Mpa〕输出数字量06351.27500000000 1000000011111111DBY-131压力变送器性能指标:输出电流0~10mADC振幅≤0.1mm(双向)灵敏限0.1%供电电源220V
50Hz负载电阻0~1.5kΩ消耗功率≤6W来回变差不大于根本误差的绝对值结构形式现场安装式工作条件环境温度:-10~C~55~C仪表重量约15Kg相对湿度≤85%仪表管结头螺纹M20×1.5/M18×1.5工作振动频率≤25HzADC0809技术指标供电电源单一+5V模拟量输入范围0-5V分辨率8位最大不可调误差<±1LSB功耗15mW转换速度取决于芯片的时钟频率2、D/A转换及隔离输出电路D/A转换器采用8位电压输出型D/A转换器DAC0832DAC0832数/模转换器的内部,具有两极输入数据缓冲器和一个R-2RT型电阻网络。即包括一个数据存放器、DAC存放器和D/A转换器三大局部。数据存放器和DAC存放器实现两次缓冲,故在输出的同时,还可以接收一个数据,提高了转换速度。当多芯片工作时,可用同步信号实现各模拟量的同时输出。该器件采用先进的CMOS工艺,功耗低,输出漏电流误差小,主要特性有:输出电流线性度可在满量程下调节;转换时间为1μs;数据输入可采用双缓冲、单缓冲或直通方式;增益温度补偿为0.02%FS/℃;每次输入数字为8为二进数;功耗为20mW;逻辑电平与TTL兼容;单一电源供电,可在5~15V内。DAC0832可工作在单,双缓冲器方式。单缓冲器方式即输入存放器的信号和DAC存放器的信号同时控制,使一个数据直接写入DAC存放器。这种方式适用于只有一路模拟量输出或几路模拟量不需要同步输出的系统;双缓冲器方式即输入存放器的信号和DAC存放器的信号分开控制,这种方式适用于几路模拟量需要同步输出的系统。为了提高转换精度,可增加D/A转换器的位数。隔离放大器采用ISO1002,ISO系列隔离放大器在同一芯片上提供了电源及信号的隔离,该混合集成芯片在同一芯片上集成了一个磁电耦合DC/DC变换电源及一个电流/电压输出的光电耦合隔离放大器。该芯片除为内部放大电路供电外,还可向外部输出一路隔离电压,供外部电路扩展使用。这一特点可方便地为外部电路基准电源及外部放大电路或其他用户应用电路供电。输入及输出侧宽爬电距离及内部隔离措施使该芯片可提供3000VAC绝缘电压。
ISO系列产品使用非常方便,几乎无需外部元件,即可实现信号电流源长线传输〔如图〕。3.显示电路LED显示器LED显示块是由发光二极管显示字段的显示器件,常使用七段LED。这种显示块有共阴极与共阳极两种接法。N位LED显示器有N根位选线和8×N根段选线。根据显示方式不同,位选线与段选线的连接方法不同。段选线控制字符选择,位选线控制显示器的亮暗。LED显示方式有静态显示方式〔因其占用I/O资源较多,故在位数较多时不采用〕和动态显示方式,如八位LED动态显示电路只需要两个8位I/O口。其中一个控制段选码,另一个控制位选码。由于所有位的段选码皆由一个I/O控制,因此,在每个瞬间,八位LED只可能显示相同的字符,必须采用扫描显示方式。即在每一瞬间只使某一位显示相应字符。在此瞬间,段选控制I/O口输出相应字符段选码,位选控制I/O口在该显示位送入选通电平以保证该位显示相应字符。如此轮流,使每位显示该位应显示字符,并保持延时一段时间,以造成视觉暂留效果。段选、位选码每送一次后延时1~5ms。本控制系统的采用8255A进行I/O扩展,而后接LED数码管电路加以显示,各数码管含义及电路如下图:4.上下限报警电路本控制系统的采用8255A进行I/O扩展,报警输入信号由PA口输入,由PB口输出以提示报警及正常工作状态,电路如下图:5.控制系统的总电路图四、数字控制器的设计本设计采用最小拍随动系统数字控制器因为所以〔T=0.5s〕所以〔式1-1〕由式1-1知,该数字控制器为最少拍无波纹随动系统控制。假设输入为单位阶跃,取,所以又取采样周期T=0.5s,得〔式1-2〕从而有由差分方程得控制器输出为:〔式1-3〕最少拍随动系统的误差为:其中分为:1)碱液设定值与实际输出碱液之差2)水设定值与实际输出水之差因为=1.5所以为第k次采样时实际输出碱液或实际输出水五:软件设计内存地址分配主程序流程图改变设定值吗?〔读键盘〕改变设定值吗?〔读键盘〕设定值→工作单元启动A/D和定时器,并且开中断等待定时中断NY主程序开始调RAM自检子程序RAM正常吗?N调A/D自检子程序A/D正常吗?YN调D/A自检子程序D/A正常吗?YN启动按钮按下吗?Y等待并显示相应指示灯停止按钮按下吗?N转至手动控制,且系统故障显示灯亮和电笛响Y定时中断处理程序流程图YYNYN关定时器,并读A/D转换结果定时器中断处理程序开始计数2500,定时0.5s定时0.5s时间到采样有6个值吗?调滤波子程序调越限报警子程序,越限吗?计算偏差E分别对水和碱液调用最少拍随动系统数字控制器子程序分别输出水和碱液控制量〔由D/A和CD4051完成〕调标度变换子程序和显示子程序输出显示输出报警返回中断AD转换自检程序流程图入口入口A\D转换自检程序流程图VREF+(标准)→A〔A〕与现场值比拟VREF–(标准)→A〔A〕与采样值比拟|结果|≤δ?|结果|≤δ?0V→A〔A〕–00|结果|≤δ?YYYNNN置A/D转换故障数据显示返回DA转换自检程序流程图NNYD/A自检程序入口取标准码→AA输出至D/A转换器由A/D读入结果读入值–标准码<δ指示D/A正常指示D/A异常返回RAM自检程序流程图真真计数器=0?检查标志加1检查标志=02?修改检查字〔55H〕设计数初值,设地址指针返回0真假设检查标志单元,设检查字AAH设计数初值,设地址指针检查字入内存单元写入字与检查字相等?修改地址修改计数器返回1假假入口RAM自检程序7.按键处理程序流程图假设碱液设定值按钮按下假设碱液设定值按钮按下假设上限设定值按钮按下假设下限设定值按钮按下闪烁显示设定值,按加1减1键那么值加1减1结束假K-STOP清零,停止信号灯熄灭假设水设定值按钮按下开始初始化启动按钮按下?真等待启动信号灯熄灭停止按钮按下?等待启动按钮信号灯点亮假K-START清零停止信号灯点亮,数码管显示停止时的值假按键处理程序流程图数字控制器流程图入口入口E(k)=R(k)-C(k)U(k)=4E(k-1)-3.92E(k-2)+1.92U(k-1)+0.92U(k-2)E(k-2)←E(k-1)E(k-1)←E(k)U(k-2)←U(k-1)U(k-1)←U(k)返回U(k)数字控制器流程图六.程序清单主程序#include<reg51.h>#include<absacc.h>#defineuncharunsignedchar#defineunintunsignedint#definePORT_4A8255XBYTE[0X4000]#definePORT_4B8255XBYTE[0X4001]#definePORT_4C8255XBYTE[0X4002]#definePORT_4COM8255XBYTE[0X4003]//定义4口8255的地址端#definePORT_0A8255XBYTE[0X0000]#definePORT_0B8255XBYTE[0X0001]#definePORT_0C8255XBYTE[0X0002]#definePORT_0COM8255XBYTE[0X0003]//定义0口8255的地址端#defineADC0809IN_0XBYTE[0x1000]#defineADC0809IN_1XBYTE[0x1001]#defineADC0809IN_2XBYTE[0x1002]#defineCHANNELS3//3个通道,IN0接液位检测,INT1接水流量变送器信号,IN2接碱液流量变送器信号#defineDAC0832BUFFXBYTE[0X2000]//DAC转换地址#defineCD4051IN_1XBYTE[0X3001]//输出通道1#defineCD4051IN_2XBYTE[0X3002]//输出通道2#defineP1XBYTE[0x5000]//碱液控制手动操作地址#defineP2XBYTE[0x6000]//水控制手动操作地址#defineSet_waterDBYTE[0X60]//定义水设定值地址#defineSet_lyeDBYTE[0X61]//定义碱液设定值地址#defineSet_up_alarmDBYTE[0X62]//定义上限报警设定值地址#defineSet_down_alarmDBYTE[0X63]//定义下限报警设定值地址#defineReal_waterDBYTE[0x64]//定义水实际输出值地址#defineReal_lyeDBYTE[0x65]//定义碱液实际输出值设定值地址#defineHighDBYTE[0X66]//定义液位高度值地址#defineWater_SampleDBYTE[0x67]//定义水采样值起始地址,采样6个值,67H~6CH为存放采样值地址,#defineLye_SampleDBYTE[0x6D]//定义碱液采样值起始地址,采样6个值,6DH~72H为存放采样值地址#defineHigh_SampleDBYTE[0x73]//定义液位采样值起始地址,采样6个值,73H~78H为存放采样值地址uncharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极LED显示数字0~9unintT_count=0;//定义一个定时器定时0.5s计数单元uncharsam_count=0; //定义一个采样数的单元unchardata*Water_sam,*Lye_sam,*HIGH_sam;//定义分别指向水、碱液、液位采样值的指针floatWater_control,Lye_control;//定义水和碱液控制器输出单元bitADCheck(void);bitDACheck(void); //定义A/D和D/A自检程序voidset_init(void)//设定值初值子程序{unchar*add_set//定义设定值指针addr_set=&Set_water;//指向水设定值地址*add_set=40; //水设定初值为40addr_set++ ; //指向碱液设定值地址*add_set=60; //碱液设定初值为60addr_set++; //指向上限报警设定值地址*add_set=90; //上限报警设定初值为90addr_set++; //指向下限报警设定值地址*add_set=10; //下限报警设定初值为90}uncharalarm(uncharheight)//越限报警子程序{ if(height>Set_up_alarm) //如果液位高于上限报警值,那么报警并显示,返回1 { PORT_4B8255=0x84;//上限报警灯亮,电笛响 return1; }elseif(height>Set_down_alarm) //如果液位低于下限报警值,那么报警并显示,返回1 { PORT_4B8255=0x82;//下限报警灯亮,电笛响 return1; } else //液位高度正常,那么正常工作指示灯亮,返回0{ PORT_4B8255=0x88; return0; }}main(){bitADCheck(void);bitDACheck(void);bitROMCheck(void);unchar multi_filter(void);voidDAC0832(uncharx,unchary);voidkey(void); floatDignal_Contoller(uncharRk,uncharCk); //函数声明//初始化8255定时器等TMOD=0x02; //初始化定时器0,自动重装入初值工作方式2TH0=0x38;//初值为56,单片机主频为12MHz。定时0.5s需要2500个200usTL0=0x38;PT0=1;//置定时器0高优先级ET0=1;//允许定时器0中断IT0=1;//IT0=1:置外部中断0为边沿触发方式EX0=1;//开放外部中断0IT1=1//IT1=1:置外部中断1为边沿触发方式EX1=1;//开放外部中断1,且EA=1(允许单片机响应中断)EA=1;//EA=1,允许单片机响应中断PORT_0COM8255=0x8000;//初始化0口8255,其A口,B口C口均作为输出〔接数码管显示〕PORT_4COM8255=0x90;//4口8255初始化,其A口作输入,其B口作输出(接键盘和指示灯〕set_init();//对水、碱液、上限报警、下限报警各值初始化Water_sam=Water_Sample;Lye_sam=Lye_Sample;HIGH_sam=High_Sample; //分别指向各自采样值地址if(ROMCheck)//开机检测ROM是否正常工作{P1=1; //如果有故障那么转到手动操作 P2=1; PORT_4B8255; //系统故障显示灯亮且电笛响 EA=0; //不允许中断 while(1); //死循环等待处理}set_init();//设定默认值while(1) //死循环{if(ADCcheck|DACheck) //调用A/D和D/A自检程序{P1=1; //如果有故障那么转到手动操作 P2=1; PORT_4B8255; //系统故障显示灯亮且电笛响 EA=0; //不允许中断 while(1); //死循环等待处理}key();//调用键盘程序display();//调用数码管显示程序ADC0809IN_0=1;//启动A/D转换TR0=1;//启动定时器2.AD转换程序#include<absacc.h>#include<reg51.h>#defineuncharunsignedchar#defineADC0809IN_0XBYTE[0x1000]#defineADC0809IN_1XBYTE[0x1001]#defineADC0809IN_2XBYTE[0x1002]#defineCHANNELS3//3个通道,IN0接液位检测,INT1接水流量变送器信号,IN2接碱液流量变送器信号bitbdataflag;//设置标志位voidADC0809(unchardata*a,unchardata*b,unchardata*c){unchari;uncharxdata*addr;addr=&ADC0809IN_0;//指针指向ADC0809通道0地址IT1=1;//IT1=1:置外部中断1为边沿触发方式EX1=1;//开放外部中断1EA=1;//EA=1,允许单片机响应中断for(i=0;i<CHANNELS;i++){flag=0;//设置标志*addr=0;//启动转换while(!flag);if(i==0)*a=*addr;//转换出来的值给通道0elseif(i==1)*b=*addr;//转换出来的值给通道1else*c=*addr;//转换出来的值给通道2addr++;}}service_int1()interrupt2using1//INT1中断效劳程序,使用第一组存放器{flag=1;//转换结束标志}3.标度变换程序#include<reg51.h>#include<absacc.h>#defineuncharunsignedchar#defineunintunsignedintunchardataConversion(uncharx) //标度转换子程序{return100*x/255; //Ax=100*Nx/255}4.滤波程序#include<reg51.h>#include<absacc.h>#defineuncharunsignedchar#defineunintunsignedintunchar multi_filter(uncharGET_COUNT,unchardata*BUFF) //采用复合数字滤波法,GET_COUNT为采样值个数{//*BUFF为指向采样值存储地址的指针unchardata*addr; //定义一个地址inti,j;unchardatabuffer;unsignedintSUM=0;//累加值BUFF=0x67; //指针指向67Haddr=BUFF;for(j=0;j<GET_COUNT-1;j++) //采用冒泡法排序,来去除最大值和最小值for(i=0;i<GET_COUNT-j-1;i++){if(*(addr+i)>*(addr+i+1)){buffer=*(addr+i); *(addr+i)=*(addr+i+1); *(addr+i+1)=buffer; }}for(i=0;i<GET_COUNT-2;i++) //累加去除最大值和最小值后的值 SUM+=*(addr+i+1); return(SUM/(GET_COUNT-2)); //返回采用复合数字滤波法滤波后的值 }5.RAM自检程序#include<reg51.h>#include<absacc.h>#defineuncharunsignedchar#defineunintunsignedchar#definexRAMDBYTE[0x00] //检查内部128B的RAM#defineR_count0x7F //设计数初值bitROMCheck(void){unchardata*x;//设RAM地址指针uncharbdataFLAG; //设检查标识单元uncharbdataCHECK;//设检查字单元uninti,j,k,r;uncharbdatatemp;FLAG=0;i=k=r=0;//变量初始化CHECK=0xAA; //设检查字AAHwhile(FLAG!=2) //检查标志=02?是,那么结束{for(i=R_count;i>0;i--){*(x+j)=CHECK;//检查字写入内存单元 if((temp=*(x+j))!=0xAA) //写入内容=检查字? return1; //否,那么返回1j++; //修改地址 } FLAG++; //检查标志加1 CHECK=0x55; //修改检查字〔55H) j=0;//设地址指针,从头再检查}return0;}数字控制器程序staticfloatdataE_1;//设置E(K-1)staticfloatdataE_2;//设置E(K-2)staticfloatdataU_1;//设置U(K-1)staticfloatdataU_2;//设置U(K-2)floatDignal_Contoller(floatRk,floatCk) //Rk为给定值,Ck为测量值{floatdataU_0;//设置U(K)floatdataE_0; //设置E(k)E_0=Rk-Ck; //计算偏差E(k)U_0=4*E_1-3.92*E_2+1.92*U_1+0.92*U_2;//最少拍无波纹控制算式E_2=E_1;E_1=E_0;//E(k)赋值给E(K-1),E(k-1)赋值给E(K-2)U_2=U_1;U_1=U_0; //U(k)赋值给U(K-1),U(k-1)赋值给U(K-2)return( U_0);}显示与按键处理程序#include<reg51.h>#include<absacc.h>#definePORT_4A8255XBYTE[0X4000]#definePORT_4B8255XBYTE[0X4001]#definePORT_4C8255XBYTE[0X4002]#definePORT_4COM8255XBYTE[0X4003]//定义4口8255的地址端#definePORT_0A8255XBYTE[0X0000]#definePORT_0B8255XBYTE[0X0001]#definePORT_0C8255XBYTE[0X0002]#definePORT_0COM8255XBYTE[0X0003]//定义0口8255的地址端#defineuncharunsignedchar#defineunintunsignedint#defineSet_waterDBYTE[0X60]//定义水设定值地址#defineSet_lyeDBYTE[0X61]//定义碱液设定值地址#defineSet_up_alarmDBYTE[0X62]//定义上限报警设定值地址#defineSet_down_alarmDBYTE[0X63]//定义下限报警设定值地址#defineReal_waterDBYTE[0x64]//定义水实际输出值地址#defineReal_lyeDBYTE[0x65]//定义碱液实际输出值设定值地址#defineHighDBYTE[0X66]//定义液位高度值地址#defineuncharunsignedchar#defineunintunsignedintuncharK_Start=0,K_Stop=0,K_Water=0,K_Lye=0,K_Up_Alarm=0,K_Down_Alarm=0,K_INC=0,K_DEC=0;uncharcodetable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极LED显示数字0~9unsignedSelect;//定义一个位选端unchardata*addr_pointer;//定义一个指向DATA区空间的指针delay1ms()//延迟1ms{unchari;for(i=0;i<173;i++);}voiddisplay(void){unchari;Select=0x80; //首先选择最高位addr_pointer=&Set_water;//给指针赋值,指向DATA区地址60H处,即水设定值存储地址PORT_0COM8255=0x8000;//初始化0口8255,其A口,B口,C口均作为输出PORT_4COM8255=0x90;//4口8255初始化,其A口作输入,其B口,C口作输出for(i=0;i<8;i++){PORT_0A8255=table[(*(addr_pointer+i))/10];//高位显示PORT_0B8255=Select;//输出位选码到PB口delay1ms();//延时1msi++;//准备显示低位Select=Select>>1;PORT_0A8255=table[(*(addr_pointer+i))%10];//低位显示PORT_0B8255=Select;//输出位选码到PB口delay1ms();//延时1ms}Select=0x80;for(i=0;i<6;i++){PORT_0C8255=table[(*(addr_pointer+i))/10];//高位显示PORT_0B8255=Select;//输出位选码到PB口delay1ms();//延时1msi++;//准备显示低位Select=Select>>1;PORT_0C8255=table[(*(addr_pointer+i))%10];//低位显示PORT_0B8255=Select;//输出位选码到PB口delay1ms();//延时1ms}}voiddis2_modify(unchartemp,unchar*add)//修改数码管子程序//temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址{ unchari,slct;slct=temp; PORT_0A8255=0x00; //高位停止显示PORT_0B8255=temp;//输出位选码到PB口 for(i=0;i<100;i++) //循环来延迟一段足以让人看出数码管闪烁的效果delay1ms();//延时1msslct=slct>>1;//选择下一位PORT_0A8255=0x00;//低位停止显示PORT_0B8255=slct;//输出位选码到PB口 for(i=0;i<100;i++) //循环来延迟一段足以让人看出数码管闪烁的效果delay1ms();//延时1msslct=temp;PORT_0A8255=table[(*add)/10]; //高位显示PORT_0B8255=slct;//输出位选码到PB口 for(i=0;i<100;i++) //循环来延迟一段足以让人看出数码管闪烁的效果delay1ms();//延时1msslct=slct>>1;//选择下一位PORT_0A8255=table[(*add)%10];//低位显示PORT_0B8255=slct;//输出位选码到PB口 for(i=0;i<100;i++) //循环来延迟一段足以让人看出数码管闪烁的效果delay1ms();//延时1ms}voidINC_OR_DEC(unchartemp,unchar*add)//加1或减1子程序//temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址{ display();//数码管扫描显示dis2_modify(temp,add);//闪烁要修改的数码管 display();//数码管扫描显示if(K_INC)//如果加1键按下,显示加1{K_INC=0;//加1键每按一次那么加1,故在次将其清零 (*add)++;//设定值加1 } if(K_DEC)//如果减1键按下,显示减1 { K_DEC=0; //减1键每按一次那么加1,故在次将其清零 (*add)--;//设定值减1 } dis2_modify(temp,add);//闪烁显示修改后的数码管 display(); //数码管扫描显示 }voidkey(void){IT0=1;//IT0=1:置外部中断0为边沿触发方式PX0=1;//置外部中断0高优先级EX0=1;//开放外部中断0EA=1;//EA=1,允许单片机响应中断PORT_4COM8255=0x90;//4口8255初始化,其A口作输入,其B口作输出if(!K_Start){while(!K_Start){PORT_0B8255=0x20;//如果启动按钮没有按下,那么显示等待启动按钮按下灯,并死循环等待按下}PORT_0B8255=PORT_0B8255&&0xDF;//启动按钮按下,那么等待启动信号灯熄灭}if(K_Stop) //如果停止按钮按下,那么K_Start清零,等待其再次按下启动{K_Start=0;while(!K_Start)//如果启动按钮没有按下,那么显示停止信号灯,并且数码管显示停止时的各种值 { PORT_0B8255=0x10; display(); } K_Stop=0; //启动按钮按下时,使K_Stop清零PORT_0B8255=PORT_0B8255&&0xEF;//启动按钮按下,那么停止信号灯熄灭 }if(K_Water) //当水设定值键按一下,那么相应两个数码管闪烁以表示需要设定,当水设定值键再按一下,那么停止设定{Select=0x80;//水设定值的数码管显示位选端 addr_pointer=&Set_water;//给指针赋值,指向DATA区地址60H处,即水设定值存储地址 INC_OR_DEC(Select,addr_pointer); }if(K_Lye) //当碱液设定值键按一下,那么相应两个数码管闪烁以表示需要设定,当碱液设定值键再按一下,那么停止设定{Select=0x20;//碱液设定值的数码管显示位选端 addr_pointer=&Set_lye;//给指针赋值,指向DATA区地址60H处,即碱液设定值存储地址 INC_OR_DEC(Select,addr_pointer);//调用加1或减1子程序 }if(K_Up_Alarm) //当上限报警设定值键按一下,那么相应两个数码管闪烁以表示需要设定//当上限报警设定值键再按一下,那么停止设定{Select=0x08;//上限报警设定值的数码管显示位选端addr_pointer=&Set_lye;//给指针赋值,指向DATA区地址62H处,即上限报警设定值存储地址INC_OR_DEC(Select,addr_pointer);//调用加1或减1子程序}if(K_Down_Alarm) //当下限报警设定值键按一下,那么相应两个数码管闪烁以表示需要设定//当下限报警设定值键再按一下,那么停止设定{Select=0x02;//下限报警设定值的数码管显示位选端addr_pointer=&Set_lye;//给指针赋值,指向DATA区地址63H处,即下限报警设定值存储地址INC_OR_DEC(Select,addr_pointer);//调用加1或减1子程序}}service_int0()interrupt0using1//INT1中断效劳程序,使用第一组存放器{uninti;uncharPort_A;Port_A=PORT_4A8255;//将4口8255A端口的值赋给Port_Afor(i=0;i<20000;i++);//延迟去抖Port_A=~Port_A;//将A端口的值取反来判断键是否还按下,也可判断是哪个键按下if(Port_A)//如果如果确实有键按下{switch(Port_A)//判断是哪个键按下,且假设多于两个键同时按下,视为无效{case0x01:K_Start=1;break;//如果是SA0=1,那么K_Start=1,表示启动按钮有效case0x02:K_Stop=1;break;//如果是SA1=1,那么K_Stop=1,表示停止按钮有效case0x04:K_Water=~K_Water;break;//如果是SA2=1,那么K_Water=1,表示水设定值按钮有效case0x08:K_Lye=~K_Lye;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高层管理聘用协议
- 企业合作战略协议范本汇编
- 2024年同父异母离婚协议书模板范本
- 土方运输协议
- 2024年精矿加工合同范本
- 宿舍管理员劳动合同书
- 食品营养课程设计思路
- 某工程基坑支护课程设计
- 高中生考试焦虑课程设计
- 抢答器课程设计电路
- 《地球上的海洋》课件
- 《体育心理学》课件
- 电力变压器理论
- 2024年中国华能集团公司招聘笔试参考题库含答案解析
- 2024年浙江省国贸集团招聘笔试参考题库含答案解析
- 2024年西南铝业集团招聘笔试参考题库含答案解析
- 《翻译工作坊》教案
- 山东省潍坊市2023-2024学年高二上学期期中考试数学试题(解析版)
- 关怀与照顾-医务社会工作在中国的探索与实践
- 小学教育中的全人教育理念探讨
- 《文化安全》课件
评论
0/150
提交评论