1.实验要求:
在工业控制中,像冲压、注塑、轻纺、制瓶等生产过程,都是一些断续生产过程,按某种程序有规律地完成预定的动作,对这类断续生产过程的控制称顺序控制,例注塑机工艺过程大致按“合模—>注射—>延时—>开模—>产伸—>产退”顺序动作,用单片机最易实现。
实验中应注意:
1.实验中模拟外故障输入用外部中断1,初始化程序中需开中断。
2.未开工时(K1未按下),按下K2不能有报警输出。
2.实验内容:
1.用Proteus设计工业顺序控制电路;
2.在Keil C51中编写控制程序,编译通过后,与Proteus联合调试;
3.K1开关拨在上面,K2拨在上面;
4.用连续方式运行程序,此时应在等待开工状态;
5.K1拨至下面(显低电平),各道工序应正常运行;
6.K2拨至下面(低电平),应有声音报警(人为设置故障);
7.K2拨至上面(高电平),即排除故障,程序应从刚才报警的那道工序继续执行。
(1)Proteus原理图:
我们使用了AT89C51主控单片机,利用单片机的P1、P3.2、P3.4口来实现工业顺序的控制。具体电路图如下图:
(2)keil代码如下:
1)中断方式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40};
uchar i=0,j;
sbit SPK=P1^7;
sbit k1=P3^4;
sbit k2=P3^3;
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned int t);
/*------------------------------------------------
主函数
------------------------------------------------*/
void INT_1() interrupt 2
{
EX1=0;
DelayMs(20);
EX1=1;// SPK=1;//喇叭
}
void main()
{
P1=0;
// k1=0xff;
// k2=0xff;
EA=1;
EX1=1;
IT1=1;
while(1)
{
if(k1==0)
{
P1=table[j++];
DelayMs(1000);
if(j==7)
j=0;
}
}
}
void DelayUs2x(unsigned char t) {
while(--t);
}
void DelayMs(unsigned int t) {
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
- 定时器方式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x01,0x02,0x04,0x08,0x10, 0x20,0x40};
uint i=0,j=0,k=0;
sbit SPK=P1^7;
sbit k1=P3^4;
sbit k2=P3^3;
void delay(uint c)
{
uint a,b;
for(;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void INT_1() interrupt 2
{
EX1=0;
delay(20);
EX1=1;
TR0=1;
while(k1==0&&k2==0)
{
for(i=0;i<200;i++)
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(TF0==0);
SPK=!SPK;
TF0=0;
}
for(k=0;k<200;k++)
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
while(TF0==0);
SPK=!SPK;
TF0=0;
}
}
}
void main()
{
TMOD=0x01;
EA=1;
EX1=1;
IT1=1;
P1=0;
while(1)
{
if(k1==0)
{
delay(20);
if(k1==0)
{
P1=table[j++];
delay(200);
if(j==7)
j=0;
}
}
}
}
经过调试与运行,无错误无警告。
(3)keil与Protues联合调试
在主控单片机中导入hex文件,运行正常,运行结果如下图: