实验四-工业顺序控制实验

  • 格式:doc
  • 大小:124.50 KB
  • 文档页数:6

下载文档原格式

  / 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四-工业顺序控制实验

实验四工业顺序控制实验

一、实验目的

掌握工业顺序控制程序的简单编程,中断的使用。

二、实验仪器和设备

1.微机一台

2.Keil C51集成开发环境

3.proteus仿真软件

三、实验预备知识

在工业控制中,像冲压、注塑、轻纺、制瓶等生产过程,都是一些断续生产过程,按某种程序有规律地完成预定的动作,对这类断续生产过程的控制称顺序控制,例注塑机工艺过程大致按“合模—>注射—>延时—>开模—>产伸—>产退”顺序动作,用单片机最易实现。

四、实验内容

1. 用proteus画出仿真电路图。8031的P1.0-P1.6控制注塑机的七道工序,先模拟控制七只发光二级管的点亮,高电平有效,设定每道工序时间转换为延时,K1为开工启动开关,低电平启动。K2为外故障输入模拟开关,P3.3输入为0是不断警告,P1.7为报警声音输出,参考电路图如下图所示:

2.P1.7报警输出时要求采用双音报警,请自行准备耳机。

五、实验说明

1.实验中模拟外故障输入用外部中断1,初始化程序中需开中断。

2.未开工时(K1未按下),按下K2不能有报警输出。

六、实验程序框图

七、实验步骤

1.用proteus设计工业顺序控制电路;

2..在Keil C51中编写控制程序,编译通过后,与proteus联合调试;

3..K1开关拨在上面,K2拨在上面;

4..用连续方式运行程序,此时应在等待开工状态;

5..K1拨到下面(显低电平),各道程序应正常运行;

6..K2拨到下面(低电平),应有声音报警(人为设置故障);

7..K2拨到上面(高电平),排除故障,程序应从刚才报警的工序继续执行。

八、实验程序

1.实验电路:

2. 实验源程序:见附录1.2

九、实验总结

1.用中断方式编程时,外部中断触发方式选择了低电平触发,结果导致按键

按下后,中断不断触发,尽管出现了连续的报警声,但是还是会回到主程序,流水灯并未真正停止,而是间隔一段时间后,发生变化。解决方法是在中断程序中加入判断K2的条件,使其在中断期间不再返回主程序即可。

2.注意当程序中用到两个中断时必须设置中断优先级寄存器PCON,才能实

现中断嵌套。要真正理解中断优先级的含义。

3.给speaker两个不同的频率的信号即可产生双音报警信号。

十、实验建议

希望老师在每个实验结束后,能拿出几个典型程序进行讲解,讲解实验过程中出现的问题。

附录1:程序1

#include

void delay_ms(int);

int t=0,num=1,cnt,s;

sbit K1=P3^4;

sbit K2=P3^3;

bit sw=0,flag=0;

sbit speaker=P1^7;

char code tab[10]={0x00,0x01,0x02,0x04,0x08,0 x10,0x20,0x40,0x80,0xff};

void main(void)

{

P1=tab[0];

TMOD=0x01;

TH0=(65536-500)/256;

TL0=(65536-500)%256;

ET0=1;

TR0=1;

EA=1;

while(1)

{

while(K1==0)

{

if(num<=7&&K2==1)

{

P1=tab[num++];

delay_ms(500);

if(num==8) num=1; for(cnt=0;cnt<200&&K2==0;cnt++)

{

speaker=~speaker;

while(s<2); s=0;

}

for(cnt=0;cnt<200&&K2==0;cnt++)

{

speaker=~speaker;

while(s<3); s=0;

}

}

}

}

void timer0() interrupt 1

{

TH0=(65536-500)/256;

TL0=(65536-500)%256;

s++;

}

void delay_ms(t)

{

int i;

for(;t>0;t--)

for(i=0;i<124;i++);

}

}

附录2:程序2

#include

int t=0,num=1,cnt,s;

sbit K1=P3^4;

bit sw=0;

sbit speaker=P1^7;

char code tab[10]={0x00,0x01,0x02,0x04,0x08,0 x10,0x20,0x40,0x80,0xff};

void keyscan()

{

if(K1==0) sw=1;

if(K1==1)

{

sw=0;

P1=tab[0];

EX1=0; //K1接高,停止工作

}

}

void main(void)

{

TMOD=0x01; //定时器0方式1

TH0=(65536-100)/256;

TL0=(65536-100)%256;

PT0=1; //设置定时器1最高优先级TR0=1;

EA=1;

while(1)

{

keyscan();

if(sw)

{

ET0=1;

EX1=1;

IT1=0;

while(sw)

{

if(t>=5000)

{

P1=tab[num++];;

if(num>=8) num=1;

t=0;

}

keyscan();

}

}

}

void INTER1() interrupt 2

{

for(cnt=0;cnt<250;cnt++)

{

speaker=~speaker;

while(s<10); s=0;

}

for(cnt=0;cnt<125;cnt++)

{

speaker=~speaker;

while(s<20); s=0;

}

if(K1==1) EX1=0; }

void timer0() interrupt 1

{

TH0=(65536-100)/256;

TL0=(65536-100)%256;

t++;

s++;

}

}