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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機紅外線測距源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:235954 發表于 2018-3-8 10:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include "config.h"
/***********************
infrared.c文件程序源代碼
*************************/
#include <reg51.h>
sbit IR_INPUT = P1^0;  //紅外接收引腳

bit irflag = 0;  //紅外接收標志,收到一幀正確數據后置1
unsigned char ircode[4];  //紅外代碼接收緩沖區


void InitInfrared(void)  //紅外功能的初始化函數
{
    TMOD &= 0x0F;  //清零T1的控制位
    TMOD |= 0x10;  //配置T1為模式1
    TR1 = 0;       //停止T1計數
    ET1 = 0;       //禁止T1中斷
    IT1 = 1;       //設置INT1為負邊沿觸發
    EX1 = 1;       //使能INT1中斷
}
unsigned int GetHighTime(void)  //獲取高電平時間
{
    TH1 = 0;  //清零T1計數初值
    TL1 = 0;
    TR1 = 1;  //啟動T1計數
    while (IR_INPUT)  //紅外輸入引腳為1時循環檢測等待,變為0時則結束本循環
    {
        if (TH1 >= 0x40)
        {           //當T1計數值大于0x4000,即高電平持續時間超過約18ms時,
            break;  //強制退出循環,是為了避免信號異常時,程序假死在這里。
        }
    }
    TR1 = 0;  //停止T1計數

    return (TH1*256 + TL1);  //返回T1的計數值
}


unsigned int GetLowTime(void)  //獲取低電平時間
{
    TH1 = 0;  //清零T1計數初值
    TL1 = 0;
    TR1 = 1;  //啟動T1計數
    while (!IR_INPUT)  //紅外輸入引腳為0時循環檢測等待,變為1時則結束本循環
    {
        if (TH1 >= 0x40)
        {           //當T1計數值大于0x4000,即低電平持續時間超過約18ms時,
            break;  //強制退出循環,是為了避免信號異常時,程序假死在這里。
        }
    }
    TR1 = 0;  //停止T1計數
    return (TH1*256 + TL1);  //返回T1的計數值
}

void EXINT1_ISR() interrupt 2  //INT1中斷服務函數,執行紅外接收及解碼
{
    unsigned char i, j;
    unsigned char byt;
    unsigned int time;
    //接收并判定引導碼的9ms低電平
    time = GetLowTime();
    if ((time<7833) || (time>8755))  //時間判定范圍為8.5~9.5ms,
    {                                //超過此范圍則說明為誤碼,直接退出
        IE1 = 0;   //退出前清零INT1中斷標志
        return;
    }
    //接收并判定引導碼的4.5ms高電平
    time = GetHighTime();
    if ((time<3686) || (time>4608))  //時間判定范圍為4.0~5.0ms,
    {                                //超過此范圍則說明為誤碼,直接退出
        IE1 = 0;
        return;
    }
    //接收并判定后續的4字節數據
    for (i=0; i<4; i++)  //循環接收4個字節
    {
        for (j=0; j<8; j++)  //循環接收判定每字節的8個bit
        {
            //接收判定每bit的560us低電平
            time = GetLowTime();
            if ((time<313) || (time>718))  //時間判定范圍為340~780us,
            {                              //超過此范圍則說明為誤碼,直接退出
                IE1 = 0;
                return;
            }
            //接收每bit高電平時間,判定該bit的值
            time = GetHighTime();
            if ((time>313) && (time<718))  //時間判定范圍為340~780us,
            {                              //在此范圍內說明該bit值為0
                byt >>= 1;   //因低位在先,所以數據左移,高位為0
            }
            else if ((time>1345) && (time<1751))  //時間判定范圍為1460~1900us,
            {                                     //在此范圍內說明該bit值為1
                byt >>= 1;   //因低位在先,所以數據左移,
                byt |= 0x80; //高位置1
            }
            else  //不在上述范圍內則說明為誤碼,直接退出
            {
                IE1 = 0;
                return;
            }
        }
        ircode[ i] = byt;  //接收完一個字節后保存到緩沖區
    }
    irflag = 1;  //接收完畢后設置標志
    IE1 = 0;    //退出前清零INT1中斷標志
}


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

使用道具 舉報

沙發
ID:1 發表于 2018-3-8 20:07 | 只看該作者
樓主能分享下config.h頭文件與電路圖嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区视频在线观看 | 天天干com | 色爱综合网 | 麻豆av在线 | 波霸ol一区二区 | 亚洲欧美在线观看 | 免费看淫片 | 国产精品不卡 | 欧美精品99 | 国产精品久久久久久久久免费樱桃 | 成人黄色在线 | 精品国产91亚洲一区二区三区www | 久久精品欧美一区二区三区麻豆 | 亚洲精品久久久久中文字幕欢迎你 | 99精品久久 | 中文字幕免费在线 | 日韩欧美大片在线观看 | 毛片a| 成人一级黄色毛片 | 成人精品鲁一区一区二区 | 暖暖成人免费视频 | 97超碰站| 99爱免费 | 亚洲综合在线视频 | 99精品国产成人一区二区 | 亚洲国产精品视频一区 | 日本成人中文字幕在线观看 | 久久99精品久久久久久 | 欧美成人a| 97人人超碰 | 亚洲欧美日韩国产综合 | 一区二区三区四区毛片 | 天天操综合网站 | 欧美日韩在线观看视频 | 欧美日韩国产高清 | 国产乱码久久久久久一区二区 | 成人免费久久 | 天堂成人国产精品一区 | 日韩电影免费观看中文字幕 | 成人av免费| 伊人久久综合 |