久久久国产一区二区_国产精品av电影_日韩精品中文字幕一区二区三区_精品一区二区三区免费毛片爱

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 3201|回復: 3

紅外線控制步進電機正反轉程序

[復制鏈接]
1#
發表于 2013-10-31 19:43:33 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
請高手們看看小弟這個程序哪里有問題?


#include <reg51.h>       //51芯片管腳定義頭文件
#include <intrins.h>         //內部包含延時函數 _nop_();
#define uchar unsigned char
#define uint  unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
sbit  BEEP = P3^6;       //蜂鳴器
sbit IR=P3^2;           //將IR位定義為P3.2引腳
unsigned char flag;
unsigned char a[4];    //儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼
unsigned int LowTime,HighTime; //儲存高、低電平的寬度

/********************************************************/
/*                                                  
/* 延時t毫秒
/* 11.0592MHz時鐘,延時約1ms                                    
/*                                                      
/********************************************************/
void delay(uint t)
{                           
   uint 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 i;
   for (i=0;i<100;i++)
    {
     delayB(4);
     BEEP=!BEEP;                 //BEEP取反
    }
     BEEP=1;                    //關閉蜂鳴器
}
  /*****************************************************
函數功能:延時1ms
***************************************************/
void delay1ms()
{
   unsigned char i,j;       
         for(i=0;i<10;i++)
          for(j=0;j<33;j++)
           ;                 
}
        /********************************************************/
/*
/*步進電機正轉
/*
/********************************************************/
void  motor_ffw()
{
   uchar i;
   uint  j;
   for (j=0; j<8; j++)         //轉1*n圈
    {
            if(a[2]==0x47)                                //停止按鍵的碼值
        {break;}                //退出此循環程序
      for (i=0; i<8; i++)       //一個周期轉45度
        {
          P1 = FFW;          //取數據
          delay(2);            //調節轉速
        }
    }
}
  /********************************************************/
