实验四 工业顺序控制实验 下载本文

实验四 工业顺序控制实验

一、实验目的

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

二、实验仪器和设备

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,0x10,0x20,0x40,0x80,0xff};

void main(void) {

P1=tab[0]; TMOD=0x01;

TH0=(65536-500)/256; TL0=(65536-500)%6; 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)%6; 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,0x10,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)%6;

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)%6; t++; s++; }

附录3:实验电路图