实验四-工业顺序控制实验
- 格式:doc
- 大小:124.50 KB
- 文档页数:6
实验四-工业顺序控制实验
实验四工业顺序控制实验
一、实验目的
掌握工业顺序控制程序的简单编程,中断的使用。
二、实验仪器和设备
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++;
}
}