欧美极品高清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