📄 51
字号:
#include<reg51.h>
#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<step;k++) //匀速
{
CP1=0;
CP2=0;
del2ms(2);
CP1=1;
CP2=1;
del2ms(2);
if(diret==0) //开门 位置步数加
{
position++;
}
else //关门 位置步数减
{
position--;
if(int0_flag==1)
return 0;
}
}
}
return 1;
}
/*************************************
s延时 time约为2ms
**************************************/
void del2ms(uint time1)
{
uint deli,delj;
for(deli=0;deli<time1;deli++)
for(delj=0;delj<240;delj++); //约为2ms
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -