建設(shè)網(wǎng)站對公司起什么作用是什么三一crm手機客戶端下載
紅外傳感器
遙控器通過紅外 LED 發(fā)送調(diào)制后的信號,開發(fā)板上的紅外接收模塊接收遙控器的紅外線。
單工異步,940nm 波長(還有一種 250nm 的N,可見光),EC 通信標準。
38KHz:紅外線頻率。
IN:發(fā)送的方波。

紅外接收模塊中會自動幫我們?yōu)V出 In 部分。
空閑狀態(tài):OUT 輸出高電平。
發(fā)送高電平:OUT 輸出高電平。
發(fā)送低電平:OUT輸出低電平,代表有數(shù)據(jù)。
38kHz 屬于是底層信息,所以協(xié)議層不給予展示,類似類的封裝。
9ms 低+4.5ms 高:start。
后面跟四個字節(jié)數(shù)據(jù)。反碼用于數(shù)據(jù)驗證。
560us 低+560us 高表示0,560us 低+1690us 高表示1. 結(jié)束的最后一個高電平后面要跟一個下降沿表示終止。
一直掃描是效率很低的做法,所以 out 是接在外部中斷上的。
外部中斷
void main(){LCD_Init();LCD_ShowString(1,1,"A");IT0=1;IE0=0;EX0=1;EA=1;PX0=1;while(1){LCD_ShowNum(2,1,num,2);}
}void Int0_Routine() interrupt 0 {num++;
}
中斷和第三個按鍵 P3^2 接在一起,因此按下按鍵3時就會下降沿觸發(fā)中斷。
如果改為低電平觸發(fā),即 IT0=0,按下按鍵就一直觸發(fā)。
接收到的數(shù)據(jù)會以2位的二進制位展現(xiàn)在數(shù)碼管上,這里遙控器上的按鈕并不是按幾數(shù)碼管就會顯示幾的注意一下。重點只是在于看遙控器不同的信號單片機能否區(qū)分和識別。
//ired.h
#ifndef _ired_H
#define _ired_H#include "public.h"//管腳定義
sbit IRED=P3^2;//聲明變量
extern u8 gired_data[4];//函數(shù)聲明
void ired_init(void);#endif//ired.c
#include "ired.h"u8 gired_data[4];//存儲4個字節(jié)接收碼(地址碼+地址反碼+控制碼+控制反碼)/*******************************************************************************
* 函 數(shù) 名 : ired_init
* 函數(shù)功能 : 紅外端口初始化函數(shù),外部中斷0配置
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void ired_init(void)
{IT0=1; //下降沿觸發(fā)EX0=1; //打開中斷0允許EA=1; //打開總中斷IRED=1; //初始化端口
}void ired() interrupt 0 //外部中斷0服務(wù)函數(shù)
{u8 ired_high_time=0;u16 time_cnt=0;u8 i=0,j=0;//引導(dǎo)信號有9ms的低電平和4.5ms的高電平,先把這兩部分讀掉,并且如果太長時間引導(dǎo)信號沒有發(fā)生相應(yīng)的變化就先跳出,省的系統(tǒng)死機。我們給引導(dǎo)信號10ms和5ms的機會。if(IRED==0){time_cnt=1000;while((!IRED)&&(time_cnt))//等待引導(dǎo)信號9ms低電平結(jié)束,若超過10ms強制退出{delay_10us(1);//延時約10ustime_cnt--;if(time_cnt==0)return; }if(IRED)//引導(dǎo)信號9ms低電平已過,進入4.5ms高電平{time_cnt=500;while(IRED&&time_cnt)//等待引導(dǎo)信號4.5ms高電平結(jié)束,若超過5ms強制退出{delay_10us(1);time_cnt--;if(time_cnt==0)return; }//接下來是讀取地址、地址反碼、控制、控制反碼。for(i=0;i<4;i++)//循環(huán)4次,讀取4個字節(jié)數(shù)據(jù){for(j=0;j<8;j++)//循環(huán)8次讀取每位數(shù)據(jù)即一個字節(jié){time_cnt=600;while((IRED==0)&&time_cnt)//等待數(shù)據(jù)1或0前面的0.56ms結(jié)束,若超過6ms強制退出{delay_10us(1);time_cnt--;if(time_cnt==0)return; }time_cnt=20;while(IRED)//等待數(shù)據(jù)1或0后面的高電平結(jié)束,若超過2ms強制退出{delay_10us(10);//約0.1msired_high_time++;if(ired_high_time>20)return; }gired_data[i]>>=1;//先讀取的為低位,然后是高位if(ired_high_time>=8)//如果高電平時間大于0.8ms,數(shù)據(jù)則為1,否則為0gired_data[i]|=0x80;//最高位賦1ired_high_time=0;//重新清零,等待下一次計算時間}}}if(gired_data[2]!=~gired_data[3])//校驗控制碼與反碼,錯誤則清空后返回{for(i=0;i<4;i++)gired_data[i]=0;return; }}
}
main.c:
void main()
{ u8 ired_buf[3];ired_init();//紅外初始化while(1){ ired_buf[0]=gsmg_code[gired_data[2]/16];//將控制碼高4位轉(zhuǎn)換為數(shù)碼管段碼ired_buf[1]=gsmg_code[gired_data[2]%16];//將控制碼低4位轉(zhuǎn)換為數(shù)碼管段碼ired_buf[2]=0X76;//顯示H的段碼smg_display(ired_buf,6); }
}