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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

大神們幫我看看為啥用紅外控制小車不動唄

[復制鏈接]
跳轉到指定樓層
樓主
ID:237053 發表于 2017-10-21 18:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#define const_interrupt_time 792
#define uchar unsigned char
#define uint unsigned int
void initial_myself();   
void initial_peripheral();
void delay_short(uint uiDelayShort);
void delay_long(uint uiDelaylong);
void Int0();   
void detectorIR();
void run();      
sbit IR_sr=P3^2;  
sbit P1_0=P1^0;   
sbit P1_1=P1^1;   
sbit P1_2=P1^2;        
sbit P1_3=P1^3;   
uchar ucMotorStep=0;   
uchar ucdata;
void delay(uchar x);  
void delay1(int ms);
void beep();
unsigned char pwm_val_left  =0;
unsigned char push_val_left =0;
unsigned char pwm_val_right =0;
unsigned char push_val_right=0;
bit Right_moto_stop=1;
bit Left_moto_stop =1;
unsigned  int  time=0;
sbit Left_moto_pwm=P1^6;     
sbit Right_moto_pwm=P1^7;
        
void main()
  {
    initial_myself();         
    delay_long(100);   
    initial_peripheral();
    while(1)   
    {         
           detectorIR();
           run();
    }

}
void detector_IR()
{
        if(ucdata==0x73) ucMotorStep=1;
        else if(ucdata==0x56) ucMotorStep=2;
        else if(ucdata==0x7b) ucMotorStep=3;
        else if(ucdata==0x52) ucMotorStep=4;
        else if(ucdata==0x71) ucMotorStep=5;
        else ucMotorStep=5;
}
void run()
{
        switch(ucMotorStep)
        {
                case 1:
        push_val_left  =3;
        push_val_right =3;
                                P1_0=1;
                                P1_1=0;
                                P1_2=1;
                                P1_3=0;
                                break;
                case 2:
                                push_val_left  =3;
        push_val_right =3;
        P1_0=0;
                                P1_1=1;
                                P1_2=0;
                                P1_3=1;
                                break;
                case 3:
                                push_val_left  =2;
        push_val_right =2;
        P1_0=0;
                                P1_1=1;
                                P1_2=1;
                                P1_3=0;
                                break;
                case 4:
                                push_val_left  =2;
        push_val_right =2;
        P1_0=1;
                                P1_1=0;
                                P1_2=0;
                                P1_3=1;
                                break;
                case 5:
                                P1_0=0;
                                P1_1=0;
                                P1_2=0;
                                P1_3=0;
                                break;
        }
}

void Int0() interrupt 0
{
         uchar i,j;
        EX0=0;            
        i=10;
        while(i--)
        {
                TH0=(65535-const_interrupt_time)/256;   
            TL0=(65535-const_interrupt_time)%256;
                TR0=1;
                while(!TF0);
                TF0=0;
                TR0=0;
                while(IR_sr)
                {
                        EX0=1;
                        return;
                }
        }         
        while(!IR_sr);
        j=5;
        while(j--)
        {
                TH0=(65535-const_interrupt_time)/256;   
            TL0=(65535-const_interrupt_time)%256;
                TR0=1;
                while(!TF0);
                TF0=0;
                TR0=0;
                while(!IR_sr)
                {
                        EX0=1;
                        return;
                }
        }        
        while(IR_sr);
        for(i=0;i<4;i++)
        {
                for(j=0;j<8;j++)
                {
                        
                        while(!IR_sr);
                        TH0=(65535-const_interrupt_time)/256;   
                    TL0=(65535-const_interrupt_time)%256;
                        TR0=1;
                        while(!TF0);
                        TF0=0;
                        TR0=0;         
                        if(IR_sr)      
                        {
                                ucdata|=0x80;                                    
        while(IR_sr);              
                        }
                        ucdata>>=1;               
                }
        }        
        EX0=1;               
    return;
}



void delay_long(unsigned int uiDelayLong)
{
    unsigned int i;
    unsigned int j;
    for(i=0;i<uiDelayLong;i++)
    {
       for(j=0;j<500;j++)
           {
              ;
           }
    }
}

void initial_myself()  
{   

  TMOD=0x01;  
}

void initial_peripheral()
{
   
   ET0=1;            
   IT0=1;   
   EX0=1;   
   EA=1;   
}
void pwm_out_left_moto(void)
{  
   if(Left_moto_stop)
   {
    if(pwm_val_left<=push_val_left)
        Left_moto_pwm=1;
else
        Left_moto_pwm=0;
if(pwm_val_left>=10)
pwm_val_left=0;
   }
   else  Left_moto_pwm=0;
}
  
void pwm_out_right_moto(void)
{
  if(Right_moto_stop)
   {
    if(pwm_val_right<=push_val_right)
        Right_moto_pwm=1;                                                                           
else
        Right_moto_pwm=0;
if(pwm_val_right>=10)
pwm_val_right=0;
   }
   else    Right_moto_pwm=0;
}
void timer0()interrupt 1   using 2
{
     TH0=0XF8;  
  TL0=0X30;
  time++;
  pwm_val_left++;
  pwm_val_right++;
  pwm_out_left_moto();
  pwm_out_right_moto();
}

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

使用道具 舉報

沙發
ID:237053 發表于 2017-10-21 23:20 | 只看該作者
別沉了呀
回復

使用道具 舉報

板凳
ID:239611 發表于 2017-10-22 10:41 | 只看該作者
我感覺你的紅外解碼程序有問題,不知道你用的什么遙控編碼方式,給你一個通用遙控的解碼例程參考一下:
  1. /************************************************************
  2. 函數功能:對4個字節的用戶碼和鍵數據碼進行解碼
  3. 說明:解碼正確,返回1,否則返回0
  4. 出口參數:dat
  5. *************************************************************/
  6. bit DeCode(void)        
  7. {
  8.    
  9.    unsigned char  i,j;
  10.         unsigned char temp;    //儲存解碼出的數據
  11.         for(i=0;i<4;i++)      //連續讀取4個用戶碼和鍵數據碼
  12.           {
  13.                  for(j=0;j<8;j++)  //每個碼有8位數字
  14.                          {
  15.                  temp=temp>>1;  //temp中的各數據位右移一位,因為先讀出的是高位數據                                                                       
  16.                            TH0=0;         //定時器清0
  17.                            TL0=0;         //定時器清0
  18.                            TR0=1;         //開啟定時器T0
  19.                       while(IR==0)   //如果是低電平就等待
  20.                        ;              //低電平計時
  21.                              TR0=0;         //關閉定時器T0
  22.                            LowTime=TH0*256+TL0;    //保存低電平寬度
  23.                            TH0=0;         //定時器清0
  24.                            TL0=0;         //定時器清0
  25.                            TR0=1;         //開啟定時器T0
  26.                            while(IR==1)   //如果是高電平就等待
  27.                                ;                          
  28.                            TR0=0;        //關閉定時器T0
  29.                            HighTime=TH0*256+TL0;   //保存高電平寬度
  30.                            if((LowTime<370)||(LowTime>640))
  31.                                               return 0;        //如果低電平長度不在合理范圍,則認為出錯,停止解碼                       
  32.                            if((HighTime>420)&&(HighTime<620))   //如果高電平時間在560微秒左右,即計數560/1.085=516次
  33.                                    temp=temp&0x7f;       //(520-100=420, 520+100=620),則該位是0
  34.                            if((HighTime>1300)&&(HighTime<1800)) //如果高電平時間在1680微秒左右,即計數1680/1.085=1548次
  35.                                    temp=temp|0x80;       //(1550-250=1300,1550+250=1800),則該位是1
  36.                      }                                     
  37.            a[i]=temp;        //將解碼出的字節值儲存在a[i]                                                                                                                                                                         
  38.     }                                                    
  39.   if(a[2]=~a[3])  //驗證鍵數據碼和其反碼是否相等,一般情況下不必驗證用戶碼
  40.          return 1;     //解碼正確,返回1
  41. }
復制代碼

回復

使用道具 舉報

地板
ID:237053 發表于 2017-10-22 22:19 | 只看該作者
botgs 發表于 2017-10-22 10:41
我感覺你的紅外解碼程序有問題,不知道你用的什么遙控編碼方式,給你一個通用遙控的解碼例程參考一下:

那這個怎么用呢
回復

使用道具 舉報

5#
ID:239611 發表于 2017-10-23 14:09 | 只看該作者
z50555 發表于 2017-10-22 22:19
那這個怎么用呢

首先還是先了解一下紅外遙控的編碼和解碼的知識,然后查一下你的遙控器的編碼方式,把這個程序改一下做個接收測試。
接收測試就做個簡單的小程序,記下你的發射信息,把接收的結果和原值比較一下,對了就亮個燈就行了,這樣可以確認接收是否正確。
回復

使用道具 舉報

6#
ID:242112 發表于 2017-10-23 15:09 | 只看該作者
用的是ST芯片嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美又大粗又爽又黄大片视频 | 亚洲 自拍 另类 欧美 丝袜 | 久久国产成人精品国产成人亚洲 | 国产日韩一区二区三区 | 四虎影院免费在线播放 | 精品乱人伦一区二区三区 | 高清一区二区 | 欧美综合一区 | 97久久久 | 日韩亚洲欧美综合 | av国产精品毛片一区二区小说 | 国产91久久久久 | 国产日产久久高清欧美一区 | 91精品中文字幕一区二区三区 | 欧美一区成人 | 久久综合伊人一区二区三 | 91精品国产91久久久久久最新 | 午夜视频在线免费观看 | 国产99精品| 欧美综合一区 | 国产视频一区在线 | 男人天堂网址 | 中国大陆高清aⅴ毛片 | 亚洲区一区二 | 欧美精品欧美精品系列 | 国产成人久久av免费高清密臂 | 亚洲国产精品一区二区三区 | 成人在线观看网址 | 亚洲综合色丁香婷婷六月图片 | 国产精品久久久久久久久久久久冷 | 成人一区二区三区在线观看 | 精品一区免费 | 成人一区在线观看 | 特黄一级 | 91精品一区| 国产精品波多野结衣 | 红桃视频一区二区三区免费 | 日日干夜夜操 | 国产精品99久久久久 | 精品视频在线播放 | 精品久久久久久久久久久久久 |