《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > ME300實例-1602LCD顯示步進電機鍵控正反轉實驗-C語言源代碼

ME300實例-1602LCD顯示步進電機鍵控正反轉實驗-C語言源代碼

2008-12-28
關鍵詞: 步進電機 LED


[演示程序(C51):]
 
/*****************************************************************/
/*                                                                *
/* ME300B單片機開發(fā)系統(tǒng)演示程序-1602LCD顯示步進電機鍵控正反轉實驗 *
#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   = P1^4;       //運行與停止
sbit  K2   = P1^5;       //設定圈數
sbit  K3   = P1^6;       //方向轉換
sbit  K4   = P1^7;       //速率調整
sbit  BEEP = P3^7;       //蜂鳴器

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[ ] = {" STEPPING MOTOR "};
uchar code  cdis2[ ] = {"CONTROL  PROCESS"};
uchar code  cdis3[ ] = {"    STOP        "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {"  RUNNING       "};

uchar   m,v=0,q=0;

uchar   number=0,number1=0; 
uchar   snum=5,snum1=5;       //預設定圈數
uchar   rate=8;               //預設定速率
uchar   data_temp,data_temp1,data_temp2;   

/********************************************************/
/*                                                  
/* 延時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忙狀態(tài)                                                   
/*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_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);
     }
   }
  }

/********************************************************
/*
/* 顯示運行狀態(tài)
/*
/********************************************************/
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 =0xf0; 
   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   = 0xf0; 
  
   while(1)
    {  
       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 =0xf0;
    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==96)              //96個脈沖電機轉一圈
       { 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; } 
          }
    }
 } 

/********************************************************/

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美999| 欧美精品日韩综合在线| 一本大道久久a久久精二百| 久久99在线观看| 欧美一级视频| 欧美一区二区免费视频| 午夜日韩福利| 亚洲欧美在线高清| 亚洲一区二区视频| 亚洲一区二区精品视频| 亚洲视频一区在线观看| 中日韩在线视频| 亚洲一区尤物| 欧美一区二区三区免费视| 性欧美video另类hd性玩具| 香蕉久久夜色精品国产| 亚洲第一精品福利| 亚洲激情网站| 99re亚洲国产精品| 亚洲午夜激情在线| 西西裸体人体做爰大胆久久久| 性欧美video另类hd性玩具| 久久精品视频在线| 免费观看成人www动漫视频| 欧美国产日韩精品| 欧美日韩亚洲综合一区| 国产精品区一区二区三区| 国产精品一区免费在线观看| 国产一级精品aaaaa看| 激情亚洲一区二区三区四区| 亚洲黄色免费网站| 一区二区日韩伦理片| 午夜精品成人在线视频| 亚洲电影免费在线观看| 日韩西西人体444www| 亚洲综合色婷婷| 久久久精品国产一区二区三区| 美女国内精品自产拍在线播放| 欧美激情成人在线视频| 国产精品久久久久久av福利软件 | 亚洲国产欧洲综合997久久| 亚洲精品视频免费观看| 亚洲女女做受ⅹxx高潮| 久久精品电影| 一区二区三区国产盗摄| 午夜一区二区三区不卡视频| 噜噜噜91成人网| 欧美视频免费| 激情视频一区二区| 中日韩美女免费视频网址在线观看| 午夜精品久久久久久久99黑人| 91久久久久久| 午夜亚洲一区| 欧美激情综合网| 国产精品一区在线观看| 亚洲国产一区二区视频| 亚洲欧美成人精品| 亚洲精品欧美专区| 欧美一区二区日韩一区二区| 欧美成人午夜激情视频| 国产精品永久免费| 亚洲日本成人网| 欧美怡红院视频| 亚洲婷婷综合色高清在线| 久久久久一区| 欧美视频一区二区三区在线观看| 国内精品久久久久久| 在线视频一区观看| 亚洲人体偷拍| 久久精品国产2020观看福利| 欧美日韩天天操| 精品二区视频| 亚洲欧美日韩精品综合在线观看| 亚洲精品久久久一区二区三区| 性欧美暴力猛交69hd| 欧美日韩精品久久久| 激情欧美日韩| 亚洲综合社区| 亚洲一区二区三区精品视频| 米奇777超碰欧美日韩亚洲| 国产欧美精品日韩| 在线亚洲欧美专区二区| 亚洲日本中文字幕免费在线不卡| 欧美一区1区三区3区公司| 欧美日一区二区在线观看| 亚洲国产精品成人久久综合一区 | 亚洲图片欧美午夜| 欧美成人激情在线| 精品动漫一区| 欧美在线不卡| 欧美在线观看你懂的| 国产精品久久久久久久久免费桃花| 亚洲精品久久久久中文字幕欢迎你 | 日韩一二三在线视频播| 亚洲级视频在线观看免费1级| 欧美呦呦网站| 国产精品社区| 亚洲视频久久| 亚洲综合激情| 欧美色播在线播放| 日韩视频在线观看| 日韩亚洲不卡在线| 欧美激情无毛| 1000部国产精品成人观看| 亚洲成人在线视频网站| 久久人人97超碰国产公开结果| 国产欧美一区二区三区国产幕精品 | 国内精品嫩模av私拍在线观看| 午夜影院日韩| 欧美一乱一性一交一视频| 国产精品免费在线| 亚洲影院一区| 小黄鸭精品aⅴ导航网站入口| 国产精品高潮呻吟久久av无限| 日韩一级欧洲| 亚洲一区二区在线播放| 欧美午夜不卡在线观看免费| 一区二区三区色| 亚洲女爱视频在线| 国产精品mm| 亚洲在线不卡| 久久精品国产清高在天天线| 国内成人在线| 亚洲第一天堂av| 麻豆av一区二区三区久久| 亚洲电影免费在线观看| 日韩视频中午一区| 欧美日韩久久| 亚洲无玛一区| 久久精品国产亚洲一区二区| 激情综合电影网| 亚洲美女av在线播放| 欧美日韩一区二| 亚洲一区日韩| 久久久久久久久久码影片| 在线观看一区视频| 亚洲麻豆国产自偷在线| 欧美日韩情趣电影| 亚洲一区二区三区乱码aⅴ| 久久精品官网| 亚洲韩国日本中文字幕| 亚洲综合第一| 国产一区美女| 亚洲肉体裸体xxxx137| 欧美日韩在线免费观看| 亚洲免费在线观看| 久久综合一区二区三区| 亚洲理伦电影| 欧美在线观看网站| 亚洲高清视频一区| 亚洲综合999| 国产在线观看精品一区二区三区| 91久久视频| 欧美视频一区| 久久精品国产久精国产思思| 欧美久久一区| 先锋a资源在线看亚洲| 欧美高清在线视频| 亚洲一区黄色| 你懂的视频欧美| 亚洲一区区二区| 欧美wwwwww| 亚洲一区二区影院| 免费看亚洲片| 亚洲综合国产激情另类一区| 欧美电影专区| 亚洲免费网站| 欧美区视频在线观看| 欧美一进一出视频| 欧美日韩国产成人在线91| 午夜一区不卡| 欧美日韩国产美女| 久久精品国产清高在天天线| 欧美日韩妖精视频| 亚洲国产欧美一区二区三区丁香婷| 国产精品第13页| 最近看过的日韩成人| 国产精品日日做人人爱| 最新亚洲激情| 国产日产欧美a一级在线| 99国产精品久久久久老师| 国产午夜精品久久久| 亚洲一区视频| 亚洲国产精品成人综合色在线婷婷 | 久久精品一二三区| 国产精品青草综合久久久久99 | 亚洲一二区在线| 欧美大尺度在线| 欧美一激情一区二区三区| 欧美日韩国产综合视频在线观看中文 | 韩国精品主播一区二区在线观看| 亚洲一本大道在线| 亚洲国产成人在线播放| 久久久.com| 亚洲一区二区三| 欧美日韩国产在线| 亚洲精品久久嫩草网站秘色 | 亚洲欧美视频| 欧美国产日韩一区二区在线观看| 欧美一区二区三区在线视频 |