?? 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 + -