久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2339|回復: 1
打印 上一主題 下一主題
收起左側

求大神幫我改一下程序,我想實現的功能是啟動/停止、調速和點動控制角度

[復制鏈接]
跳轉到指定樓層
樓主
ID:76295 發表于 2015-4-6 23:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  #include <reg51.h>       //51芯片管腳定義頭文件
#include <intrins.h>  //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint  unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
sbit  K1   = P3^0;       //運行與停止
sbit  K2   = P3^1;       //設定圈數
sbit  K3   = P3^2;       //方向轉換
sbit  K4   = P3^3;       //速率調整
sbit  K5   = P3^4;                 //點動
sbit  BEEP = P3^5;       //蜂鳴器
sbit  LCD_RS = P2^0;            
sbit  LCD_RW = P2^1;
sbit  LCD_EN = P2^2;
bit  on_off=0;            //運行與停止標志
bit  direction=1;         //方向標志
bit  rate_dr=1;           //速率標志
bit  snum_dr=1;           //圈數標志
uchar code  cdis1[ ] = {" 201133595140 "};
uchar code  cdis2[ ] = {"STEPPING MOTOR"};
uchar code  cdis3[ ] = {"    STOP        "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {"  RUNNING       "};
uchar code  cdis6[] = {"ONE STEP"};
uchar  v=0,q=0;
uchar m;
uchar zs;
uchar angle;
uint   number=0,number1=0;
uchar   snum=10,snum1=10;       //預設定圈數
uchar   rate=3;               //預設定速率
uchar   data_temp,data_temP1,data_temp2 ,data_temp3, data_temp4 ;
/********************************************************/
/*                                                  
/* 延時t毫秒
/* 11.0592MHz時鐘,延時約1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uchar k;
   while(t--)
   {
     for(k=0; k<125; k++)
     { }
   }
}
/********************************************************/
void delayB(uchar x)    //x*0.14MS
{
   uchar i;
   while(x--)
   {
     for (i=0; i<13; i++)
     { }
   }
}
/********************************************************/
void beep()
{
   uchar j;
   for (j=0;j<100;j++)
    {
     delayB(4);
     BEEP=!BEEP;                 //BEEP取反
    }
     BEEP=1;                    //關閉蜂鳴器
  delay(170);
}
/********************************************************/
/*                                                               
/*檢查LCD忙狀態                                                   
/*lcd_busy為1時,忙,等待。為0時,閑,可寫指令與數據。     
/*                                                               
/********************************************************/
bit lcd_busy()
{                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;
    delayNOP();
    result = (bit)(P0&0x80);
    LCD_EN = 0;
    return(result);
}
/********************************************************/
/*                                                                 
/*寫指令數據到LCD                                                
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。                             
/*                                                               
/********************************************************/
void lcd_wcmd(uchar cmd)
{                          
   while(lcd_busy());
    LCD_RS = 0;
    LCD_RW = 0;
    LCD_EN = 0;
    _nop_();
    _nop_();
    P0 = cmd;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;  
}
/********************************************************/
/*                                                               
/*寫顯示數據到LCD                                                  
/*RS=H,RW=L,E=高脈沖,D0-D7=數據。                              
/*                                                               
/********************************************************/
void lcd_wdat(uchar dat)
{                          
   while(lcd_busy());
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P0 = dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0;
}
/********************************************************/
/*                                                               
/*  LCD初始化設定                                                
/*                                                               
/********************************************************/
void lcd_init()
{
    delay(30);                  
    lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x0c);      //顯示開,關光標
    delay(5);
    lcd_wcmd(0x06);      //移動光標
    delay(5);
    lcd_wcmd(0x01);      //清除LCD的顯示內容
    delay(5);
}
/********************************************************/
/*                                                                 
/*  設定顯示位置                                                  
/*                                                               
/********************************************************/
void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos | 0x80);  //數據指針=80+地址變量
}
/********************************************************/
/*                                                      
/* LCD1602初始顯示子程序                                             
/*                                                      
/********************************************************/
void  LCD_init_DIS()
{            
     delay(10);                 //延時
     lcd_init();                //初始化LCD            

     lcd_pos(0);                //設置顯示位置為第一行的第1個字符
     m = 0;
     while(cdis1[m] != '\0')
      {                         //顯示字符
        lcd_wdat(cdis1[m]);
        m++;
      }
     lcd_pos(0x40);             //設置顯示位置為第二行第1個字符
     m = 0;
     while(cdis2[m] != '\0')
      {
        lcd_wdat(cdis2[m]);      //顯示字符
        m++;
      }
      delay(3000);               //延時        

      lcd_pos(0);                //設置顯示位置為第一行的第1個字符
      m = 0;
      while(cdis3[m] != '\0')
        {                        //顯示字符
          lcd_wdat(cdis3[m]);
          m++;
        }
      lcd_pos(0x40);             //設置顯示位置為第二行第1個字符
      m = 0;
     while(cdis4[m] != '\0')
        {
          lcd_wdat(cdis4[m]);    //顯示字符
          m++;
        }      
        for(m=0;m<2;m++)
          {
       lcd_pos(0x0c+m);    //顯示方向符號
             lcd_wdat(0x3e);
    }
}
/********************************************************/
/*
/*數據轉換子程序
/*
/********************************************************/
void  data_conv()
{
     data_temP1=data_temp/10;       //高位
  if(data_temP1==0)
  {data_temP1=0x20;}             //高位為0不顯示
     else
  {data_temP1=data_temP1+0x30;}
   data_temp2=data_temp%10;       //低位
     data_temp2=data_temp2+0x30;
}

