📄 jihaitang.c
字号:
#include<reg51.h>
#include<stdio.h>
#include<absacc.h>
#include<intrins.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
#define Pi 3.1415
#define LCD_Data_Port P0
sbit Relay=P1^4; //电磁继电器
sbit XPulse_Sent=P1^0; //X轴步进电动机脉冲
sbit dirx=P1^1; //X轴步进电动机正反转
sbit YPulse_Sent=P1^2; //Y轴步进电动机脉冲
sbit diry=P1^3; //Y轴步进电动机正反转
sbit Strat=P1^5; //键盘开始
sbit Stop=P1^6; //复位
sbit Xsensor=P3^4; //传感器1
sbit Ysensor=P3^5; //传感器2
sbit RW=P3^6; //写
sbit RS=P3^7; //读
sbit ENABLE=P2^6; //使能
sbit Busy=P0^7; //忙
uchar countx,county; //对X,Y轴步进电动机发送的脉冲数
uchar ch=0; //定时器计时次数
uchar Fx=0,Fy=0; //X,Y轴步进电动机信号
uchar key_flag; //键盘信号
uchar key_value; //键盘值
//uchar ta=0; //X轴步进电动机传感器信号
//uchar tb=0; //Y轴步进电动机传感器信号
uchar tg=0; //定时器廷时中断标志
bit m0=1,m1=1; //脉冲计数标志
uint data3;
uint data1;
uint data2;
uint data4=0;
uint data5=0;
uint MM;
uint MN;
uint code keylist[23]= {0x0701,0x0702,0x0704,0x0708,0x0710, //按键编码
//单节执行,机械锁定,MST锁定,单节忽略,Z轴锁定
0x0720,0x0740,0x0780,0x0201,0x0204,
//加工吹气,选择停止,程式空跑,自动断电,中心出水
0x0202,0x0301,0x0302,0x0304,
//底板冲刷,刀库正转,刀库反转,排屑器正转,
0x0308,0x0210,0x0220,0x0240,0x0280,
//排屑器停止,主轴反转,主轴停止,主轴正转,主轴定位,
0x0310,0x0320,0x0340,0x3080};
//排屑器反转,冷却液自动,冷却液手动,工作灯
//按键编码
uint code keylist1[9]={0x0001,0x0002,0x0004,0x0008,
//+4 , +X ,+Y ,+Z ,
0x0010,0x0020,0x0040,0x0080,0x0100};
//-Z , -Y , -X,-4 ,过行程解除
uchar code aa[32][4]={{30,0,1,1},{30,0,1,1},{30,0,1,1},{45,0,1,1},{30,0,1,1},{30,0,1,1}, //按键之间距离
//+4,+Z,-Y,单节执行,机械锁定,MST锁定,
{45,10,1,1},{30,0,1,1},{30,53,1,1},{0,23,1,0},{0,30,1,0},{270,10,0,0},
//主轴反转,主轴停止,中心出水,底板冲刷,主轴正转,+X
{30,0,1,1},{30,0,1,1},{45,0,1,1},{30,0,1,1},{30,0,1,1},{45,10,1,1},
//过行程解除,-X,单节忽略,Z轴锁定,加工吹气,主轴定位,
{30,0,1,1},{30,0,1,1},{270,10,0,0},{30,0,1,1},{30,0,1,1},{45,0,1,1},
//刀库正转,刀库反转,+Y,-Z,-4,选择停止,
{30,0,1,1},{30,0,1,1},{45,10,1,1},{30,0,1,1},{30,0,1,1},{60,10,0,0},
//程式空跑,自动断电,排屑器正转,排屑器停止,排屑器反转,冷却液自动,
{30,0,1,1},{30,0,1,1}};
//冷却液手动,工作灯
uchar code xx[32]={ 0x8001,0x8008,0x8020,0xc010,0xc020,0xc040, //按键显示灯
//+4,+Z,-Y,单节执行,机械锁定,MST锁定,
0xa100,0xa200,0xe040,0xe020,0xa400,0x8002,
//主轴反转,主轴停止,中心出水,底板冲刷,主轴正转,+X
0xe080,0x8040,0xc080,0xe001,0xe002,0xa800,
//过行程解除,-X,单节忽略,Z轴锁定,加工吹气,主轴定位,
0xc100,0xc200,0x8004,0x8010,0x8080,0xe004,
//刀库正转,刀库反转,+Y,-Z,-4,选择停止,
0xe008,0xe010,0xc400,0xc800,0xe100,0xe200,
//程式空跑,自动断电,排屑器正转,排屑器停止,排屑器反转,冷却液自动,
0xe400,0xe800} ;
//冷却液手动,工作灯
uchar code ii[32][16]={{'E','r','r','o','r',':','n','u','m','b','e','r','0','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','2',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','0','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','4',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','0','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','6',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','0','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','0','8',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','0','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','0',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','1','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','2',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','1','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','4',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','1','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','6',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','1','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','1','8',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','1','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','0',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','2','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','2',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','2','3',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','4',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','2','5',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','6',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','2','7',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','2','8',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','2','9',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','3','0',' '},
{'E','r','r','o','r',':','n','u','m','b','e','r','3','1',' '},{'E','r','r','o','r',':','n','u','m','b','e','r','3','2',' '} };
uchar mydoc[16]="READY 04jd xmut";
uchar Regard[16]="04jd14&04 200706";
uchar code kdf[16]="200706 04jd";
uchar code kff[16]="NO.2004323004";
uchar code kfe[16]="NO.2004323014";
void _dl5us(void); //廷时
int Checkout(void); //数据校验
void Control_Wave(uchar cx,uchar cy,uchar dirx1,uchar diry1); //步进电机的控制
void Delay(uint x); //廷时
void Dic(uchar x); //电磁继电器控制
void Output0(uchar x); //LCD输出
void Output1(uchar i); //键盘灯显示
void Read(void); //数据读取
void RST(void); //复位
void Select(uchar x); //用于片选
void Culculate(uchar x,uchar y); //数据处理
void time(uchar x); //用于廷时
void time2(void); //定时器溢出时产生中断后程序处理
void time3(void); //用于廷时器time()中断
void Check_Busy(); //检测是否忙
void LCD_Initial(); //初始化设置
void Write_Data (uchar Data); //写数据
void Write_Command (uchar Command); //写指令
void Write_String (uchar *String); //写字符串到LCD
/*=====================================================
主函数
====================================================*/
void main(void)
{
uchar i;
uint cl;
IE=0Xff; //中断总控制位EA,外部中断0开中断
IP=0X01; //外部中断0为高中断优先级
time(200);
Relay=0; //上电清零
P2=0xf9; //锁存器不选用
Write_String(Regard);
RST();
Write_String(mydoc);
key_flag=0; //设置中断标志为0
//数据处理
do
{
if(key_flag) //判断按键是否有效
{
switch(key_value) //根据按键分支
{
case 0x40: //处理P1_5口按键
for(i=0 ;i< 32;i++) //将数组值循环发给函数
{
Culculate(aa[i][0],aa[i][1]);
Control_Wave(MM,MN,aa[i][2],aa[i][3]);
time(1000); //廷时
//Relay=0; //清零
Dic(1); //电磁继电器有效
Read(); //数据读取
cl=Checkout(); //数据校验
if(cl==0)
{
Write_String(ii[i]); //无效LCD显示
}
else
Output1(i); //显示灯亮
Dic(0); //电磁继电器无效
}
RST();
Write_String(mydoc); //检测完后自动复位
break;
case 0x20: //处理P1_6按键
//停止
break;
default: //无效按键,两个键同时按下
break;
}
key_flag=0; //清按键标志
}
}while(TRUE);
}
/*===================================================
外部中断0处理程序
功能说明:处理X,Y轴传感器信号引起的中断
处理键盘信号引起的中断
函数返回值:无
======================================================*/
void Int0()interrupt 0
{
uchar reread_key;
IE=0X80; //屏蔽外部中断0
if(Xsensor==0) // X轴传感器信号引起的外部中断0
{
Fx=0; //X轴步进电机停止
}
if(Ysensor==0) //Y轴传感器信号引起的外部中断0
{
Fy=0; //Y轴步进电机停止
}
key_flag=0; //设置中断标志为0
//P1=0xff; //P1锁存器各口置1
key_value=P1&0x60; //读取外部中断源输入,并屏蔽除了P1_5 P1_6之外的口
Delay(10); //廷时
reread_key=P1&0x60; //再次读取外部中断源输入,并屏蔽除了P1_5 P1_6之外的口
if(key_value==reread_key)
{
key_flag=1; //设置中断标志为1
}
while(Strat==0||Stop==0); //等待确认按键已松开
IE=0Xff; //打开外部中断0
}
/*========================================================
函数类型:void
功能:由主函数传递值,向XY轴步进电机不断发送脉冲使其转动
dirx=1电机正转,反之反转
函数参数:cx,cy,dirx1,diry1
==========================================================*/
void Control_Wave(uchar cx,uchar cy,uchar dirx1,uchar diry1)
{
countx=cx;
county=cy;
dirx=dirx1; //正转
diry=diry1; //反转
TMOD=0x01;
TH0=0Xf6;
TL0=0X3c;
EA=1; //总控制位开启
ET0=1;
TR0=1;
while(countx!=0 || county!=0) //判断脉冲是否发送完毕
{
}
TR0=0; //定时器关
}
/*============================================================
函数类型:void
功能说明:定时器溢出时产生中断后程序处理
函数参数:无
==============================================================*/
void time2()interrupt 1
{
TH0=0xf6;
TL0=0x3c;
if(countx>0) //判断脉冲数是否发送完毕
{
XPulse_Sent=~XPulse_Sent; //取反
m0=~m0;
if(m0) //每发一个脉冲自减
countx--;
}
if(county>0)
{
YPulse_Sent=~YPulse_Sent;
m1=~m1;
if(m0)
county--;
}
TF0=0;
}
/*====================================================================
函数类型:void
功能说明:其它函数调用传递值,用于廷时
函数参数:x
========================================================================*/
void time(uchar x)
{
tg=1; //区分是由廷时函数引起的中断
TMOD=0x10;
TH1=0Xf6;
TL1=0X3c;
EA=1;
ET1=1;
TR1=1;
while(ch<x) //判断条件是否满足,等待中断
{
}
tg=0; //清标志位
TR1=0;
ch=0;
}
/*========================================================
函数名称:_dl5us
功能说明:廷时5ms
函数参数:无
==========================================================*/
/* void _dl5us(void) //廷时5个nop
{
_nop_(); //相当于汇编指令中的空操作指令NOP
} */
/*=======================================================
函数名称:Delay
函数类型:void
功能说明:多次调用_dl5us达到廷时的作用
函数参数:无
==========================================================*/
void Delay(uint x) //廷时函数
{
uint i,j;
for(j=0;j<200;j++)
for(i=0;i<x;i++)
{
_nop_(); //相当于汇编指令中的空操作指令NOP
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -