欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 單片機(jī)紅外線測距源碼 [打印本頁]

作者: 梁廷明    時(shí)間: 2018-3-8 10:16
標(biāo)題: 單片機(jī)紅外線測距源碼
#include "config.h"
/***********************
infrared.c文件程序源代碼
*************************/
#include <reg51.h>
sbit IR_INPUT = P1^0;  //紅外接收引腳

bit irflag = 0;  //紅外接收標(biāo)志,收到一幀正確數(shù)據(jù)后置1
unsigned char ircode[4];  //紅外代碼接收緩沖區(qū)


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

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


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

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



作者: admin    時(shí)間: 2018-3-8 20:07
樓主能分享下config.h頭文件與電路圖嗎?




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1