📄 main.c
字号:
/*可在Keil C51 6.0 以上版本中编译晶振采用11.0592Mc 工作在每个机器周期6 时钟的快速状态*/
#include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
#include "version.h"
#include "misc.h"
#include "ir.h"
#include "func.h"
unsigned char data Timer;
unsigned int tick=0;
unsigned char control_status;
enum {
CTRL_IDLE=0,
CTRL_A0,
CTRL_A1,
CTRL_A2,
CTRL_A3,
CTRL_A4,
CTRL_B0,
CTRL_B1,
CTRL_B2,
CTRL_B3,
CTRL_B4,
CTRL_B5
};
void Count0(void) interrupt 1 using 3
{ /*定时器T00 中断,最大定时37ms*/
if(Timer!=0)
{ /*检测定时器T00 的扩展高位*/
Timer--;
return;
}
tick++;
Timer=(int)18.432;
}
unsigned int get_tick()
{
return tick;
}
unsigned int timer_diff(unsigned int t1, unsigned int t2)
{
unsigned long diff;
if(t1>=t2) diff=t1-t2;
else diff=t1+65536-t2;
return (unsigned int)diff;
}
unsigned char control()
{
static unsigned int tick0;
switch(control_status)
{
case CTRL_IDLE:
//处于空闲状态,如果有人靠近, 进入控制阶段
if(SOMEBODY_COMMING==ir_read())
{
control_status = CTRL_A0;
}
break;
case CTRL_A0:
//启动15w电机,启动18v电压
start_15w_motor();
start_18v_vol();
tick0=get_tick();
control_status = CTRL_A1;
break;
case CTRL_A1:
//1秒后,启动36v电压
if(timer_diff(get_tick(), tick0)>100)
{
start_36v_vol();
tick0=get_tick();
control_status = CTRL_A2;
}
break;
case CTRL_A2:
//再过1秒后,关闭15w电机
if(timer_diff(get_tick(), tick0)>100)
{
stop_15w_motor();
tick0=get_tick();
control_status = CTRL_A3;
}
break;
case CTRL_A3:
/*开始使用,在此过程中,如果人离开,则关闭36v和18v电压
否则再过59秒,关闭36v电机 */
if(SOMEBODY_LEAVING==ir_read())
{
stop_36v_vol();
stop_18v_vol();
control_status = CTRL_B0;
}
else if(timer_diff(get_tick(), tick0)>5900)
{
stop_36v_vol();
control_status = CTRL_A4;
}
break;
case CTRL_A4:
/*继续使用,在此过程中,如果人离开,则关闭18v电压 */
if(SOMEBODY_LEAVING==ir_read())
{
stop_18v_vol();
control_status = CTRL_B0;
}
break;
case CTRL_B0:
/*人离开,启动电磁力, 启动15w电机, 启动7。5 A电机
*/
start_em_power();
start_15v_vol();
start_75A_motor();
tick0=get_tick();
control_status = CTRL_B1;
break;
case CTRL_B1:
//1秒后,关闭电磁力
if(timer_diff(get_tick(), tick0)>100)
{
stop_em_power();
tick0 = get_tick();
control_status = CTRL_B2;
}
break;
case CTRL_B2:
//再过1秒后,关闭15w电机
if(timer_diff(get_tick(), tick0)>100)
{
stop_15v_vol();
tick0 = get_tick();
control_status = CTRL_B3;
}
break;
case CTRL_B3:
//启动10w负荷,
if(SOMEBODY_COMMING==ir_read())
{
stop_75A_motor();
control_status = CTRL_A0;
}
else
{
start_10w_load();
control_status = CTRL_B4;
tick0 = get_tick();
}
break;
case CTRL_B4:
// 关闭7。5A电机
if(SOMEBODY_COMMING==ir_read())
{
stop_10w_load();
stop_75A_motor();
control_status = CTRL_A0;
}
else if(timer_diff(get_tick(), tick0)>2800)
{
stop_75A_motor();
control_status = CTRL_B5;
}
break;
case CTRL_B5:
//关闭10w负荷。
if(SOMEBODY_COMMING==ir_read())
{
stop_10w_load();
control_status = CTRL_A0;
}
else if(timer_diff(get_tick(), tick0)>57000)
{
stop_10w_load();
control_status = CTRL_IDLE;
}
break;
}
return control_status;
}
void main()
{
IEN0=0x14; /*只打开INT1 中断*/
WDRST=0x1E; /*看门狗清0*/
WDRST=0xE1;
WDCON=0x12; /*40-90ms 看门狗(>最大延时37ms)*/
TCON=0x40; /*定时器1 开始工作, INT1 低电平触发*/
TMOD=0x23; /*定时器0 扩展成两个8 位定时器T00 和T01 用于同步控制*/
if((WDCON&0x30)!=0x30)
{
ir_init();
init_port();
init_serial();
control_status=0;
}
while(1)
{ /*消息循环*/
WDRST=0x1E; /*看门狗清0*/
WDRST=0xE1;
control();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -