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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2202|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)紅外遙控小車(chē),實(shí)現(xiàn)松手檢測(cè)程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1020872 發(fā)表于 2023-9-13 11:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
需要在外部中斷0,增加一個(gè)定時(shí)器,在確定是紅外引導(dǎo)碼之后,開(kāi)啟定時(shí)器,只要是定時(shí)器的時(shí)間超過(guò)130ms,那么就退出紅外模式,因?yàn)榧t外有個(gè)重復(fù)碼發(fā)送是108ms所以定時(shí)器的時(shí)間要大于108ms,這樣可以實(shí)現(xiàn)紅外遙控松手檢測(cè),長(zhǎng)按也可以執(zhí)行,松手就不執(zhí)行 ,代碼如下:
/*-----------------------------------------------
  名稱(chēng):紅外遙控
------------------------------------------------*/
#include "IR.h"
#include "delay.h"
#include "1602.h"
unsigned int num=0; //超時(shí)計(jì)數(shù)器
unsigned int ir_flag=0;//紅外標(biāo)志位
//用于存放地址碼、地址反碼、控制碼、控制反碼
unsigned char Ired_Data[4],Ired_Data1[4];
//紅外遙控管腳位定義
sbit IRED=P3^2;
sbit IN1 =        P1^2; // 高電平1 后退(反轉(zhuǎn))
sbit IN2 =  P1^3; // 高電平1 前進(jìn)(正轉(zhuǎn))
sbit IN3 =        P1^4; // 高電平1 前進(jìn)(正轉(zhuǎn))
sbit IN4 =  P1^5; // 高電平1 后退(反轉(zhuǎn))
sbit EN1 =        P3^0;  // 高電平使能
sbit EN2 =  P3^1;        // 高電平使能
extern unsigned char S1,cunt;
void hongwai(void)
{       
        stoprun();//關(guān)閉電機(jī),防止上電電機(jī)轉(zhuǎn)動(dòng)
        if(ir_flag) //判斷是否接收到紅外遙控器數(shù)據(jù)
  {
                switch(Ired_Data[2])
                        {
                                case 0x00:stoprun();break;
                                case 0x45:S1++;if(S1>=4)S1=1;LCD_Clear(); break;
                                case 0x46:LCD_Write_Char(15,1,'b'); break;
                                case 0x47:LCD_Write_Char(15,1,'c'); break;
                                case 0x44:LCD_Write_Char(15,1,'d'); break;
                                case 0x40:LCD_Write_Char(15,1,'e'); break;
                                case 0x43:LCD_Write_Char(15,1,'f'); break;
                                case 0x07:cunt--;if(cunt<=0)cunt=99;LCD_Write_Char(15,1,'g');  break;
                                case 0x15:cunt++;if(cunt>=100)cunt=0;LCD_Write_Char(15,1,'h'); break;
                                case 0x09:LCD_Write_Char(15,1,'i'); break;
                                case 0x16:LCD_Write_Char(15,1,'0'); break;
                                case 0x19:LCD_Write_Char(15,1,'j'); break;
                                case 0x0d:LCD_Write_Char(15,1,'k'); break;
                                case 0x0c:LCD_Write_Char(15,1,'1'); break;
                                case 0x18:LCD_Write_Char(15,1,'2');run(); break;
                                case 0x5e:LCD_Write_Char(15,1,'3'); break;
                                case 0x08:LCD_Write_Char(15,1,'4');leftrun(); break;
                                case 0x1c:LCD_Write_Char(15,1,'5');stoprun(); break;
                                case 0x5a:LCD_Write_Char(15,1,'6');rightrun();break;
                                case 0x42:LCD_Write_Char(15,1,'7'); break;
                                case 0x52:LCD_Write_Char(15,1,'8');backrun(); break;
                                case 0x4a:LCD_Write_Char(15,1,'9'); break;
                          default:break;
                        }       
    }
        else //未接收到紅外遙控器數(shù)據(jù)時(shí),電機(jī)停止
        {
                stoprun();
        }       
}


//小車(chē)前進(jìn)函數(shù)
void run(void)
{
   IN1=0;                //左電機(jī)
         IN2=1;
         IN3=1;                //右電機(jī)
         IN4=0;
   EN1=1;
         EN2=1;
}

//小車(chē)后退函數(shù)
void backrun(void)
{
   IN1=1;                //左電機(jī)
         IN2=0;
         IN3=0;                //右電機(jī)
         IN4=1;
         EN1=1;
         EN2=1;
}
//小車(chē)左轉(zhuǎn)函數(shù)
void leftrun(void)
{
   IN1=0;                //左電機(jī)
         IN2=0;
         IN3=1;                //右電機(jī)
         IN4=0;
         EN1=1;
         EN2=1;
}
  //小車(chē)右轉(zhuǎn)函數(shù)
void rightrun(void)
{
   IN1=0;                //左電機(jī)
         IN2=1;
         IN3=0;                //右電機(jī)
         IN4=0;
         EN1=1;
         EN2=1;
}
   //小車(chē)停止函數(shù)
void stoprun(void)
{
   IN1=0;                //左電機(jī)
         IN2=0;
         IN3=0;                //右電機(jī)
         IN4=0;
         EN1=1;
         EN2=1;
}

/*------------------------------------------------
                 中斷初始化
------------------------------------------------*/
void Ired_Init()
{
        TMOD|=0x01; //定時(shí)器0工作在模式1(16位定時(shí)器模式)
  TH0=(65536-9173)/256; //設(shè)置定時(shí)器初值,需根據(jù)實(shí)際情況調(diào)整參數(shù) 定時(shí)10ms
  TL0=(65536-9173)%256; //設(shè)置定時(shí)器初值,需根據(jù)實(shí)際情況調(diào)整參數(shù)
  EA=1;     //打開(kāi)總中斷
  TR0=1; //啟動(dòng)定時(shí)器0
        IT0=1;    //下降沿觸發(fā)
        EX0=1;    //打開(kāi)中斷 0 允許
        IRED=1;   //初始化端口
}

void Ired() interrupt 0    //外部中斷 0 服務(wù)函數(shù)
{
        unsigned char Ired_Hight_Time=0;
        unsigned char i,j;
        unsigned int Time=0;
                if(IRED==0)
        {
                Time=1000;
                while((IRED==0)&&(Time!=0))   //等待引導(dǎo)信號(hào) 9ms 低電平結(jié)束,若超過(guò) 10ms 強(qiáng)制退出
                {
                        delay1(1);     //延時(shí)約 10us
                        Time--;   
                        if(Time==0)
                                return ;
                }
                if(IRED==1)    //引導(dǎo)信號(hào) 9ms 低電平已過(guò),進(jìn)入高電平,2.25ms的為重復(fù)碼,4.5ms的為數(shù)據(jù)碼
                {       
                        ir_flag=1; //紅外遙控器數(shù)據(jù)接收標(biāo)志位開(kāi)啟
                        ET0=1;//開(kāi)啟定時(shí)器
                        num=0;//計(jì)時(shí)清0
                        delay1(250);  //延時(shí)2.5ms判斷紅外口是不是低電平,如果是低電平則為重復(fù)碼,如果是在2.5ms沒(méi)有低電平則判斷是不是到了4.5ms的數(shù)據(jù)碼
                        if(IRED==0)
                        {
                            Ired_Data[2]=Ired_Data1[2];//把上一次的值賦值到重復(fù)碼這里
                                   return ;//必須要加退出,不然進(jìn)入中斷會(huì)錯(cuò)誤
                        }
                        Time=250;//再計(jì)算2.5ms判斷是否有低電平產(chǎn)生,如果超時(shí)就退出,如果在2.5ms內(nèi)有低電平則為數(shù)據(jù)碼,因?yàn)橹耙呀?jīng)延時(shí)了2.5ms,所以再加2.5ms判斷
                        while((IRED==1)&&(Time>=0))   //等待引導(dǎo)信號(hào) 4.5ms 高電平結(jié)束,如超過(guò) 5ms 強(qiáng)制退出
                        {
                                delay1(1);
                                Time--;
                                if(Time==0)
                                        return ;
                        }
                       

        //地址碼,反地址碼,控制碼,反控制碼的收集
                        for(i=0;i<4;i++)   //循環(huán) 4 次,讀取 4 個(gè)字節(jié)數(shù)據(jù)
                        {
                                for(j=0;j<8;j++)   //循環(huán) 8 次讀取每位數(shù)據(jù)即一個(gè)字節(jié)
                                {
                                        Time=600;
                                        while((IRED==0)&&(Time!=0))    //等待數(shù)據(jù) 1 或 0 前面的 0.56ms 結(jié)束,若超過(guò) 6ms 強(qiáng)制退出
                                        {
                                                delay1(1);
                                                Time--;
                                                if(Time==0)
                                                        return;       
                                        }
                                        Time=20;
                                        while(IRED)  //等待數(shù)據(jù) 1 或 0 后面的高電平結(jié)束,若超過(guò) 2ms 強(qiáng)制退出
                                        {
                                                delay1(10);    //約 0.1ms
                                                Ired_Hight_Time++;
                                                if(Ired_Hight_Time>20)
                                                        return ;
                                        }
                                        Ired_Data[i]>>=1;   //先讀取的為低位,然后是高位
                                        if(Ired_Hight_Time>=8)   //如果高電平時(shí)間大于 0.8ms,數(shù)據(jù)則為 1,否則為 0.
                                                Ired_Data[i]|=0x80;    //用或運(yùn)算不影響其他位的數(shù)字
                                        Ired_Hight_Time=0;   //重新清零,等待下一次計(jì)算時(shí)間
                                }
                }
                Ired_Data1[2]=Ired_Data[2];//把采集的數(shù)據(jù)同時(shí)保存到另外一個(gè)數(shù)組,為下一次的重復(fù)碼賦值使用
        }
                if(Ired_Data[2]!=~Ired_Data[3])   //校驗(yàn)控制碼與反控制碼,錯(cuò)誤則返回
                {
                        for(i=0;i<4;i++)
                                Ired_Data[i]=0;
                        return ;
                }
        }
}

void INT_Timer0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
                TH0=(65536-9173)/256; //重新設(shè)定定時(shí)器初值10ms
                TL0=(65536-9173)%256; //重新設(shè)定定時(shí)器初值
          num++;
        if(num>=13)//130ms到了,沒(méi)有紅外按鍵按下,標(biāo)志位清零,為什么要130ms,因?yàn)榧t外重復(fù)碼是間隔108ms重發(fā)發(fā)送一次,所以要大于108ms,判斷沒(méi)有紅外按下
                {
                        ir_flag=0; //清除紅外遙控器數(shù)據(jù)接收標(biāo)志位
                        num=0;//計(jì)時(shí)清0
                        ET0=0;//關(guān)閉定時(shí)器0中斷
                }
}

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

使用道具 舉報(bào)

沙發(fā)
ID:1020872 發(fā)表于 2023-9-13 14:24 | 只看該作者
對(duì)于紅外遙控的小車(chē)做松手檢測(cè)很好的程序,程序驗(yàn)證是通過(guò)的,網(wǎng)上資源很少,這是自己原創(chuàng)的,歡迎大家相互學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:672792 發(fā)表于 2023-9-13 14:40 | 只看該作者
提個(gè)小小的建議,如果發(fā)就發(fā)全
回復(fù)

使用道具 舉報(bào)

地板
ID:1020872 發(fā)表于 2023-9-13 16:03 | 只看該作者
愛(ài)電子998 發(fā)表于 2023-9-13 14:40
提個(gè)小小的建議,如果發(fā)就發(fā)全

第一次發(fā)帖,經(jīng)驗(yàn)不足,下次改進(jìn),如果哪里不清楚,可以提一下
回復(fù)

使用道具 舉報(bào)

5#
ID:432633 發(fā)表于 2023-10-20 13:38 | 只看該作者
程序沒(méi)發(fā)全呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产在线精品一区二区 | 男人av的天堂 | 亚洲一区视频在线 | 欧美一区二区成人 | 免费av一区二区三区 | 午夜小视频在线播放 | 国产福利视频在线观看 | 亚洲视频欧美视频 | yeyeav| 国产精品自产av一区二区三区 | 欧美狠狠操 | 国产激情视频在线 | 亚洲免费视频网站 | 台湾a级理论片在线观看 | 日韩欧美视频免费在线观看 | 日韩av在线中文字幕 | 97精品超碰一区二区三区 | 日韩一区二区福利 | 91精品国产高清一区二区三区 | 免费成人高清在线视频 | 久久亚洲综合 | 久久国产精品一区二区 | 国产欧美在线视频 | 成人免费观看视频 | 99在线免费观看视频 | 在线视频中文字幕 | 亚洲va在线va天堂va狼色在线 | 欧美成人aaa级毛片在线视频 | 波多野结衣精品 | 欧美成人精品一区二区男人看 | 亚洲免费视频在线观看 | 亚洲高清在线观看 | www.亚洲一区 | 欧美另类视频 | 小早川怜子xxxxaⅴ在线 | 久久美国 | 伊人网站在线观看 | 一本大道久久a久久精二百 欧洲一区二区三区 | 久久久精品一区二区三区 | 亚洲精品视频在线看 | 亚洲电影一区 |