/********************************************************/
/*
/*數據轉換子程序
/*
/********************************************************/
void  data_conv1()
{
     data_temP1=data_temp/10;       //高位
  if(data_temP1==0)
  {data_temP1=0x20;}             //高位為0不顯示
     else
  {data_temP1=data_temP1+0x30;}
   data_temp2=data_temp%10;       //低位
     data_temp2=data_temp2+0x30;
data_temp3=data_temp%10;  
data_temp3=data_temp3+0x30;
data_temp4=data_temp%10;  
data_temp4=data_temp4+0x30;
}

/********************************************************/   //單步


void data_angle()
{          
uchar angle;
zs=1.8*angle;
data_temp=zs;
Data_conv1();
lcd_pos(0x45);
lcd_wdat(data_temP1);
lcd_pos(0x46);
lcd_wdat(data_temp2);
lcd_pos(0x47);
lcd_wdat(data_temp3);
lcd_pos(0x48);
lcd_wdat(data_temp4);
}
void motor_ffwdb()     //單步正轉
{
{
v=v+1;
if(v==8)
{
v=0;
}
P1=FFW[v];
}
}








/********************************************************/
/*
/*數據顯示子程序
/*
/********************************************************/
void  data_dis()
{
    data_temp = snum;        //顯示圈數
    data_conv();
       lcd_pos(0x44);
       lcd_wdat(data_temP1);
       lcd_pos(0x45);
       lcd_wdat(data_temp2);
    data_temp = rate;         //顯示速率
    data_conv();
       lcd_pos(0x4d);
       lcd_wdat(data_temP1);
       lcd_pos(0x4e);
       lcd_wdat(data_temp2);
}
/********************************************************
/*
/* 顯示運行方向符號
/*
/********************************************************/
void  motor_DR()
  {
       if(direction==1)           //正轉方向標志
        { for(m=0;m<2;m++)
          {
      lcd_pos(0x0c+m);      //顯示方向符號
            lcd_wdat(0x3e);
     }
   }
        else
         { for(m=0;m<2;m++)       //反轉方向標志
           {
          lcd_pos(0x0c+m);     //顯示方向符號
             lcd_wdat(0x3c);
     }
   }
  }
/********************************************************
/*
/* 顯示運行狀態
/*
/********************************************************/
void  motor_RUN()
{
      if(on_off==1)
    { TR0=1;
      lcd_pos(0);     //設置顯示位置為第一行的第1個字符
         m = 0;
         while(cdis5[m] != '\0')
          { lcd_wdat(cdis5[m]);      //RUNNING
            m++;   }
            motor_DR();              //
    }  
      else  
    { TR0=0; P1 =0x0f;
   lcd_pos(0);     //設置顯示位置為第一行的第1個字符
         m = 0;
         while(cdis3[m] != '\0')
          { lcd_wdat(cdis3[m]);      //STOP
            m++;   }
            motor_DR();              //
   snum=snum1;             //
   number1=0;              //清圈數計數器
         }
  }
