⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 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 + -