/***排列控制板外部中断0计数 输出测试***/
/***L449 CODE 2508 2021 2 28 ***/
/***2021 1 12 触摸屏按键控制动作 *****/
/***触摸屏定时器 va0.val值显示动作状态***/
/************ 左 输入顺序 右 ***********/
/***81.1 1.0 3.7 3.6 3.5 3.4 3.3 3.2 8***/
/*************8左 输出顺序 右************/
/***81.5 1.2 1.3 1.4 1.6 1.7 5.4 5.5*****/
#include <REG52.H>
#include <intrins.h> //
#include <string.h>
#include <stdlib.h>
#include "stdio.h"
#define uint unsigned int
#define uchar unsigned char
typedef unsigned char BYTE;
typedef unsigned int WORD;
uint mm=0;
uint i,S;
uint a[10]; //定义数组a 存储串口数组
uint S_Counter=0;
uint Counter;
bit Counter_Flag;
bit Receive_Flag;
bit Turntable_Flag; //转盘运转标志 开启后主程序循环检测转盘开启输入端口电平
bit Signauto=0; //高电平检测循环标志
sbit INTPUT0=P1^1; //主机开转盘
sbit INTPUT1=P1^0; //主机开推杆前进
sbit INTPUT2=P3^7; //主机开推杆后退
sbit INTPUT3=P3^6; //推杆前进停止
sbit INTPUT4=P3^5; //推杆后退停止
sbit Auto_Flag=P3^4; //自动输入引脚
sbit Turntable=P1^5; //Turntable 转盘
sbit X_Axial=P1^2; //排列X轴
sbit Y_Axial=P1^3; //排列Y轴
sbit OUT3=P1^4;
sbit LED=P1^6;
sbit Y_EN=P1^7; //Putter 推杆使能
sbit Y_F=P5^4; //Putter 推杆前进
sbit Y_B=P5^5; //Putter 推杆后退
uint kcounter,kstatus; //按键计数标志 按键状态标志
/*------------------------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<100;j++);
}
/*-----------(1)延时子程序12MHz 加千百十个显示--------*/
void Delay100ms(uint x) //
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<11000;j++);
}
/****************按键计数器状态寄存器归零*************/
void RstKey()
{
kcounter=0; //按键计数器归零
kstatus=0; //状态寄存器归零
}
/*****************按键低电平检测函数*****************/
void LowVoltKey(void) //按键计数器状态标志加一
{
kcounter++;
kstatus++;
}
/*****************按键高电平检测函数*****************/
void HighVoltKey(void) //按键计数器加一 状态标志归零
{
kcounter++; //按键计数器加一
kstatus=0; //按键状态标志归零
}
/*********************************************/
void resrt_io()
{
LED=0;
Y_EN=0;
Y_F=0;
Y_B=0;
Turntable=1;
X_Axial=1;
Y_Axial=1;
OUT3=1;
}
/*------------初始化串口---------------------*/
void InitUart()
{
SCON=0X50; //8位数据,可变波特率
AUXR|=0x01; //串口1选择定时器2为波特率发生器
AUXR|=0X04; //定时器2时钟为Fosc,即1T
T2L=0XE0; //设置定时器处置 110592》9600
T2H=0XFE; //设置定时器处置 110592》9600
AUXR|=0X10; //启动定时器2
TI=1; //
ES=1; //
EA=1; //
}
/*×--------UART 中断服务程序-------------------**/
/**×**把接收到的数据存进数组a[i]**i开机初始化****/
/***×*接收到触摸屏结束码Receive_Flag标志位置1****/
/****×主程序检测到标志码=1判断指令功能***********/
void Uart() interrupt 4 using 1
{
if(RI)
{
if(SBUF==0XFA||SBUF==0XFF) //触摸屏结束码
{
Receive_Flag=1; //接收数据标志置一
RI=0; //
i=0; //数组计数器归零
S_Counter++;
}
else
{
a[i]=SBUF; //数组下标位置的数据等于SBUF
RI=0; //
i++;
}
}
}
/************INT0中断入口************************/
void exint0() interrupt 0 //INT0中断入口
{
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INT0) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3)
{
mm=0; //
EX0=0; //关闭外部中断0使能
// Counter++; //接收数据计数器加1
// Counter_Flag=1; //计数标志为1,发数值到触摸屏
LED=~LED;
}
}
/************INT1中断入口************************/
void exint1() interrupt 2 //按下外部中断1后点亮OUTA一秒钟后熄灭
{
RstKey();
for(;kcounter<5000;) //按键循环5次
{
if(!INT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=4000)
{
}
}
/********************************************/
void timer0() interrupt 1
{
mm++;
if(mm==10) //定时器抗干扰计数器
{
mm=0;
EX0=1; //开外部中断0使能
LED=~LED;
}
}
/************************************/
void main( ) /*主程序开始*/
{
resrt_io();
INT0=1;
INT1=1;
IT0=1; //设置INT0的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX0=1; //使能INT0中断
INT1=1;
IT1=1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1=1; //使能INT1中断
P_SW1=0x00; //RXD/P3.0, TXD/P3.1
Receive_Flag=0;
InitUart(); //初始化串口
printf("0XFF,0XFF,0XFF");
Delay100ms(5);
i=0;
S=0;
TMOD=0X00; //设置定时器为模式0(16位自动重装载)
TL0=0X50; //初始化计时值
TH0=0X50;
TR0=1; //定时器0开始计时
ET0=1; //使能定时器0中断
delay(50);
S_Counter=0;
Counter_Flag=0; //计数标志为1,发数值到触摸屏
Turntable_Flag=0; //转盘运转标志
while(1)
{
if(Counter_Flag==1) //计数标志为1,发数值到触摸屏
{
Counter_Flag=0; //关闭计数标志
printf("n1.val=%d\xff\xff\xff",Counter); //转盘计数器
}
//串口数据内容解析
if(Receive_Flag==1)
{
Receive_Flag=0; //重新接收 S_Counter
printf("n0.val=%d\xff\xff\xff",S_Counter); //串口帧接收计数器
if(a[0]==0XE2)
{
if(a[1]==0XA1)
{
Y_EN=1; //开电机使能
Y_F=1; //开推杆向前
Y_B=0;
}
else if(a[1]==0XA2)
{
Y_EN=1; //开电机使能
Y_F=0; //开推杆向后
Y_B=1;
}
else if(a[1]==0XA3)
{
Turntable=0; //开转盘
}
else if(a[1]==0XA4)
{
Turntable=1; //关转盘
}
else if(a[1]==0XA5)
{
X_Axial=0; //X_Axial开
}
else if(a[1]==0XA6)
{
X_Axial=1; //X_Axial关
}
else if(a[1]==0XA7)
{
Y_Axial=0; //Y_Axial开
}
else if(a[1]==0XA8)
{
Y_Axial=1; //Y_Axial关
}
else if(a[1]==0XA9)
{
Y_EN=0; //关电机使能
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
}
}
}
if(Turntable_Flag==1) //转盘开启标志等于1
{
//INTPUT0高电平转盘关
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT0) //按键高电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(!INTPUT0) //按键低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Turntable_Flag=0; //高电平退出循环
Turntable=1; //关转盘
printf("t2.txt=\"转盘关\"");
printf("\xff\xff\xff");//
}
}
//INTPUT0低电平转盘开
RstKey();
if(Turntable_Flag==0) //
{
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT0) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT0) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Turntable=0; //开转盘
printf("t2.txt=\"转盘开\"");
printf("\xff\xff\xff");//
Turntable_Flag=1; //转盘运转标志=1;
}
}
//主机开推杆进
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT1) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT1) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
printf("t5.txt=\"推杆进\"");
printf("\xff\xff\xff");//
Y_EN=1; //开电机使能
Y_F=1; //开推杆向前
Y_B=0;
//主机关推杆进
Signauto=1; //高电平循环标志
while(Signauto)
{
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT1) //按键高电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(!INTPUT1) //按键低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Signauto=0; //高电平退出循环
Y_EN=0; //关电机使能
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
printf("t5.txt=\"推杆停\"");
printf("\xff\xff\xff");//
}
//推杆向前限位检测 INTPUT3
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT3) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT3) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Signauto=0; //高电平退出循环
Y_EN=0; //关电机使能
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
printf("t5.txt=\"推杆停\"");
printf("\xff\xff\xff");//
}
}
}
//主机开推杆退
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT2) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT2) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
printf("t5.txt=\"推杆退\"");
printf("\xff\xff\xff");//
Y_EN=1; //开电机使能
Y_F=0; //开推杆向后
Y_B=1;
//主机关推杆退
Signauto=1; //高电平循环标志
while(Signauto)
{
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(~!INTPUT2) //按键高电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(!INTPUT2) //按键低电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Signauto=0; //高电平退出循环
printf("t5.txt=\"推杆停\"");
printf("\xff\xff\xff");//
Y_EN=0; //关电机使能
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
}
//推杆向后限位检测
RstKey();
for(;kcounter<5;) //按键循环5次
{
if(!INTPUT4) //按键低电平
{
LowVoltKey(); //按键低电平 计数器加一状态标志加一
}
else if(~!INTPUT4) //按键高电平
{
HighVoltKey(); //按键计数器加一 状态标志归零
}
}
if(kstatus>=3) /*按键状态标志大于等于3为有效值*/
{
Signauto=0; //高电平退出循环
printf("t5.txt=\"推杆停\"");
printf("\xff\xff\xff");//
Y_EN=0; //关电机使能
Y_F=0; //关推杆向前
Y_B=0; //关推杆向后
}
}
}
}
} //L449 CODE 2508 2021 2 28