微型计算机控制技术课程设计-造纸原料蒸煮过程压力微机控制系统内容摘要:

oid set_init(void) //设定值初值子程序 {unchar *add_set //定义设定值指针 addr_set=amp。 Set_water。 //指向水设定值地址 *add_set=40。 //水设定初值为 40 addr_set++。 //指向碱液设定值地址 *add_set=60。 //碱液设定初值为 60 addr_set++。 //指向上限报警设定值地址 *add_set=90。 //上限报警设定初值为 90 addr_set++。 //指向下限报警设定值地址 *add_set=10。 //下限报警设定初值为 90 } unchar alarm(unchar height) //越限报警子程序 17 { if(heightSet_up_alarm) //如果液位高于上限报警值,则报警并显示 ,返回 1 { PORT_4B8255 =0x84。 //上限报警灯亮,电笛响 return 1。 } else if(heightSet_down_alarm) //如果液位低于下限报警值,则报警并显示,返回 1 { PORT_4B8255 =0x82。 //下限报警灯亮,电笛响 return 1。 } else //液位高度正常,则正常工作指示灯亮,返回 0 { PORT_4B8255 =0x88。 return 0。 } } main() { bit ADCheck(void)。 bit DACheck(void)。 bit ROMCheck(void)。 unchar multi_filter(void)。 void DAC0832(unchar x,unchar y)。 void key(void)。 float Dignal_Contoller(unchar Rk,unchar Ck)。 //函数声明 //初始化 8255 定时器等 18 TMOD=0x02。 //初始化定时器 0,自动重装入初值工作方式 2 TH0=0x38。 //初值为 56,单片机主频为 12MHz。 定时 需要 2500 个 200us TL0=0x38。 PT0=1。 //置定时器 0 高优先级 ET0=1。 //允许定时器 0 中断 IT0=1。 //IT0=1:置外部中断 0 为边沿触发方式 EX0=1。 //开放外部中断 0 IT1=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 自检程序 { 19 P1=1。 //如果有故障则转到手动操作 P2=1。 PORT_4B8255。 //系统故障显示灯亮且电笛响 EA=0。 //不允许中断 while(1)。 //死循环等待处理 } key()。 //调用键盘程序 display()。 //调用数码管显示程序 ADC0809IN_0=1。 //启动 A/D 转换 TR0=1。 //启动定时器 2. AD转换程序 include include define unchar unsigned char define ADC0809IN_0 XBYTE[0x1000] define ADC0809IN_1 XBYTE[0x1001] define ADC0809IN_2 XBYTE[0x1002] define CHANNELS 3 //3 个通道, IN0 接液位检测, INT1 接水 流量变送器信号, IN2 接碱液流量变送器信号 bit bdata flag。 //设置标志位 void ADC0809(unchar data *a,unchar data *b,unchar data *c) { unchar i。 unchar xdata *addr。 addr=amp。 ADC0809IN_0。 //指针指向 ADC0809 通道 0 地址 IT1=1。 //IT1=1:置外部中断 1 为边沿触发方式 EX1=1。 //开放外部中断 1 EA=1。 // EA=1,允许单片机响应中断 20 for(i=0。 iCHANNELS。 i++) {flag=0。 //设置标志 *addr=0。 //启动转换 while(!flag)。 if(i==0) *a=*addr。 //转换出来的值给通道 0 else if(i==1) *b=*addr。 //转换出来的值给通道 1 else *c=*addr。 //转换出来的值给通 道 2 addr++。 } } service_int1() interrupt 2 using 1 //INT1 中断服务程序,使用第一组寄存器 { flag=1。 //转换结束标志 } 3.标度变换程序 include include define unchar unsigned char define unint unsigned int unchar data Conversion(unchar x) //标度转换子程序 { return 100*x/255。 //Ax=100*Nx/255 } 4.滤波程序 21 include include define unchar unsigned char define unint unsigned int unchar multi_filter(unchar GET_COUNT, unchar data *BUFF) //采用复合数字滤波法 ,GET_COUNT 为采样值个数 { //*BUFF 为指向采样值存储地址的指针 unchar data *addr。 //定义一个地址 int i,j。 unchar data buffer。 unsigned int SUM=0。 //累加值 BUFF=0x67。 //指针指向 67H addr=BUFF。 for(j=0。 jGET_COUNT1。 j++) //采用冒泡法排序 ,来去除最大值和最小值 for(i=0。 iGET_COUNTj1。 i++) { if(*(addr+i)*(addr+i+1)) { buffer=*(addr+i)。 *(addr+i)=*(addr+i+1)。 *(addr+i+1)=buffer。 } } for(i=0。 iGET_COUNT2。 i++) //累加去除最大值和最小值后的值 SUM+=*(addr+i+1)。 return(SUM/(GET_COUNT2))。 //返回采用复合数字滤波法滤波后的值 } 22 5. RAM 自检程序 include include define unchar unsigned char define unint unsigned char define xRAM DBYTE[0x00] //检查内部 128B 的 RAM define R_count 0x7F //设计数初值 bit ROMCheck(void) { unchar data *x。 //设 RAM 地址指针 unchar bdata FLAG。 //设检查标识单元 unchar bdata CHECK。 //设检查字单元 unint i,j,k,r。 unchar bdata temp。 FLAG=0。 i=k=r=0。 //变量初始化 CHECK=0xAA。 //设检查字 AAH while(FLAG!=2) //检查标志 =02。 是,则结束 { for(i=R_count。 i0。 i) { *(x+j)=CHECK。 //检查字 写入内存单元 if((temp=*(x+j))!=0xAA) //写入内容 =检查字。 return 1。 //否,则返回 1 j++。 //修改地址 } FLAG++。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。