#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//定义按键的接口
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^6;
sbit K4 = P1^7;
//LED指示灯的引脚
sbit LED1 = P2^0;
sbit LED2 = P2^1;
sbit LED3 = P2^2;
sbit LED4 = P2^3;
//红外检测引脚
sbit HW1 = P2^4;
sbit HW2 = P2^5;
//开关门检测测引脚
sbit OPEN_C = P2^6;
sbit CLOSE_C = P2^7;
//步进电机引脚
sbit Smotor1 = P3^4;
sbit Smotor2 = P3^5;
sbit Smotor3 = P3^6;
sbit Smotor4 = P3^7;
uchar key_num; //定义按键值
bit MotorDirection = 0; //默认正向
uchar MotorCircleSet = 0; //设置的圈数
uchar MotorOperationMode = 0; //工作模式
uchar Motor_data = 0;
uint Close_time = 0; //关门延时
uchar DoorOperationMode = 0; //手自动模式
//驱动步进电机引脚
void Drive_motor(unsigned char t)
{
if (t & 0x01)
{
Smotor1 = 1;
}
else
{
Smotor1 = 0;
}
if (t & 0x02)
{
Smotor2 = 1;
}
else
{
Smotor2 = 0;
}
if (t & 0x04)
{
Smotor3 = 1;
}
else
{
Smotor3 = 0;
}
if (t & 0x08)
{
Smotor4 = 1;
}
else
{
Smotor4 = 0;
}
}
//步进电机转动
void SETP_MOTOR_Run()
{
//8拍编码
uchar code FFW[8] = { 0x08, 0x09, 0x01, 0x03, 0x02, 0x06, 0x04, 0x0c };
static uint i = 0, j = 0;
static uint T_circle = 0;
if (MotorOperationMode == 0) //停止转动
{
i = 0;
T_circle = 0;
}
else
{
if (++i > 20) //延时
{
i = 0;
if (MotorDirection == 0) //正向开门
{
Motor_data = ~FFW[j];
}
else//反向关门
{
Motor_data = ~FFW[7 - j];
}
if (++T_circle > 320) //步进电机不能一直转,长时间检测不到开关门信号,就要关闭电机
{
MotorOperationMode = 0;
}
Drive_motor(Motor_data); //把数据送到单片机引脚
if (++j > 7) //一个8步
{
j = 0;
}
}
}
}
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_ms(uint i)//1ms延时
{
uchar x, j;
for (j = 0; j < i; j++)
for (x = 0; x <= 148; x++);
}
//************************************
//定时器初始化
//初始化为1MS定时器
//************************************
void Time1_init()
{
TMOD |= 0x10; //使用模式1,16位定时器
TH1 = (65536 - 1000) / 256; //定时器装入初始值1ms
TL1 = (65536 - 1000) % 256;
EA = 1; //总中断
ET1 = 1; //定时器1初始化
TR1 = 1;
}
//****************************************************
//矩阵按键扫描
//按键按下则返回按键值不按就返回0xff
//*****************************************************
uchar Key_scan()
{
static uchar key_up = 1; //按键按松开标志
if (key_up && (K1 == 0 || K2 == 0 || K3 == 0 || K4 == 0))
{
Delay_ms(5); //去抖动
key_up = 0;
if (K1 == 0)return 1;
else if (K2 == 0)return 2;
else if (K3 == 0)return 3;
else if (K4 == 0)return 4;
}
else if (K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1)key_up = 1;
return 0; // 无按键按下
}
/*主程序:*/
void main()
{
uchar speed = 0;
uchar step = 0;
//系统初始化
Time1_init(); //定时器初始化
while (1)
{
key_num = Key_scan(); //获取按键值
switch (key_num)
{
case 1: //手动模式
DoorOperationMode = 1;
break;
case 2://自动模式
DoorOperationMode = 0;
break;
case 3: //打开门
if (DoorOperationMode == 1) //手动模式
{
MotorDirection = 0;
MotorOperationMode = 1;
}
break;
case 4://关闭门
if (DoorOperationMode == 1) //手动模式
{
MotorDirection = 1;
MotorOperationMode = 1;
}
break;
}
//更新门开关状态
LED4 = OPEN_C;
LED3 = CLOSE_C;
if (DoorOperationMode == 0) //自动模式
{
//打开自动模式指示灯
LED1 = 0;
LED2 = 1;
//判断门开关的步骤
switch (step)
{
case 0: //初次判断门是开的或者是关的
if (OPEN_C == 0) //检测到了开门
{
Delay_ms(10); //消抖
if (OPEN_C == 0) //检测到了开门
{
step = 2;
}
}
else
{
Close_time = 0;
if ((HW1) || (HW2)) //检测到了人体信号
{
Delay_ms(10); //消抖
if ((HW1) || (HW2)) //检测到了人体信号
{ //打开门
MotorDirection = 0;
MotorOperationMode = 1;
Close_time = 0;
step = 10;
}
}
else //没有检测到人体
{
}
}
break;
case 2://开门之后判断延时
if ((HW1) || (HW2)) //检测到了人体信号
{
Delay_ms(10); //消抖
if ((HW1) || (HW2)) //检测到了人体信号
{
Close_time = 0;
}
}
else //没有检测到人体
{
if (Close_time > 3000) //3000ms检测不到人体就关门
{ //关门
MotorDirection = 1;
MotorOperationMode = 1;
step = 3;
}
}
break;
case 3: //要关门
if (CLOSE_C == 0) //检测到了关门
{
Delay_ms(10); //消抖
if (CLOSE_C == 0) //检测到了关门
{
MotorOperationMode = 0; //关闭电机
step = 0;
}
}
else
{
if ((HW1) || (HW2)) //检测到了人体信号
{
Delay_ms(10); //消抖
if ((HW1) || (HW2)) //检测到了人体信号
{ //打开门
MotorDirection = 0;
MotorOperationMode = 1;
Close_time = 0;
step = 10;
}
}
}
break;
case 10://打开门
if (OPEN_C == 0) //检测到了开门
{
Delay_ms(10); //消抖
if (OPEN_C == 0) //检测到了开门
{
MotorOperationMode = 0;
step = 0; //重新去判断
}
}
break;
}
}
else //手动模式
{
//打开手动模式指示灯
LED1 = 1;
LED2 = 0;
if (MotorDirection == 0) //开门
{
if (OPEN_C == 0) //检测到开门
{
Delay_ms(10); //消抖
if (OPEN_C == 0) //检测到了关门
___か丶倾情
- 粉丝: 9
- 资源: 3
最新资源
- 【创新无忧】基于遗传算法GA优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于遗传算法GA优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于遗传算法GA优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于蚁狮优化算法ALO优化极限学习机KELM实现故障诊断附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于引力搜索优化算法GSA优化极限学习机KELM实现故障诊断附matlab代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