/*
/*步進電機反轉
/*
/********************************************************/
void  motor_rev()
{         
     uchar i;
         uint  j;
         for (j=0; j<8; j++)       //轉1×n圈
      {       
            if(a[2]==0x45)                   // 停止按鍵的碼值
         {break;}               //退出此循環程序
        for (i=0; i<8; i++)     //一個周期轉45度
        {
          P1 = REV;          //取數據
          delay(2);            //調節轉速
        }
      }
}
/************************************************************
函數功能:對4個字節的用戶碼和鍵數據碼進行解碼
說明:解碼正確,返回1,否則返回0
出口參數:dat
*************************************************************/
bit DeCode(void)        
{

   unsigned char  i,j;
        unsigned char temp;    //儲存解碼出的數據
        for(i=0;i<4;i++)      //連續讀取4個用戶碼和鍵數據碼
          {
                 for(j=0;j<8;j++)  //每個碼有8位數字
                         {
                 temp=temp>>1;  //temp中的各數據位右移一位,因為先讀出的是高位數據                                                                       
                           TH0=0;         //定時器清0
                           TL0=0;         //定時器清0
                           TR0=1;         //開啟定時器T0
                      while(IR==0)   //如果是低電平就等待
                       ;              //低電平計時
                             TR0=0;         //關閉定時器T0
                           LowTime=TH0*256+TL0;    //保存低電平寬度
                           TH0=0;         //定時器清0
                           TL0=0;         //定時器清0
                           TR0=1;         //開啟定時器T0
                           while(IR==1)   //如果是高電平就等待
                               ;                          
                           TR0=0;        //關閉定時器T0
                           HighTime=TH0*256+TL0;   //保存高電平寬度
                           if((LowTime<370)||(LowTime>640))
                                              return 0;        //如果低電平長度不在合理范圍,則認為出錯,停止解碼                       
                           if((HighTime>420)&&(HighTime<620))   //如果高電平時間在560微秒左右,即計數560/1.085=516次
                                   temp=temp&0x7f;       //(520-100=420, 520+100=620),則該位是0
                           if((HighTime>1300)&&(HighTime<1800)) //如果高電平時間在1680微秒左右,即計數1680/1.085=1548次
                                   temp=temp|0x80;       //(1550-250=1300,1550+250=1800),則該位是1
                     }                                     
           a=temp;        //將解碼出的字節值儲存在a                                                                                                                                                                         
    }                                                    
  if(a[2]==~a[3])  //驗證鍵數據碼和其反碼是否相等,一般情況下不必驗證用戶碼
         return 1;     //解碼正確,返回1
}
main()
{
                EA=1;        //開啟總中斷
                EX0=1;       //開外中斷0
                 ET0=1;       //定時器T0中斷允許
                IT0=1;       //外中斷的下降沿觸發  
                TMOD=0x01;   //使用定時器T0的模式1       
                TR0=1;       //定時器T0關閉
        while(1);   //等待紅外信號產生的中斷
         while(1)
         {
      if(a[2]==0x47)                  //正轉按鍵的碼值
          {          unsigned char r,N=64;   //N 步進電機運轉圈數 因為我們的步進電機是減速步進電機 減速比是1/64 所以這里N=64時 步進電機外部的主軸轉1圈
        beep();
                for(r=0;r<N;r++)
         {
                   motor_ffw();       //電機正轉
                   if(a[2]==0x46)        //tingzhianjian
                  {beep();break;}    //退出此循環程序
             }
      }
          else if(a[2]==0x45)                // 反轉按鍵碼值
       {  unsigned char r,N=64;   //N 步進電機運轉圈數 因為我們的步進電機是減速步進電機 減速比是1/64 所以這里N=64時 步進電機外部的主軸轉1圈
            beep();
                for(r=0;r<N;r++)
         {
               motor_rev();       //電機反轉
                   if(a[2]==0x46)         // tingzhianjian
                  {beep();break;}    //退出此循環程序
                 }
       }
          else  
                 P1 = 0xf0;
    }
}
        /************************************************************
函數功能:紅外線觸發的外中斷處理函數
*************************************************************/
void Int0(void) interrupt 0
  {
     EX0=0;      //關閉外中斷0,不再接收二次紅外信號的中斷,只解碼當前紅外信號
          TH0=0;      //定時器T0的高8位清0
          TL0=0;      //定時器T0的低8位清0
          TR0=1;            //開啟定時器T0         
          while(IR==0);          //如果是低電平就等待,給引導碼低電平計時
          TR0=0;                //關閉定時器T0     
          LowTime=TH0*256+TL0;  //保存低電平時間
          TH0=0;      //定時器T0的高8位清0
          TL0=0;      //定時器T0的低8位清0
          TR0=1;            //開啟定時器T0
          while(IR==1);  //如果是高電平就等待,給引導碼高電平計時
          TR0=0;        //關閉定時器T0
          HighTime=TH0*256+TL0;        //保存引導碼的高電平長度
     if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
                 {
                    //如果是引導碼,就開始解碼,否則放棄,引導碼的低電平計時
               //次數=9000us/1.085=8294, 判斷區間:8300-500=7800,8300+500=8800.
              if(DeCode()==1) // 執行遙控解碼功能
                 {
               

                  beep();//蜂鳴器響一聲 提示解碼成功
                 }
                 }
          EX0=1;   //開啟外中斷EX0
  }

回復

使用道具 舉報

2#
發表于 2013-10-31 22:00:11 | 只看該作者
我的keil證書過期了,沒法驗證,您看是這個a的問題嗎。

1111.jpg (55.43 KB, 下載次數: 17)

1111.jpg
3#
 樓主| 發表于 2013-11-1 12:20:21 | 只看該作者
不好意思,打錯了。本來是  
a[i]=temp;        //將解碼出的字節值儲存在a[i]
程序調試沒有語法錯誤,但是調試好像陷入死循環了。
4#
發表于 2013-11-2 15:55:08 | 只看該作者
我要學習IT
您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規則

Archiver|手機版|小黑屋|機械社區 ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )

GMT+8, 2025-7-27 12:53 , Processed in 0.073948 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表