導航:首頁 > 操作系統 > 單片機紅外電平捕捉信號

單片機紅外電平捕捉信號

發布時間:2024-10-28 02:26:49

『壹』 紅外感應器能反饋什麼信號給單片機

輸出的是個開關信號。電壓非高即低。比如,前面沒有物體的時候輸出的是低電平。看做0。然後有了物體,輸出為高電平。看做1.這樣就可以了
要麼就是相反的。無物體的時候是高電平,有物體的時候是低電平。

『貳』 求一個程序,單片機接收紅外感測器發出的信號,然後再控制步進電機動作!

我有紅外遙控器的程序。
你自己可以改改:
/*-----------------------------------------------
名稱:遙控器紅外解碼液晶顯示
日期:2009.5
修改:無
內容:
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include<stdio.h>
#include<intrins.h>

#define TURE 1
#define FALSE 0

sbit IR=P3^2; //紅外介面標志
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E = P2^6;//Pin6

#define Data P0//數據埠
unsigned int hour,minute,second,count;char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]=" ";char data Test1[]=" ";
/******************************************************************/
/* 變數聲明 */
/******************************************************************/

unsigned char irtime;//紅外用全局變數
bit irpro_ok,irok;
unsigned char IRcord[4]; //處理後的紅外碼,分別是 客戶碼,客戶碼,數據碼,數據碼反碼
unsigned char irdata[33]; //33個高低電平的時間數據

/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void Ir_work(void);
void Ircordpro(void);
void ShowString (unsigned char line,char *ptr);
/******************************************************************/
/* 定時器0中斷服務函數 */
/******************************************************************/

void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
{
irtime++; //用於計數2個下降沿之間的時間
}

