普通沖床送料裝置的自動化改造含3張CAD圖
普通沖床送料裝置的自動化改造含3張CAD圖,普通,沖床,裝置,自動化,改造,cad
附錄
程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
typedef bit BOOL;
uint acc=7; //轉(zhuǎn)速控制
uchar Moto=0 ;//電機選擇
uchar MotoDir=0;//電機正反轉(zhuǎn)0正轉(zhuǎn)
bit start;
uchar count=0;// 定時計數(shù),每50ms記一次
uint distanx ;//X方向計數(shù)
uint distany; //Y方向計數(shù)
uint speed=900; //速度變量
sbit LCD_RS = P0^2;
sbit LCD_RW = P0^1;
sbit LCD_EP = P0^0;
sbit key1=P3^3; //開始按鍵
sbit key2=P3^4; //電機選擇
sbit key3=P3^5; //電機正反轉(zhuǎn)
sbit key4=P3^6;//電機加速
sbit key5=P3^7; //電機減速
code uint StepTable1[]={0x10,0x80,0x20,0x40}; //時序為橙色A、棕色B、黃色C、黑色D
code uint StepTable2[]={0x01,0x08,0x02,0x04};//四相單四拍
uchar code dis1[] = {" WELCOME TO "};
uchar code dis2[] = {" Please Start: "};
uchar code dis3[] = {"X:000 V:900r/min"};
uchar code dis4[] = {"Y:000 n: "};
void delay(ms)
{
int i;
for(;ms>=0;ms--)
for(i=110;i>=0;i--);
}
BOOL lcd_bz() // 測試LCD忙碌狀態(tài)
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P1 & 0x80);
LCD_EP = 0;
return result;
}
lcd_wcmd(uchar cmd) // 寫入指令數(shù)據(jù)到LCD
{
while(lcd_bz());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P1 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_pos(uchar pos) //設(shè)定顯示位置
{
lcd_wcmd(pos | 0x80);
}
lcd_wdat(uchar dat)
{ //寫入字符顯示數(shù)據(jù)到LCD
while(lcd_bz());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P1 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_init() //LCD初始化設(shè)定
{
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數(shù)據(jù)
delay(1);
lcd_wcmd(0x0c); //顯示開,關(guān)光標(biāo)
delay(1);
lcd_wcmd(0x06); //移動光標(biāo)
delay(1);
lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
delay(1);
}
//在LCD上顯示單個字符
void Write_char(uchar y,uchar x,uchar c)
{
switch(y)
{
case 0:
lcd_wcmd(0x80+x); //the begin address of first row ,add the x list
break;
case 1:
lcd_wcmd(0xc0+x); //the begin address of second row add the x list
break;
}
lcd_wdat(c); //write a char
}
void display() //初始狀態(tài)顯示
{
uchar i;
{
lcd_pos(0); //設(shè)置顯示位置為第一行的第1個字符
for(i=0;i<16;i++)
{ //顯示字符"WLCOME TO"
lcd_wdat(dis1[ i ]);
delay(5); //控制兩字之間顯示速度
}
lcd_pos(0x40); //設(shè)置顯示位置為第二行第1個字符
for(i=0;i<16;i++)
{
lcd_wdat(dis2[ i ]); //顯示字符
delay(5); //控制兩字之間顯示速度
}
//lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
}
}
void display1()//參數(shù)格式顯示
{
uchar i;
// lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
lcd_pos(0); //設(shè)置顯示位置為第一行的第1個字符
for(i=0;i<16;i++)
{ //顯示字符
lcd_wdat(dis3[i]);
delay(5); //控制兩字之間顯示速度
}
lcd_pos(0x40); //設(shè)置顯示位置為第二行第1個字符
for(i=0;i<16;i++)
{
lcd_wdat(dis4[i]); //顯示字符
delay(5); //控制兩字之間顯示速度
}
}
void Moto1_0()//電機1正轉(zhuǎn)
{
int i;
for(i=0;i<4;i++)
{
P2=StepTable1[i];
delay(acc);
}
}
void Moto1_1() //電機1反轉(zhuǎn)
{
int i;
for(i=0;i<4;i++)
{
P2=StepTable1[3-i];
delay(acc);
}
}
void Moto2_0()//電機2正轉(zhuǎn)
{
int i;
for(i=0;i<4;i++)
{
P2= StepTable2[i];
delay(acc);
}
}
void Moto2_1() //電機2反轉(zhuǎn)
{
int i;
for(i=0;i<4;i++)
{
P2= StepTable2[3-i];
delay(acc);
}
}
void keyscan()
{
P3|=0xF8;//拉高按鍵檢測端口
if(!key1) //開始按鍵
{
delay(20) ;
if(!key1)
start=!start;
while(!key1);
}
if(!key2) //電機選擇按鍵
{
delay(20) ;
if(!key2)
{
Moto++;
if(Moto>=3)Moto=0;
}
while(!key2);
}
if(!key3) //正反轉(zhuǎn)按鍵
{
delay(20) ;
if(!key3)
MotoDir++;if(MotoDir>=2)MotoDir=0;
while(!key3);
}
if(!key4) //加速按鍵
{
delay(20) ;
if(!key4)
{
acc++;
speed=speed+10;
if(acc==500) acc=5;
}
while(!key4);
}
if(!key5) //減速按鍵
{
delay(20) ;
if(!key5)
{
acc--;
speed=speed-10;
if(acc==0) acc=500;
}
while(!key5);
}
}
void display3(uchar x,uchar y,uint num) //顯示一個三位數(shù)
{
Write_char(x,y,(num/100%10+48)); //百位
Write_char(x,y+1,(num/10%10+48)); //十位
Write_char(x,y+2,(num%10+48)); //個位
}
//自動運行程序
void atuorun()
{
int i,j,k,n;
delay(10); //防止電機開始轉(zhuǎn)動不穩(wěn)定。
display3(0,8,speed); //顯示速度
if(distany>=420)distany=0;
for(j=0;j<3;j++)//連續(xù)走六次
{
for(i=0;i<6;i++) //X正方向連續(xù)走停6次
{
while(count<20)Moto1_0();
n++; //加工零件計數(shù)
distanx=distanx+70; //X行程計數(shù)
display3(0,2,distanx); //顯示X方向行程
display3(1,2,distany); //顯示Y方向行程
display3(1,10,n); //顯示加工零件個數(shù)。
delay(500);
}
while(count<20)Moto2_0(); //Y正方向走一次
distany=distany+70; //Y行程計數(shù)
display3(1,2,distany);
delay(500);
for(i=0;i<6;i++) //X負方向連續(xù)走停6次
{
while(count<20)Moto1_1();
n++;
distanx=distanx-70;
display3(0,2,distanx);
display3(1,2,distany);
display3(1,10,n);
delay(500);
}
while(count<20)Moto2_0();
distany=distany+70;
display3(1,2,distany);
delay(500);//Y正方向走一次
}
for(k=0;k<6;k++)//回到原點
{
while(count<8)Moto2_1();
distany=distany-70;
display3(1,2,distany);
display3(1,10,n);
delay(400);
}
}
void init() //初始化定時器
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
lcd_init();
display();
while(1)
{
keyscan();//按鍵掃描
if(start) //開始,自動運行程序
{ init();
display1();
atuorun();
}
else if(Moto==1)//選擇電機1
{
if(!MotoDir)//正轉(zhuǎn)
Moto1_0();
else
Moto1_1(); //反轉(zhuǎn)
}
else if(Moto==2)//選擇電機2
{
if(!MotoDir)//正轉(zhuǎn)
Moto2_0();
else
Moto2_1(); //反轉(zhuǎn)
}
else {P0=0x07;P2=0x00;} //兩個電機都停止
}
}
void time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count>20)count=0;
}
12
收藏