⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 step.c

📁 基于51的步进电机控制器,含有人机结口程序,软硬件测试都已通过.是不错的参考代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -