?? step.c
字號:
#include<reg51.h>
#include<stdio.h>
//--------------------------------變量定義-------------------------------------------
//sbit INT_0=P3^2; //將p3.2外部中斷0
unsigned int FLAG=0; //數碼管閃爍標志位
unsigned int FLAG1=0; //顯示切換標志位 1---速度,0---坐標
unsigned int FLAG2=0; //電機正反轉切換標志位 1---正轉,0---反轉
unsigned int KEY=0; //鍵值
unsigned int circle=1; //坐標單位1的步進圈數
int Fm=0; //加工點偏差
unsigned int Xe=0; //終點橫坐標
unsigned int Ye=0; //終點縱坐標
unsigned int Nxy=0; //總步數
unsigned int Xi=0; //實時橫坐標
unsigned int Yi=0; //實時縱坐標
unsigned int SpeedX=0; //X電機速度(步/秒)
unsigned int SpeedY=0; //Y電機速度(步/秒)
unsigned int time0_tmp=0xe880; //2ms定時顯示初值
unsigned int time1_tmp=0; //速度控制定時初值
//unsigned int fosc=12; //單片機晶振(MHz)
unsigned int Led1[8]={1,1,1,1,1,1,1,1}; //兩個4位數碼管數值(速度)
unsigned int Led2[8]={1,1,1,1,1,1,1,1}; //兩個4位數碼管數值(坐標)
unsigned char StepX1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//X步進電機正轉節拍
unsigned char StepY1[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//Y步進電機反轉節拍
unsigned char StepX2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//X步進電機正轉節拍
unsigned char StepY2[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//Y步進電機反轉節拍
unsigned char Led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0x86};//數碼管0—9,H,E
//unsigned char Led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x79};//數碼管0—9,A,E
//--------------------------------函數聲明-------------------------------------------
void System_init(void); //設定INT0的工作方式,供主程序調用
void delay(unsigned int); //延時程序
void delay10ms(unsigned int);
//void INT0_int(void); //外部中斷0處理程序
void time0_int(void); //定時器0中斷
//void time1_int(void); //定時器1定時
void Key_Scaning(void); //掃描鍵盤
void dispxy(unsigned int,unsigned int,unsigned int);//數碼管顯示子程序
void display(void); //數碼管顯示
void Key_Control(void); //鍵盤控制
void Go_line(void); //直線差補算法---前進
void Back_line(void); //直線差補算法---回零
//-----------------------------------------------------------------------------------
main()
{
System_init(); //中斷初始化
while(1)
{
Key_Control(); //鍵盤控制
}
}
//-----------------------------------------------------------------------------------
// 函數名稱:System_init()
// 函數功能:初始化設置
// 設定INT0的工作方式
//-----------------------------------------------------------------------------------
void System_init(void)
{
P3=0xfc; //鍵盤端口初值 P3.0 P3.1 置零
TMOD=0x11; //T0、T1都為工作方式1
TH0=(time0_tmp/256); //2ms定時顯示設置
TL0=(time0_tmp%256);
TH1=(time1_tmp/256);
TL1=(time1_tmp%256);
TR0=1;
//TR1=1; //開啟定時器0(定時顯示)
//IT0=0; //選擇INT0為電平觸發方式
IP=0x02; //將T0中斷設置為高優先級
IE=0x82; //ET1=1(定時中斷1允許),ET0=1(定時中斷0允許),EA=1(系統中斷允許)
}
//-----------------------------------------------------------------------------------
void delay(unsigned int i)
{
for(;i>0;i--);
}
void delay10ms(unsigned int i) //延時程序????10ms有問題?????
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<1200;j++);
}
//------------------------------------------------------------------------------------
// 函數名稱:INT0_int()
// 函數功能:外部中斷0處理程序
//------------------------------------------------------------------------------------
/*void INT0_int(void) interrupt 0
{
// EA=0;
Key_Scaning();
// display();
P3=0xfc;
// EA=1;
} */
//------------------------------------------------------------------------------------
// 函數名稱:time0_int()
// 函數功能:定時器0中斷服務子程序,定時動態掃描顯示
//------------------------------------------------------------------------------------
void time0_int(void) interrupt 0
{
EA=0; //關中斷
TH0=(time0_tmp/256);
TL0=(time0_tmp%256);
display();
EA=1; //開中斷
}
//------------------------------------------------------------------------------------
// 函數名稱:time0_int()
// 函數功能:定時器1中斷服務子程序,定時掃描鍵盤
//------------------------------------------------------------------------------------
//void time1_int(void) interrupt 1
//{
//unsigned int j;
// EA=0;
//j=10000;
//time1_tmp=65536-20000;
//TH1=(time1_tmp/256);
// TL1=(time1_tmp%256);
//TR1=1;
// Key_Scaning();
// display();
// EA=1;
//}
//-------------------------------------------------------------------------------------
// 函數名稱:Key_Scaning()
// 函數功能:掃描鍵盤
//-------------------------------------------------------------------------------------
void Key_Scaning(void)
{
unsigned int keytmp,temp;
P3=0x1c; //掃描第一列
temp=P3; //讀出數據,看是否在此行上的某列鍵盤被按下
keytmp=temp&0x03; //P3.0~P3.1
if(keytmp!=0x00)
{
delay(1); //消抖 ==========================1改為100
P3=0x1c;
temp=P3;
keytmp=temp&0x03;
if(keytmp!=0x00) //再次判斷是否有鍵按下
{
switch(keytmp)
{
case 1:
KEY=1; break; //1列1行()
case 2:
KEY=2; break; //1列2行()
default :
break;
}
}
}
P3=0x2c; //掃描第二列
temp=P3; //讀出數據,看是否在此行上的某列鍵盤被按下
keytmp=temp&0x03; //P3.0~P3.1
if(keytmp!=0x00)
{
delay(1);
P3=0x2c; //消抖
temp=P3;
keytmp=temp&0x03;
if(keytmp!=0x00) //再次判斷是否有鍵按下
{
switch(keytmp)
{
case 1:
KEY=3; break; //2列1行()
case 2:
KEY=4; break; //2列2行()
default :
break;
}
}
}
P3=0x4c; //掃描第三列
temp=P3; //讀出數據,看是否在此行上的某列鍵盤被按下
keytmp=temp&0x03; //P3.0~P3.1
if(keytmp!=0x00)
{
delay(1);
P3=0x4c; //消抖
temp=P3;
keytmp=temp&0x03;
if(keytmp!=0x00) //再次判斷是否有鍵按下
{
switch(keytmp)
{
case 1:
KEY=5; break; //3列1行()
case 2:
KEY=6; break; //3列2行()
default :
break;
}
}
}
P3=0x8c; //掃描第四列
temp=P3; //讀出數據,看是否在此行上的某列鍵盤被按下
keytmp=temp&0x03; //P3.0~P3.1
if(keytmp!=0x00)
{
delay(1);
P3=0x8c; //消抖
temp=P3;
keytmp=temp&0x03;
if(keytmp!=0x00) //再次判斷是否有鍵按下
{
switch(keytmp)
{
case 1:
KEY=7; break; //4列1行()
case 2:
KEY=8; break; //4列2行()
default :
break;
}
}
}
}
//------------------------------------------------------------------------------------
// 函數名稱:dispxy()
// 函數功能:數碼管顯示子程序
//------------------------------------------------------------------------------------
void dispxy(unsigned int i,unsigned int j,unsigned int k)
{
P2=i; //選通數碼管
P0=Led_code[j]; //送段碼
delay(k);
}
//------------------------------------------------------------------------------------
// 函數名稱:display()
// 函數功能:數碼管顯示
//------------------------------------------------------------------------------------
void display(void)
{
Key_Scaning();
if(FLAG1==1) //顯示切換標志位1(顯示速度)
{
dispxy(0x01,Led1[0],200-(FLAG==1)*170);
dispxy(0x02,Led1[1],200-(FLAG==2)*170);
dispxy(0x04,Led1[2],200-(FLAG==3)*170);
dispxy(0x08,Led1[3],200-(FLAG==4)*170);
dispxy(0x10,Led1[4],200-(FLAG==5)*170);
dispxy(0x20,Led1[5],200-(FLAG==6)*170);
dispxy(0x40,Led1[6],200-(FLAG==7)*170);
dispxy(0x80,Led1[7],200-(FLAG==8)*170);
}
else //顯示切換標志位0(顯示坐標)
{
dispxy(0x01,Led2[0],200-(FLAG==1)*170);
dispxy(0x02,Led2[1],200-(FLAG==2)*170);
dispxy(0x04,Led2[2],200-(FLAG==3)*170);
dispxy(0x08,Led2[3],200-(FLAG==4)*170);
dispxy(0x10,Led2[4],200-(FLAG==5)*170);
dispxy(0x20,Led2[5],200-(FLAG==6)*170);
dispxy(0x40,Led2[6],200-(FLAG==7)*170);
dispxy(0x80,Led2[7],200-(FLAG==8)*170);
}
}
//------------------------------------------------------------------------------------
// 函數名稱:Key_Control()
// 函數功能:鍵盤控制
//------------------------------------------------------------------------------------
void Key_Control(void)
{
unsigned int i;
time0_tmp=0xb880;
if(KEY==1)
{
KEY=0; //清鍵值
FLAG=0; //數碼管閃爍標志位0(無閃爍)
FLAG1=0; //顯示切換標志位0(顯示坐標)
Led1[0]=0;Led1[1]=0;Led1[2]=0;Led1[3]=0;Led1[4]=0;Led1[5]=0;Led1[6]=0;Led1[7]=0;
Led2[0]=0;Led2[1]=0;Led2[2]=0;Led2[3]=0;Led2[4]=0;Led2[5]=0;Led2[6]=0;Led2[7]=0;
Go_line(); //前進
}
else if(KEY==2)
{
KEY=0; //清鍵值
FLAG=0; //數碼管閃爍標志位0(無閃爍)
FLAG1=0; //顯示切換標志位0(顯示坐標)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -