自动开关门系统
#include
#define uchar unsigned char
#define uint unsigned int
sbit CP1=P1^0; // 左电机脉冲 sbit DIR1=P1^1; // 左电机方向 0 为开门 1为关门 sbit CP2=P1^2; // 右电机脉冲 sbit DIR2=P1^3; // 右电机方向 0 为开门 1为关门 sbit ADS=P3^2; // 传感器输入的检测人的端子 bit int0_flag=0; //中断0标志位 uchar position; //位置变量,以步数计 共2000步 //=====================子函数申明=======================// bit contrl(bit diret,uint step); void del2ms(uint time1) ;
/******************************************
主程序
*******************************************/
void main()
{
uchar int_close;
IP=0x01; //INT0高优先级
IE=0X81; //INT0开中断,CUP开中断
TCON=0x04; //INT0边沿触发
position=0; //默认门关闭
while (1)
{
if (int0_flag==1) //检测到人
{
int0_flag=0; //标志位清0
contrl(0,2000); //门全打开
int0_flag=0; //标志位清0
wait:
while(ADS==0); //如果门前还有人则等待
int_close=contrl(1,2000); //门开始关闭
if(int_close==0)
{
int0_flag=0; //标志位清0
contrl(0,2000-position); //门全打开
goto wait;
}
}
}
}
void service_int0() interrupt 0 using 2 //外部中断0 用第二组寄存器
{
int0_flag=1;
}
/******************************************
步进电机控制 diret为方向 step为步数
*******************************************/
bit contrl(bit diret,uint step) {
uint k;
CP1=1; //脉冲置高电平
CP2=1; //脉冲置高电平
DIR1=diret; //运行方向输出
DIR2=diret; //运行方向输出
if(step>11) //所走步数大于11步时采用加速--匀速
--减速 走
{
for(k=5;k>0;k--) //加速
{
CP1=0;
CP2=0;
del2ms(2*k); //延时时间逐步减少 则加速
CP1=1;
CP2=1;
del2ms(2*k);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0; //返回0 表示又有人 关门失败
}
}
for(k=0;k<(step-5-5);k++) //匀速
{
CP1=0;
CP2=0;
del2ms(1);
CP1=1;
CP2=1;
del2ms(1);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
for(k=1;k<6;k++) //减速
{
CP1=0;
CP2=0;
del2ms(2*k); //延时时间逐步增加 则减速
CP1=1;
CP2=1;
del2ms(2*k);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
}
else //当所走步数小于等于11步时采用匀速
走
{
for(k=0;k