您的位置:首页 > 其它

电梯控制程序

2008-11-22 22:49 483 查看
/*
----BY Victor.S----
--原理图:步进电机控制显示.sch----四相混合式步进电机,五线引出;
-----------
P0口接数码管显示输出;
P2.0-P2.3四位数码管位选;

-----控制电路--L298N驱动-----
P1.0步进电机控制端A;
P1.1步进电机控制端B;
P1.2步进电机控制端C;
P1.3步进电机控制端D;
----------------------
---指示LED---低电平点亮---
P1.4 红色
P1.5 蓝色
P1.6 绿色
-----------
P3.0-P3.3 按键输入S1-S4,P2.7开关控制
----------
*/
#include <AT89X51.h>
#define M_ON P2_7 //开关控制
#define A P1_0
#define B P1_1
#define C P1_2
#define D P1_3
#define LED_RED P1_4 //指示灯
#define LED_BLUE P1_5
#define LED_GREEN P1_6
#define L4 P2_0 //数码管使能
#define L3 P2_1
#define L2 P2_2
#define L1 P2_3
#define relay P1_7 //动作继电器,控制刀片
#define uchar unsigned char
#define uint unsigned int
static uint count;
static uchar step_index;
static uint length_num;
static uint cutted_num;
const uchar spcount=20; //脉冲频率控制-;转速控制 1S/(50*20*400us)=2.5圈每S
uint l_num=0,c_num=0;
uchar dis_data[12]={ //布线后确定
0x00,0x00,0x00,0x00, //0,1,2,3
0x00,0x00,0x00,0x00, //4,5,6,7
0x00,0x00,0x00,0x00 //8,9,E,全灭
};
bit run_flag=0; //停机标置位,为1时开机
void run(void)
{if(run_flag==0)
{A=0;
B=0;
C=0;
D=0;
return;
}

switch(step_index)
{ case 0:
A=1;
B=0;
C=0;
D=0;
break;
case 1:
A=1;
B=1;
C=0;
D=0;
break;
case 2:
A=0;
B=1;
C=0;
D=0;
break;
case 3:
A=0;
B=1;
C=1;
D=0;
break;
case 4:
A=0;
B=0;
C=1;
D=0;
break;
case 5:
A=0;
B=0;
C=1;
D=1;
break;
case 6:
A=0;
B=0;
C=0;
D=1;
break;
case 7:
A=1;
B=0;
C=0;
D=1;
}
step_index++;
l_num++;
if(step_index>7)
step_index=0;
}
void inita(void)
{
P1=0xf0;
P0=0x00;
P2=0x00;
P3=0xff;
EA=1;
EX0=1;
ET0=1;
TMOD=0x02;
TH0=0xff;
TL0=0xce;
TR0=1;
}
void disp(uint m)
{ uchar i,d0,d1,d2;
P0=0x00;
P2=0xf0;
if(m<10)
{L1=1;
P0=dis_data[m];
for(i=100;i>0;i--);
return;
}
else if(m<100)
{d0=m%10;
d1=m/10;
L2=1;
P0=dis_data[d1];
for(i=100;i>0;i--);
L2=0;
L1=1;
P0=dis_data[d0];
for(i=100;i>0;i--);
return;
}
else if(m<1000)
{d0=m%10;
d2=m/100;
d1=(m-d2*100)/10;
L3=1;
P0=dis_data[d2];
for(i=100;i>0;i--);
L3=0;
L2=1;
P0=dis_data[d1];
for(i=100;i>0;i--);
L2=0;
L1=1;
P0=dis_data[d0];
for(i=100;i>0;i--);
return;
}

}

void set(uchar set_bit,uchar bit_num,uint set_num)
{if(set_bit==1){set_num=set_num+bit_num;}
if(set_bit==2){set_num=set_num+10*bit_num;}
if(set_bit==3){set_num=set_num+100*bit_num;}
if(set_bit==4){set_num=set_num+1000*bit_num;}

}
void set_disp(uchar undis_bit,uint dis_num) //设置位闪动显示
{ uchar i,d0=0,d1=0,d2=0,d3=0;
P0=0x00;
P2=0xf0;
if(dis_num<10)d0=dis_num;
else if(dis_num<100){d0=dis_num%10;d1=dis_num/10;}
else if(dis_num<1000){d0=dis_num%10;d1=(dis_num%100)/10;d2=dis_num/100;}
else if(dis_num<10000){d0=dis_num%10;d1=(dis_num%100)/10;d2=(dis_num%1000)/100;d3=dis_num/1000;}
else {d0=10;d1=10;d2=10;d3=10;}
if(undis_bit==1)d0=11;
else if(undis_bit==2)d1=11;
else if(undis_bit==3)d2=11;
else if(undis_bit==4)d3=11;
L1=1;
P0=dis_data[d0];
for(i=100;i>0;i--);
L1=0;
L2=1;
P0=dis_data[d1];
for(i=100;i>0;i--);
L2=0;
L3=1;
P0=dis_data[d2];
for(i=100;i>0;i--);
L3=0;
L4=1;
P0=dis_data[d3];
for(i=100;i>0;i--);
}
void int0(void) interrupt 0 using 1
{uchar key=0;
uint i;
uchar num;
bit set_flag=0;
LED_GREEN=0;
while(key<5)
{if(P3_3==0){key++;}
if(P3_0==0){num++;}
if(P3_1==0){num--;}
if(P3_4==0){set_flag=~set_flag;}
if(set_flag==0)
{LED_RED=0;
set(key,num,length_num);
set_disp(key,length_num);
for(i=5000;i>0;i--);
disp(length_num);
LED_RED=1;
}
else
{LED_BLUE=0;
set(key,num,cutted_num);
set_disp(key,cutted_num);
for(i=5000;i>0;i--);
disp(cutted_num);
LED_BLUE=1;
}
}

LED_GREEN=1;
}

void INT_T0(void) interrupt 1 using 2
{ count++;
if(count>=spcount){run();count=0;}
if(l_num==length_num){relay=1;c_num++;l_num=0;}
if(c_num==cutted_num){run_flag=0;c_num=0;}
}

void main(void)
{
inita();
while(1)
{uint i;
if(!M_ON)
{for(i=5000;i>0;i--);
if(!M_ON){run_flag=~run_flag;}
}
disp(c_num);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: