《太原理工造纸原料蒸煮过程.docx》由会员分享,可在线阅读,更多相关《太原理工造纸原料蒸煮过程.docx(29页珍藏版)》请在三一办公上搜索。
1、造纸原料蒸煮过程压力微机控制系统微型计算机控制技术课程设计学院:信息工程学院班级:自动化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 .按键处理程序流程图188 .数字控制器流程图19六、程序清单20
2、1 .主程序202 .AD转换程序253 .标度变换程序274 .滤波程序275 .RAM自检程序296 .数字控制器程序307 .显示及按键处理程序318 .DA转换程序40七、系统调试41八、设计总结42九、参考文献42一、工艺要求造纸原料蒸煮过程压力微机控制系统蒸煮过程是制浆造纸生产中的关键工序之一,对于整个造纸生产过程中纸浆得率和纸的质量有很大影响,它要求根据原料的特点、纸浆的质量和生产设备的实际情况制定出合理的蒸煮工艺,确定装球量、用碱量、蒸煮温度和压力。造纸厂蒸煮车间有五个蒸球,依靠调节其进气量以到达控制蒸球工作压力和温度,调节喷料阀控制装料量。用微机控制技术实现该过程的自动控制,
3、要求蒸球的实际工作压力准确跟踪给定压力曲线。P个P1:低压保昼值P2:高压保压值.Tl:相转时间,T2:升低压时间,T3:低压保PlJlII持时间,T4:升高压时间,T5:高压保持时间装料控制系统示意图二、系统的组成和工作原理本压力控制系统的原理框图如下列图所示它采用Atmel公司的AT89S51单片机作为控制核心,AT89S5I是低功耗的8位CMoS单片机,具有8K字节在线可编程FlaSh存储器,内部有带看门狗。通过其ISP接口线可以方便地在线调试程序。A/D转换器采用具有8通道输入的ADC0809oDBY-I31型压力变送器将0-1.28MPa的压力信号转换为O-IOmA的电流输出,通过5
4、00Q也阻转化为0-5V的电压信号供应A/D转换器采样。单片机定时预定值为5s,用户可根据实际在调试时进行修改依次对5个蒸球的压力进行采样。采样值经过内部程序数字滤波后与给定值进行比拟给定值通过程序计算按照用户给定的压力曲线变化,得到的偏差信号经PlD算法程序后输出8位的阀门控制数字量。该数字量经D/A转换器AD558转换成O-IOV的电压信号,0-1OV的电压信号再经隔离放大器ICISO1002与工业现场隔离,输出4-20mA的标准电流信号控制蒸汽调节阀的开度。当蒸球的压力大于给定值时,偏差信号E=R-C小于零,经PlD运算后输出量减小,蒸汽调节阀的开度随之减小,从而使蒸球内的压力降低,重新
5、回到平衡状态。通过对PlD参数的整定可以使蒸球的实际工作压力准确跟踪给定压力曲线。三、硬件电路1、压力变送及A/D转换电路电路如下图:压力变送器为DBY/31型,其量程可调范围为0lMPa至03Mpa本系统中调整为01.28MpaADCO809的每个输入通道前对地接有一500。的电阻,用于将压力变送器送来的010mA电流信号转换为05V的电压信号,ADC0809八个输入通道的地址为FEOOHFE07H0单片机执行写总线指令后启动A/D转换,通过查询EOC的状态判断转换是否结束。执行读总线指令后将转换后的数据读入单片机内部。被测压力与输出量关系:压力(MpaJ输出数字量DBY-131压力变送00
6、.6351.275000000001000000011111111器性能指标:输出电流010mADC振幅0.1mm(双向)灵敏限0.1%供电电源220V50HZ负载电阻01.5kC消耗功率6W来回变差不大于根本误差的绝对值结构形式现场安装式工作条件环境温度:-10C55C仪表重量约15Kg相对湿度85%仪表管结头螺纹M201.5M18l.5工作振动频率25HzADC0809技术指标供电电源单一+5V模拟量输入范围0-5V分辨率8位最大不可调误差Set_up_alarm)如果液位高于上限报警值,那么报警并显示,返回1(PORT_4B8255=0x84;上限报警灯亮,电笛响return1;)els
7、eif(heightSet_down_alarm)如果液位低于下限报警值,那么报警并显示,返回1(PoRT_4B8255=0x82;下限报警灯亮,电笛响return1;)else液位高度正常,那么正常工作指示灯亮,返回0PORT_4B8255=0x88;return0;main()bitADCheck(void);bitDACheck(void);bitROMCheck(void);uncharmulti_filter(void);voidDAC0832(uncharx,unchary);voidkey(void);floatDignal_ContolIer(uncharRk,uncharCk
8、);函数声明初始化8255定时器等TMOD=0x02;初始化定时器0,自动重装入初值工作方式2TH0=0x38;初值为56,单片机主频为12MHz。定时0.5s需要2500个200usTL0=0x38;PTO=I;置定时器O高优先级ETO=I;允许定时器O中断ITO=I;Fro=I:置外部中断0为边沿触发方式EXO=I;开放外部中断0=/m=i:置外部中断1为边沿触发方式EXl=I;开放外部中断1,且EA=1(允许单片机响应中断)EA=I;/EA=I,允许单片机响应中断PORT_0Ce)M8255=0x8000;初始化0口8255,其A口,B口C口均作为输出接数码管显示PORT_4COM825
9、5=0x90;/4口8255初始化,其A口作输入,其B口作输出(接键盘和指示灯SetJnit();对水、碱液、上限报警、下限报警各值初始化Water_sam=Water_Sample;Lye_sam=Lye_Sample;HIGH_sam=High_Sample ; if(ROMCheck) (Pl = I;P2=l;PORT_4B8255;EA=O;while(l);)set_init();设定默认值while(l) if(ADCcheckDACheck) (Pl=I;P2=l;PORT_4B8255;EA=O;while(l);分别指向各自采样值地址开机检测ROM是否正常工作如果有故障那么
10、转到手动操作系统故障显示灯亮且电笛响不允许中断死循环等待处理死循环调用A/D和D/A自检程序如果有故障那么转到手动操作系统故障显示灯亮且电笛响不允许中断死循环等待处理key();调用键盘程序display();调用数码管显示程序TRO=I;启动定时器ADCO809IN_0=l;启动A/D转换2.AD转换程序#include#include#defineuncharunsignedcharXBYTEOxlOOOXBYTEOxlOOlXBYTE0xl002#defineADC0809IN_0#defineADCO8O9IN_1#defineADC0809IN_2#defineCHANNELS33个
11、通道,INO接液位检测,INTl接水流量变送器信号,IN2接碱液流量变送器信号bitbdataflag;设置标志位voidADC0809(unchardata*a,unchardata*b,unchardata*c)unchari;uncharxdata*addr;addr=&ADC0809IN_0;指针指向ADC0809通道O地址IT1=1;IT1=1:置外部中断1为边沿触发方式EXl=I;开放外部中断1EA=I;EA=I,允许单片机响应中断for(i=0;iCHANNELSii+)flag=O;设置标志*addr=O;启动转换while(!flag);if(i=0)* a=*addr;转换
12、出来的值给通道0elseif(i=l)* b=*addr;转换出来的值给通道1else* c=*addr;转换出来的值给通道2addr+;)service_int1()interrupt2using1/INTl中断效劳程序,使用第一组存放器flag=l;转换结束标志)3 .标度变换程序#include#include#defineuncharunsignedchar#defineunintunsignedintunchardataConversion(uncharx)标度转换子程序(return100*x255;/Ax=100*Nx255)4 .滤波程序#include#include#def
13、ineuncharunsignedchar#defineunintunsignedintuncharmulti_filter(uncharGET_COUNT,unchardata*BUFF)/采用复合数字滤波法,GET_COUNT为采样值个数/*BUFF为指向采样值存储地址的指针unchardata*addr;/定义一个地址inti,j;unchardatabuffer;unsignedintSUM=O;累加值BUFF=0x67;/旨针才旨向67Haddr=BUFF;for(j=0;jGET_COUNT-1;j+)采用冒泡法排序,来去除最大值和最小值for(i=0;i*(addr+i+1)(b
14、uffer=*(addr+i);*(addr+i)=*(addr+i+1);*(addr+il)=buffer;)for(i=0;iGET_COUNT-2;i+)累加去除最大值和最小值后的值SUM+=*(addr+i+1);retum(SUM(GET.COUNT-2);返回采用复合数字滤波法滤波后的值5 .RAM自检程序#include#include#defineuncharunsignedchar#defineunintunsignedchar#definexRAMDBYTEOxOO检查内部128B的RAM#defineR_count0x7F设计数初值bitROMCheck(Void)(u
15、nchardata*x;设RAM地址指针uncharbdataFLAG;设检查标识单元uncharbdataCHECK;设检查字单元uninti,j,k,r;uncharbdatatemp;FLAG=O;i=k=r=O;变量初始化CHECK=OxAA;设检查字AAHwhile(FLAG!=2)检查标志二02?是,那么结束(for(i=R_count;i0;i)(*(xj)=CHECK;检查字写入内存单元if(temp=*(x+j)!=OxAA)写入内容=检查字?return1;否,那么返回1j+;修改地址)FLAG+;检查标志加1CHECK=0x55;修改检查字55H)j=0;设地址指针,从头
16、再检查returnO;6 .数字控制器程序staticfloatdataE_l;设置E(K-I)staticfloatdataE_2;设置E(K-2)staticfloatdataU;设置U(K-I)staticfloatdataU_2;设置U(K-2)floatDignaLContoller(floatRk,floatCk)/Rk为给定值,Ck为测量值(floatdataU_0;设置U(K)floatdataE_0;设置E(k)E_0=Rk-Ck;计算偏差E(k)U_0=4*E_l-3.92*E.21.92*U_1+0.92*U.2;最少拍无波纹控制算式E_2=E_1;E_l=E_0;/E(
17、k)赋值给E(K-I),E(kl)赋值给E(K-2)U_2=U_1;U_l=U_0;/U(k)赋值给U(K-I),U(k-1)赋值给U(K-2)return(U_0);)7 .显示与按键处理程序#include#includeXBYTE0X4000XBYTE0X4001XBYTE0X4002#definePORT_4A8255#definePORT_4B8255#definePORT_4C8255#define PORT_4COM8255XBYTE0X4003定义4口8255的地址端#define PORT_OA8255XBYTEOXOOOO#define PORT_OB8255XBYTE0X
18、0001#define PORT_OC8255XBYTE0X0002#define PORT_OCOM8255XBYTE0X0003 定义。口 8255 的地址端#defineuncharunsignedchar#defineunintunsignedini#define Set_waterDBYTE0X60定义水设定值地址#define SetJyeDBYTE0X61定义碱液设定值地址#define Set_up_alarmDBYTE0X62定义上限报警设定值地址#define Set_down_alarmDBYTEOX63定义下限报警设定值地址#define Real waterDBYTE
19、0x64定义水实际榆出值地址#define RealJyeDBYTEOx65定义碱液实际输出值设定值地#define HighDBYTE0X66定义液位高度值地址#defineuncharunsignedchar#defineunintunsignediniuncharK_Start=O,K_Stop=0,K_Water=O,K_Lye=0,K_Up_A1arm=0,K_Down_Alarm=0,KJNC=O,K.DEC=0;uncharcodetable=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F;共阴极LED显示数字09unsigne
20、dSelect;定义一个位选端unchardata*addr_pointer;定义一个指向DATA区空间的指针delaylms()/延迟Imsunchari;for(i=0;i173;i+);voiddisplay(void)unchari;Select=0x80;首先选择最高位addr_pointer=&Set_water;给指针赋值,指向DATA区地址60H处,即水设定值存储地址PORT_0CQM8255=0x8000;初始化0口8255,其A口,B口,C口均作为榆出PORT_4COM8255=Ox90;/4口8255初始化,其A口作输入,其B,C作输出for(i=0;i8;i+)(POR
21、T_0A8255=table(*(addJPOinter+i)10;高位显示PORTJ)B8255=SeIeCt;输出位选码至PB口delaylms();延时Imsi+;准备显示低位Select=Select1;PORT_0A8255=table(*(addJPOimer+i)%10;低位显示PORT_OB8255=Select;输出位选码到PB口delaylms();/延时Ims)Select=OxSO;for(i=0;i6;i+)PORT_0C8255=table(*(addr_pointer+i)/10;高位显示PORT_OB8255=Select;输出位选码到PB口delaylms()
22、;/延时Imsi+;准备显示低位Select=Select1;PoRT_0C8255=tabIe(*(addJPOinter+i)%10;低位显示PORT_OB8255=Select;输出位选码至UPB口delaylms();/延时Ims)voiddis2_modify(unchartemp,unchar*add)修改数码管子程序/temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址unchari,slct;高位停止显示输出位选码到PB 口循环来延迟一段足以让人延时Ims/选择下一位低位停止显示输出位选码至U PB 口slct=temp;PORT_OA8255=0x00;PO
23、RT_OB8255=temp;for(i=0;il;PORT_OA8255=0x00;PORT_OB8255=slct;循环来延迟一段足以让人看出数码for(i=0;i100;i+)管闪烁的效果delay lms();slct=temp;PORT_0A8255=table(*add)10;PORT_OB8255=slct;for(i=0;il;延时Ims高位显示输出位选码到PB 口循环来延迟一段足以让人延时Ims选择下一位PORT_OA8255=table(*add)%l;低位显示PORT_OB8255=slct;for(i=0;i100;i+) 管闪烁的效果delay lms();榆出位选码
24、到PB口循环来延迟一段足以让人看出数码延时ImsvoidINC_OR_DEC(unchartemp,unchar*add)加1或减1子程序/temp为欲修改显示某个数码管值的位选端,add为指向修改数码管的地址display();数码管扫描显示dis2_modify(temp,add);闪烁要修改的数码管display();/数码管扫描显示if(KJNC)如果加1键按下,显示加1KJNC=O;加1键每按一次那么加1,故在次将其清零(*add)+;/设定值加1if(K_DEC)如果减1键按下,显示减1(K_DEC=O;减1键每按一次那么加1,故在次将其清零(*add);设定值减1)dis2_mo
25、dify(temp,add);/N烁显示修改后的数码管display();数码管扫描显示)voidkey(void)(ITO=I;ITO=I:置外部中断0为边沿触发方式PXO=I;置外部中断0高优先级EXO=I;开放外部中断0EA=I;/EA=I,允许单片机响应中断PORT_4CoM8255=0x90;/4口8255初始化,其A口作输入,其B口作输出if(!K_Start)while(!K_Start)(PORT_OB8255=0x20;如果启动按钮没有按下,那么显示等待启动按钮按下灯,并死循环等待按下)PoRT_OB8255=PORT_OB8255&OxDF;启动按钮按下,那么等待启动信号灯
26、熄灭if(K_Stop)如果停止按钮按下,那么K_Start清零,等待其再次按下启动K_Start=O;while(!K_Start)如果启动按钮没有按下,那么显示停止信号灯,并且数码管显示停止时的各种值(PORTj)B8255=0x10;display();)K_Stop=0;启动按钮按下时,使K_Stop清零PoRT_0B8255=Pe)RT_0B8255&0xEF;启动按钮按下,那么停止信号灯熄灭)if(K_Water)/当水设定值键按一下,那么相应两个数码管闪烁以表示需要设定,当水设定值键再按一下,那么停止设定SeleCt=OX80;/水设定值的数码管显示位选端addr_pointer
27、=&Set_water;给指针赋值,指向DATA区地址60H处,即水设定值存储地址INC_OR_DEC(Select,addr_pointer);)if(K_Lye)当碱液设定值键按一下,那么相应两个数码管闪烁以表示需要设定,当碱液设定值键再按一下,那么停止设定Select=0x20;碱液设定值的数码管显示位选端addr_pointer=&Setye;给指针赋值,指向DATA区地址60H处,即碱液设定值存储地址INC_OR_DEC(Seleet,addjpointer);/调用加1或减1子程序)if(K_Up_AIarm)当上限报警设定值键按一下,那么相应两个数码管闪烁以表示需要设定当上限报警
28、设定值键再按一下,那么停止设定Select=0x08;/上限报警设定值的数码管显示位选端addr_pointer=&Set_lye;给指针赋值,指向DATA区地址62H处,即上限报警设定值存储地址INC_OR_DEC(SeIeCt,addjpointer);调用加1或减1子程序)if(K_Down_Alarm)当下限报警设定值键按一下,那么相应两个数码管闪烁以表示需要设定当下限报警设定值键再按一下,那么停止设定Select=0x02;下限报警设定值的数码管显示位选端addr_pointer=&Set_lye;给指针赋值,指向DATA区地址63H处,即下限报警设定值存储地址INC_OR_DEC(
29、SeIeCt,addjpointer);/调用加1或减1子程序)ServiceJntOOinterrupt0using1/INTl中断效劳程序,使用第一组存放器uninti;uncharPort_A;Port_A=PORT_4A8255;将4 口 8255A端口的值赋给Port_Afor(i=0;i20000;i+);/延迟去抖Port_A=-Port_A;将A端口的值取反来判断键是否还按下,也可判断是哪个键按下if(Port_A)如果如果确实有键按下(Switch(PorcA)判断是哪个键按下,且假设多于两个键同时按下,视为无效(caseOxO1:K-Start=1;break;如果是SAO=1,那么K-Start=1,表示启动按钮有效case0x02:K_Stop=1;break;如果是SA1=1,那么K_Stop=1,表示停止按钮有效case0x04:K_Water=-K_Water;break;如果是SA2=1,那么K_Water=l,表示水设定值按钮有效case0x08:K_Lye=-K_Lye;break;如果是SA3=1,那么KjLye=I,表示碱液设定值按钮有效