亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ir- motor-lcd1602.c

?? 紅外遙控步進電機動作并且lcd液晶顯示數據狀態
?? C
字號:
/*****************************************************************/
/*                        紅外遙控步進電機                       */                                                    *
/*****************************************************************/
    
#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};

uchar IRCOM[6]=(0x00,0x00,0x00,0x00,0x00,0x00);

sbit  BEEP = P3^7;       //蜂鳴器
sbit IRIN=P3^2;          //紅外接收端口

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;           //圈數標志
bit  flag;                //紅外接收有效標志
bit  pause1=0;            //暫停標志

//uchar code  cdis1[ ] = {" STEPPING MOTOR "};
//uchar code  cdis2[ ] = {"CONTROL  PROCESS"};

uchar code  cdis1[ ] = {"   IR CONTROL   "};
uchar code  cdis2[ ] = {" STEPPING MOTOR "};

uchar code  cdis3[ ] = {"IR:--H  STOP    "};
uchar code  cdis4[ ] = {"NUM:    RATE:   "};
uchar code  cdis5[ ] = {" RUN "};
uchar code  cdis6[ ] = {" STOP"};
uchar code  cdis7[ ] = {"PAUSE"};

uchar   m,v=0,q=0;

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

void IR_IN();
/********************************************************/
/*                                                  
/* 延時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(5);
     BEEP=!BEEP;                 //BEEP取反
    } 
     BEEP=1;                    //關閉蜂鳴器
 }

/********************************************************/
/*                                                                
/*檢查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個字符
     for(m=0;m<16;m++)
     lcd_wdat(cdis1[m]);

     lcd_pos(0x40);             //設置顯示位置為第二行第1個字符
     for(m=0;m<16;m++)
     lcd_wdat(cdis2[m]);

     delay(3000);               //延時        
        
     lcd_pos(0);                //設置顯示位置為第一行的第1個字符
	 for(m=0;m<16;m++)
     lcd_wdat(cdis3[m]);

     lcd_pos(0x40);             //設置顯示位置為第二行第1個字符
     for(m=0;m<16;m++)
     lcd_wdat(cdis4[m]);

     for(m=0;m<2;m++)
     { 
      lcd_pos(0x0d+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  code_conv()
{
   IRCOM[5]=IRCOM[2];
   IRCOM[6]=IRCOM[5]&0x0f;       //低位

   if(IRCOM[6]>0x09)
   IRCOM[6]=IRCOM[6]+0x37;
   else
   IRCOM[6]=IRCOM[6]+0x30;

   IRCOM[5]=(IRCOM[5]&0xf0)>>4;  //高位
   if(IRCOM[5]>0x09)
   IRCOM[5]=IRCOM[5]+0x37;
   else
   IRCOM[5]=IRCOM[5]+0x30;
} 

/********************************************************/
/*
/*數據顯示子程序
/*
/********************************************************/
void  data_dis()
{
       code_conv();
       lcd_pos(0x03);
	   lcd_wdat(IRCOM[5]);
//	   lcd_pos(0x08);
	   lcd_wdat(IRCOM[6]);
 
       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(0x0d+m);      //顯示方向符號
            lcd_wdat(0x3e);
		  }
		}
        else
         { 
           for(m=0;m<2;m++)       //反轉方向標志
           { 
	         lcd_pos(0x0d+m);     //顯示方向符號 
             lcd_wdat(0x3c);
		   }
		 }
  }

/********************************************************
/*
/* 顯示運行狀態
/*
/********************************************************/
void  motor_RUN()
 {
      if(on_off==1)
	   { TR0=1; 
	     lcd_pos(7);        //設置顯示位置為第一行的第1個字符
		 for(m=0;m<5;m++)
         lcd_wdat(cdis5[m]);    //RUN
         motor_DR();              //
	   }  
      else  
	   { TR0=0; P1 =0xf0; 
		 lcd_pos(7);        //設置顯示位置為第一行的第1個字符
		 for(m=0;m<5;m++)
         lcd_wdat(cdis6[m]);    //STOP
         motor_DR();              //
         snum=snum1;             //
		 number1=0;              //清圈數計數器
       }
  }

/********************************************************
*                                                       
*  主程序                                               
*                                                      
*********************************************************/
main()
{ 
    LCD_init_DIS();
		
//    IE=0x81;              //允許總中斷中斷,使能 INT0 外部中斷
//    TCON=0x01;            //觸發方式為脈沖負邊沿觸發

    TMOD = 0x01;          //T0定時方式1
    TL0  = 0x33;
    TH0  = 0xf5;
    ET0  = 1;
    EA = 1;
    P1   = 0xf0; 

    while(1)
    {  
	  IR_IN();
	  TEMP=IRCOM[2];
      if(flag) 
      {
/********************************************************
  運行控制
********************************************************/
       if(TEMP==0x10)      //啟動、停止
	   {
	     on_off=~on_off;       
         motor_RUN();		
       } 
/********************************************************
  設定圈數
********************************************************/
      if(TEMP==0x09)      //增加圈數
       {	   
		 if(snum!=0x14)   
		  {
		    snum++;
  		    snum1=snum;
		  }
       }
	  
       if(TEMP==0x1f)     //減少圈數
       {
         if(snum!=0x00)
		  {
		    snum--;			
			snum1=snum;
		  }		 
	   }
/********************************************************
  方向轉換
********************************************************/
      if(TEMP==0x11)       //正轉
      {
		 direction=1; 
         motor_DR();
      }

	  if(TEMP==0x19)       //反轉  
      {
		 direction=0; 
         motor_DR();
      }

/********************************************************
  速率調整
********************************************************/
      if(TEMP==0x12)     //增加速率,減速
       {
	     if(rate!=0x10)
		 rate++;            
	   }	  
 
      if(TEMP==0x1d)     //減少速率,加速  
       {
	     if(rate!=0x01)
		 rate--;            
	   }

      if(TEMP==0x03)
	   {
	     if(on_off&(!pause1))
		 {
		   pause1=1;
           TR0=0;              //暫停
           lcd_pos(7);            //設置顯示位置
		   for(m=0;m<5;m++)
           lcd_wdat(cdis7[m]);    //PAUSE 
         }
         else if(pause1)
		 {
          motor_RUN();
		  pause1=0;
		  TR0=1;
		 }
	   }
       flag=0;
	} // end of if(flag)

/********************************************************/
      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; } 
          }
	   }
 } 

/**********************************************************
  中斷服務函數
**********************************************************/
void IR_IN() //interrupt 0 using 0
{
   unsigned char j,k,N=0;
//   EX0 = 0;   
   delayB(15);
   if (IRIN==1)              //確認IR信號是否出現
   { 
//	 EX0 =1;
	 return;
   } 
                           
   while (!IRIN)              //等IR變為高電平,跳過9ms的前導低電平信號。
   delayB(1);

   for (j=0;j<4;j++)          //收集四組數據
   { 
     for (k=0;k<8;k++)        //每組數據有8位
     {
      while (IRIN)            //等 IR 變為低電平,跳過4.5ms的前導高電平信號。
      delayB(1);
      while (!IRIN)           //等 IR 變為高電平
      delayB(1);
      while (IRIN)            //計算IR高電平時長
      {
        delayB(1);
        N++;           
        if (N>=20)
	    { 
//	      EX0=1; 
	      return;                 //0.14ms計數過長自動離開。
		}                     
      }                           //高電平計數完畢                
     IRCOM[j]=IRCOM[j] >> 1;      //數據最高位補"0"
     if (N>=8) 
	 IRCOM[j]=IRCOM[j] | 0x80;  //數據最高位補"1"
     N=0;
    }//end for k
   } //end for j
   
   if(IRCOM[2]!=~IRCOM[3])   //檢驗接收數據是否正確
   { //EX0=1;
     return; }

   if(IRCOM[0]!=0x00)       //效驗用戶碼
   { 
//     EX0=1;
     return; 
   }
     beep();               //接收有效,蜂鳴器響一聲
	 flag=1 ;              //置接收有效標志
//     EX0 = 1;               //重開中斷
} 

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性xxxxxxxx| 亚洲综合色丁香婷婷六月图片| 91在线观看一区二区| 精品一区二区三区久久久| 国内精品免费在线观看| 三级一区在线视频先锋| 亚洲高清免费视频| 亚洲综合色成人| 艳妇臀荡乳欲伦亚洲一区| 一区二区三区中文字幕| 一区二区三区在线看| 亚洲午夜羞羞片| 视频精品一区二区| 久久成人免费日本黄色| 国内成人自拍视频| 成人午夜在线视频| 色婷婷av一区二区三区之一色屋| 99国产精品国产精品久久| 91亚洲精华国产精华精华液| 欧亚一区二区三区| 欧美一区二区三区性视频| 精品国产凹凸成av人导航| 久久久久国色av免费看影院| 欧美激情艳妇裸体舞| 自拍偷自拍亚洲精品播放| 亚洲国产精品嫩草影院| 日本不卡一二三| 国产成人欧美日韩在线电影| 色综合久久久久综合体| 欧美电影影音先锋| 中文一区在线播放| 亚洲成人自拍一区| 成人av电影在线播放| 欧美手机在线视频| 久久综合色一综合色88| 日韩毛片高清在线播放| 琪琪一区二区三区| 99精品国产99久久久久久白柏| 欧美三级在线播放| 久久免费的精品国产v∧| 亚洲色图19p| 极品少妇一区二区| 在线精品亚洲一区二区不卡| 精品国产乱码久久久久久夜甘婷婷| 中文字幕中文字幕一区二区| 日韩电影在线免费看| 99久久国产免费看| 欧美一区二区三区在线视频| 中文字幕欧美日韩一区| 热久久久久久久| 在线中文字幕不卡| 国产日本欧洲亚洲| 蜜臀av性久久久久蜜臀aⅴ | 日韩一级二级三级| 国产精品视频一二三区| 蜜臀a∨国产成人精品| 欧美午夜在线一二页| 国产精品乱码一区二三区小蝌蚪| 日韩激情av在线| 欧美这里有精品| 亚洲免费av高清| 99久久er热在这里只有精品66| 久久美女高清视频| 久久精品国产第一区二区三区| 欧美色综合影院| 一区二区三区国产豹纹内裤在线 | 久久久亚洲精品石原莉奈| 精品一区二区影视| 欧美一区二区三区公司| 一区二区三区在线视频观看| 94-欧美-setu| 国产精品午夜在线观看| 国产一区二区视频在线播放| 精品国产乱码久久| 天堂av在线一区| 欧美精品丝袜中出| 亚洲一级二级三级在线免费观看| 91亚洲国产成人精品一区二三 | 粉嫩13p一区二区三区| 欧美videos大乳护士334| 日本视频一区二区三区| 欧美精品在线一区二区| 日本一不卡视频| 精品国内片67194| 国产成人av一区| 中文字幕精品三区| 99热精品一区二区| 日韩伦理免费电影| 欧美体内she精高潮| 亚洲成av人**亚洲成av**| 91精品视频网| 精品一区二区三区久久久| 中文子幕无线码一区tr | 亚洲高清一区二区三区| 欧美日韩国产bt| 久久99精品国产.久久久久久| 久久综合久久久久88| 国产成人啪午夜精品网站男同| 亚洲欧美在线另类| 欧美日韩欧美一区二区| 久久精品99国产精品日本| 久久蜜桃av一区精品变态类天堂 | 91国内精品野花午夜精品| 亚洲丶国产丶欧美一区二区三区| 在线不卡免费av| 国产99久久精品| 亚洲大片在线观看| 久久久亚洲精品一区二区三区| 99久久免费精品高清特色大片| 亚洲一线二线三线视频| 精品久久一区二区三区| 91社区在线播放| 天堂成人国产精品一区| 日本一二三不卡| 欧美精品久久一区二区三区| 国产一区高清在线| 亚欧色一区w666天堂| 国产欧美一区二区精品性色 | 久久国产欧美日韩精品| 国产精品毛片a∨一区二区三区| 91成人在线精品| 国产综合久久久久久鬼色 | 欧美高清精品3d| 国产不卡免费视频| 日本网站在线观看一区二区三区| 国产拍揄自揄精品视频麻豆 | 六月丁香婷婷色狠狠久久| 中文字幕第一页久久| 欧美精品一卡两卡| av一区二区不卡| 国产毛片一区二区| 青青草97国产精品免费观看 | 欧美丰满少妇xxxxx高潮对白| 国产精品1区二区.| 日韩电影免费在线| 亚洲综合色丁香婷婷六月图片| 国产精品日产欧美久久久久| 精品电影一区二区三区 | av日韩在线网站| 国产激情91久久精品导航 | 亚洲韩国一区二区三区| 国产精品福利一区二区| 国产欧美一区二区三区鸳鸯浴 | 日日欢夜夜爽一区| 亚洲精品国产无天堂网2021 | 精品影视av免费| 日av在线不卡| 日韩和欧美一区二区三区| 一区二区三区四区av| 亚洲日本在线视频观看| 国产欧美精品在线观看| 久久精品人人爽人人爽| 欧美成人高清电影在线| 欧美一区欧美二区| 欧美欧美欧美欧美| 69堂成人精品免费视频| 91久久国产最好的精华液| www.成人网.com| 92精品国产成人观看免费| www.av亚洲| 91在线视频免费91| 在线免费观看成人短视频| 欧美日韩精品免费观看视频| 欧美色倩网站大全免费| 欧美美女一区二区三区| 91精品中文字幕一区二区三区| 日韩欧美一区中文| 精品国产三级a在线观看| 久久久久久久综合日本| 国产欧美综合色| 亚洲精品乱码久久久久久久久 | 亚洲一线二线三线视频| 一区二区三区四区不卡在线| 亚洲女人的天堂| 日韩中文字幕亚洲一区二区va在线| 亚洲自拍与偷拍| 九一九一国产精品| 国产成人免费视频精品含羞草妖精| 国产精品性做久久久久久| 91丨九色丨蝌蚪富婆spa| 欧美精品乱码久久久久久按摩| 精品嫩草影院久久| 亚洲欧美色一区| 精东粉嫩av免费一区二区三区| 成人av电影免费观看| 666欧美在线视频| 亚洲国产精品99久久久久久久久 | 日本一区二区不卡视频| 一区二区在线观看不卡| 日韩国产高清影视| 成人免费看视频| 6080亚洲精品一区二区| 国产午夜亚洲精品理论片色戒| 亚洲欧美一区二区三区久本道91| 亚洲丰满少妇videoshd| 国产精品91一区二区| 欧美三区免费完整视频在线观看| 欧美精品一区二区三区视频| 亚洲精品国产第一综合99久久| 免费看精品久久片|