/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/

main()
{
         LCD_init_DIS();
   TMOD = 0x01;       //T0定時方式1
   TL0  = 0x33;
   TH0  = 0xf5;
   EA   = 1;
   ET0  = 1;
    P1   = 0x0f;

   while(1)
  if( K5==0)
      {delay(5);
   if(K5==0)
{
  beep();
    motor_ffwdb();
delay(500);
}
lcd_wcmd(0x01);
lcd_pos(0x50) ;
    m = 0;
         while(cdis6[m] != '\0')
          { lcd_wdat(cdis6[m]);      //ONE  STEP
            m++;   }
     angle=angle+1;
     data_angle();
K5=1;        // K5 end
}

if(K1==0)
    {
         beep();
      while(K1==0);       //等待鍵釋放
      on_off=~on_off;      
         motor_RUN();  
        }   //K1 end
/********************************************************/
      if(K2==0)   
       {
      beep();
   if(snum_dr==1)
    { snum++;
        snum1=snum;
      if(snum==0x14)
            { snum_dr=~snum_dr;}
    }
   else  
     {snum--;
   snum1=snum;
      if(snum==0x01)
   { snum_dr=~snum_dr; }
     }
    } //K2  end
/********************************************************/
        if(K3==0)   
      {
      beep();
   direction=~direction;
         motor_DR();
      }//K3 end
/********************************************************/
        if(K4==0)   
       {
      beep();
   if(rate_dr==1)
    { rate++;
      if(rate==0x10)
            { rate_dr=~rate_dr;}
    }
    else  
     {
      rate--;
      if(rate==0x01)
   { rate_dr=~rate_dr; }
     }
  } //K4 end
/********************************************************/
      if(number1==snum1)   //與設定圈數是否相等  
     { number1=0;
         on_off=0;
         TR0=0;
        snum=snum1;
   P1=0x0f;
    motor_RUN();
    }         
         data_dis();
}  // while(1) end

          
          //main end
/********************************************************/
/*
/*  定時器 0 中斷
/*
/********************************************************/
void  motor_onoff()  interrupt  1  
{     
       TL0  = 0x33;
       TH0  = 0xf5;
       q++;
    if(q < rate)
        { return; }
    else
       {  q=0;   
       number++;                  //脈沖計數

      if(number==4096)              //64個脈沖電機轉一圈
       { snum--;
      number=0;
            number1++; }          //電機轉動圈數
         if(direction==1)            //方向標志
       { if(v<8)  
         {P1 = FFW[v];v++;}       //取數據,正轉
        if(v==8)
        { v=0; }
          }
      else
       { if(v<8)  
         {P1 = REV[v];v++;}       //取數據,反轉
         if(v==8)
         { v=0; }
          }
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:75077 發表于 2015-4-6 23:42 來自手機 | 只看該作者
太長了。。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区在线视频 | 精品日韩一区 | 欧美激情一区二区 | 91久久精品国产 | 一区二区三区四区电影 | 亚洲欧美日韩精品久久亚洲区 | 国产成人一区二区 | 亚洲欧洲日本国产 | 一级毛片色一级 | 中文字幕一区二区三区四区 | 亚洲一区二区免费视频 | 91在线电影 | 久久久久久国产精品 | 国产视频福利在线观看 | 青青草av在线播放 | 国产一区二区三区久久久久久久久 | 国产一区二区视频在线 | 在线视频一区二区三区 | 亚洲第一视频 | 午夜寂寞影院在线观看 | 精品国产一区二区三区av片 | 涩涩导航| 成人在线视频观看 | 拍真实国产伦偷精品 | 91视视频在线观看入口直接观看 | 亚洲精品一区二区三区丝袜 | 久久久久久久久久久成人 | 91麻豆精品国产91久久久更新资源速度超快 | 九九热免费观看 | av网站在线看| 亚洲成av片人久久久 | 日本在线中文 | 国产a级毛片 | 国产精品一区二区在线 | 欧美精品在线免费观看 | 正在播放亚洲 | 久久久久无码国产精品一区 | 国产精品网址 | 91在线最新 | 祝你幸福电影在线观看 | 日韩中文字幕视频在线 |