/******************************************************************/
/* 外部中斷0函數 */
/******************************************************************/
void ex0_isr (void) interrupt 0 using 0//外部中斷0服務函數
{
static unsigned char i; //接收紅外信號處理
static bit startflag; //是否開始處理標志位

if(startflag)
{

if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms+4.5ms
i=0;

irdata[i]=irtime;//存儲每個電平的持續時間,用於以後判斷是0還是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}

else
{irtime=0;startflag=1;}

}
/******************************************************************/
/* 定時器0初始化 */
/******************************************************************/
void TIM0init(void)//定時器0初始化
{

TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
TH0=0x00; //重載值
TL0=0x00; //初始化值
ET0=1; //開中斷
TR0=1;
}
/******************************************************************/
/* 外部中斷初始化 */
/******************************************************************/
void EX0init(void)
{
IT0 = 1; //指定外部中斷0下降沿觸發,INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
/******************************************************************/
/* 紅外鍵值處理 */
/******************************************************************/

void Ir_work(void) //紅外鍵值散轉程序
{

TimeNum[5] = Tab[IRcord[0]/16]; //處理客戶碼並顯示
TimeNum[6] = Tab[IRcord[0]%16];
TimeNum[8] = Tab[IRcord[1]/16]; //處理客戶碼並顯示
TimeNum[9] = Tab[IRcord[1]%16];
TimeNum[11] = Tab[IRcord[2]/16]; //處理數據碼並顯示
TimeNum[12] = Tab[IRcord[2]%16];
TimeNum[14] = Tab[IRcord[3]/16]; //處理數據反碼並顯示
TimeNum[15] = Tab[IRcord[3]%16];

ShowString(1,TimeNum);//顯示處理過後的碼值
irpro_ok=0; //處理完成後清楚標志位

}
/******************************************************************/
/* 紅外解碼函數處理 */
/******************************************************************/
void Ircordpro(void)//紅外碼值處理函數
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++) //處理4個位元組
{
for(j=1;j<=8;j++) //處理1個位元組8位
{
cord=irdata[k];
if(cord>7)//大於某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
{
value=value|0x80;
}
else
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//處理完畢標志位置1

}

/******************************************************************/
/* 微秒延時函數 */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
/* 毫秒函數聲明 */
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}

/******************************************************************/
/* 寫入命令函數 */
/******************************************************************/
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前短暫延時,保證信號穩定
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 寫入數據函數 */
/******************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //操作前短暫延時,保證信號穩定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 寫入位元組函數 */
/******************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行則命令代碼高4位為0xc
else
p=pos+0x80; //是第二行則命令代碼高4位為0x8
WriteCommand (p);//寫命令
WriteData (c); //寫數據
}
/******************************************************************/
/* 寫入字元串函數 */
/******************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循環顯示16個字元
}
/******************************************************************/
/* 初始化函數 */
/******************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示游標移動位置
WriteCommand(0x0c); //顯示開及游標設置
WriteCommand(0x01); //顯示清屏

}
/******************************************************************/
/* 主函數 */
/******************************************************************/

void main(void)
{
EX0init(); //初始化外部中斷
TIM0init();//初始化定時器

InitLcd(); //初始化液晶 DelayMs(15);
sprintf(Test1," haixiang MCU "); //顯示第一行固定信息 ShowString(0,Test1);
sprintf(TimeNum,"Code ");//顯示第二行固定信息 ShowString(1,TimeNum);
while(1)//主循環
{
if(irok) //如果接收好了進行紅外處理
{
Ircordpro();
irok=0;
}

if(irpro_ok) //如果處理好後進行工作處理,如按對應的按鍵後顯示對應的數字等
{
Ir_work();
}
}
}

『叄』 單片機如何對紅外對管高低電平值進行掃描並取平均值,求各位給提供個思路,謝謝!

給你一個我曾經用過的思路,我是用做智能車路徑檢測的。
1、紅外對管對於光照強度敏感性比較強,首先要保證環境光照盡量均勻。

2、一般對於紅外信號採用AD轉換的方式,由單片機A/D口讀取AD值。
3、採用單片機定時中斷方式,比如10ms定時中斷,每進入中斷一次,讀取AD值,存入數組,連續存入10次或20次。下次讀入的數據將按照左移位的方式將原先的數據覆蓋。數組的元素個數可視精度而定。
4、舍棄掉最大值、最小值,亦可對和上次採集相差比較大的舍棄掉。最終對剩下的取平均可得到一個值。可以作為此通道的平均值。
5、其實上面只是一種取均值的方法,可以查一下相關取均值的資料,程序靈活處理。

『肆』 單片機PWM捕捉模式是什麼意思

PWM,是脈沖寬度調制的意思,主要參數有三個,整個脈沖的寬度,高電平的寬度,占空比。這里假設高電平有效。
占空比 = 高電平的寬度 / 整個脈沖的寬度。PWM捕捉,就是同時捕捉PWM的整個脈沖的寬度以及高電平的寬度,進而可以計算得出占空比。
典型的做法,在脈沖上升沿和下降沿都執行捕捉。上升沿復位並啟動定時器,下降沿捕捉定時器內容作為高電平寬度,下一個上升沿捕捉定時器內容作為整個脈沖的寬度,同時復位並重啟定時器以進行下一輪捕捉。

『伍』 給單片機輸入電平信號怎麼做

  1. 如果是0 和 1 的電平輸入的話,一般會先將紅外信號的輸出通過一個 HC7414 滯回比較器,接到單片機。

  2. 因為,紅外的信號有可能處在非0 非1 的中間電壓,如果不接一個滯回較器,單片機將無法識別其是0是1, 更重要的是,這時候可能會引起0和1來回無序跳變。

  3. 當然,如果在程序里以這種非0非1的狀態進行過濾一上,不要7414也是可以的。 如果採用外部中斷的方式的話,是一定不能省這個滯回比較器的。

  4. 因為三極體的基射極飽和電壓為0.6V,所以這里計算應該是(24v-0.6v)/20k,這就是基極電阻上的電流,而100k是為了在沒有輸入24v時,把基極拉低使得三極體截至。你也可以把這個電阻放在20k電阻的另一端。

閱讀全文

與單片機紅外電平捕捉信號相關的資料

熱點內容
gcc怎麼編譯qt程序 瀏覽:921
華為文件夾命名大全 瀏覽:383
php無限分類循環 瀏覽:41
北漂程序員營養餐 瀏覽:105
掃描件pdf轉換成圖片 瀏覽:58
忍者必須死伺服器升級到什麼時候 瀏覽:339
鹼基最多配對演算法 瀏覽:829
命令和決定表彰上的區別 瀏覽:152
全國醫保服務平台app叫什麼 瀏覽:319
php輸出表單 瀏覽:237
西門子r變數編程入門 瀏覽:374
壓縮機器人怎麼做 瀏覽:285
魔獸懷舊服什麼時候來新伺服器 瀏覽:796
如何電腦網路加密 瀏覽:475
終端世界在編譯 瀏覽:771
白色洗碗棉手工解壓 瀏覽:748
JDM什麼app 瀏覽:512
編譯原理終止狀態判斷 瀏覽:751
怎樣設置桌面文件夾的樣子 瀏覽:871
怎麼進入hypixel伺服器國服 瀏覽:84