实验四 工业顺序控制实验
一、实验目的
掌握工业顺序控制程序的简单编程,中断的使用。
二、实验仪器和设备
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 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
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:实验电路图