/***三个按键同为低电平开电机,外中断0关电机输出****/
/***2024 2 15 *L210 CODE409***********************/
#include <reg52.h> //
#include <intrins.H> //工位零点完成开定时器0
#define uchar unsigned char //
#define uint unsigned int //
bit Signauto; //
uchar vala; //
uchar val12;
uchar kcounter,kstatus; //按键计数标志 按键状态标志
uchar k_counter;
uchar k_status;
sbit EX_INT0=P3^2; //电机
sbit IntPut2=P6^7; //产品检测
sbit IntPut3=P6^6; //夹具检测
sbit IntPut4=P6^5; //过桥退检测
sbit OutPut1=P0^0; //电机
sbit OutPut2=P0^1; //报警
sbit OutPut3=P7^4; //
sbit OutPut4=P7^5; //
sbit OutPut5=P7^6; //
sbit OutPut6=P7^7; //
sbit OutPut7=P0^3;
sbit OutPut8=P0^4;
sbit OutA=P6^0; //
sbit OutB=P0^5; //
/*------------------延时子程序------------------------*/
void delay10ms(uint x)
{
uint i, j;
for (i=0;i<x;i++)
for (j=0;j<500;j++);
}
/*-----------延时100ms子程序12MHz --------*/
void Delay_100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
{
for(j=0;j<18000;j++);
}
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
_nop_(); //延时
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
_nop_(); //延时
}
/****************按键计数器状态寄存器归零*************/
void Rst_Key()
{
k_counter=0; //按键计数器归零
k_status=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void Low_VoltKey(void) //按键计数器状态标志加一
{
k_counter++;
k_status++;
_nop_(); //延时
}
/*****************按键高电平检测函数*****************/
void High_VoltKey(void) //按键计数器加一 状态标志归零
{
k_counter++; //按键计数器加一
k_status=0; //按键状态标志归零
_nop_(); //延时
}
/*************报警闪烁*************************/
void Motor_Warning()
{
for(;vala<10;) //按键循环10
{
vala++;
OutPut2=~OutPut2; //报警
delay10ms(50); //等待外部中断0完成
}
}
/*************循环闪烁*************************/
void Led_Run()
{
vala=0;
for(;vala<20;) //按键循环10
{
vala++;
OutPut3=~OutPut3; //
OutPut4=~OutPut4; //
OutPut5=~OutPut5; //
OutPut6=~OutPut6; //
Delay_100ms(50); // //等待外部中断0完成
}
OutPut3=1; //
OutPut4=1; //
OutPut5=1; //
OutPut6=1; //
}
/*************三个端口都为低电平电机旋转****/
/*************三个端口都为低电平电机旋转****/
void Read_Intput(uchar times,uchar val)
{
vala=0;
OutA=0; //进入指示
while(times)
{
times--;
RstKey();
for(;kcounter<5;) //按键循环10
{
if(!IntPut2&&!IntPut3&&!IntPut4)//过桥退 机座退 润滑退
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!IntPut2||~!IntPut3||~!IntPut4) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态计数器归零
}
}
if(kstatus>=4) /*按键状态标志大于等于8为有效值*/
{
OutPut1=0; //电机开
OutB=1;
Signauto=1; /*行程输入信号检测标志无输入为1,永久循环*/
do /*行程输入信号检测标志无输入为1,永久循环*/
{
vala++; //检测外部中断0超时报警退出循环
Delay_100ms(50); //
if(vala>=val) //
{
Motor_Warning();
Signauto=0; //超时退出循环
OutB=0; //外部中断0超时未输入报警
times=0; //
}
}
while(Signauto); //外部中断0检测到输入信号 退出循环
}
Delay_100ms(50); //
OutPut7=~OutPut7; //
OutPut8=~OutPut8; //
}
OutA=1; //退出指示
}
/****************************************/
void exint0() interrupt 0 //INT0中断入口
{
Rst_Key();
for(;k_counter<5;) //按键循环5次
{
if(!EX_INT0) //按键低电平
{
Low_VoltKey();
}
else if(~!EX_INT0) //按键高电平
{
High_VoltKey();
}
}
if(k_status>=4) /*按键状态标志大于等于3为有效值*/
{ /*循环检测 */
Signauto=0; //
OutPut1=1; //旋转停止
OutB=1;
}
}
/***************************************/
void main() //
{
P0M0=0XFF; //推挽输出
P0M1=0X00; //推挽输出
P1M0=0XFF; //推挽输出
P1M1=0X00; //推挽输出
P2M0=0X00; //准双向输入
P2M1=0X00; //准双向输入
P3M0=0X00; //准双向输入
P3M1=0X00; //准双向输入
P4M0=0XE1; //P4.0 4.5 4.6 4.7推挽输出
P4M1=0X00; //P4.1 4.2 4.3 4.4准双向输入
P5M0=(P5M0&~0x03)|0x3C; //P5.2 5.3 5.4 5.5推挽输出
P5M1&=~0x3F; //P5.0 5.1 准双向输入
P6M0=0X0F; //P6.0 6.1 6.2 6.3推挽输出
P6M1=0; //P6.4 6.5 6.6 6.7准双向输入
P7M0=0XF0; //P7.4 7.5 7.6 7.7推挽输出
P7M1=0X00; //P7.0 7.1 7.2 7.3准双向输入
IT0=1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0=1; //使能INT0中断
EA=1; //
val12=10;
while(1) //
{
Read_Intput(6,val12); //循环次数 检测超时
Delay_100ms(50); //
Led_Run();
} //
} //L210 CODE409