資源簡介
這個是紅外遙控的程序,希望對大家有幫助,能夠和大家一起學習交流
代碼片段和文件信息
/************************************************************************
?由于晶振的誤差或其他因素導致計算電平時間不準確,應考慮一定的時間誤差。
比如,計算出電平時間大于1.15ms判斷為“1”,小于1.15ms判斷為“0”。
正序解碼法——以發送最高位開始
定義按鍵數組keycode[31]對應遙控器的31個按鍵(具體元素值見程序);
定義解碼數組code[4]即地址碼,地址反碼,數據碼,數據反碼;
定義高電平持續時間time;
經過多次試驗調試,發現所用的紅外遙控器的地址碼是0x04,地址反碼是0xFB,其次是數據碼xxxx?xxxx數據反碼。
解碼過程:
設置P1.1開中斷,下降沿觸發,P1.1接紅外接收頭的輸出。
遙控器一有按鍵按下,紅外接收頭就會發出一系列的脈沖波序列,所以P1.1會觸發33次以上的中斷。
第1次為引導碼,第2到9次為地址碼1,第10到17次是地址碼2,第18到25次是數據碼,第26到33次是數據反碼。
引導碼不解,解第2到第33個碼,
解得的碼放在code[4]中,依次為地址碼,地址反碼,數據碼,數據反碼。
根據數據碼code[2]作出相應的控制。
**************************************************************************/
#include
#define?CPU_F?((double)1000000)??//數字控制震蕩器1MHZ
#define?delay_us(x)?__delay_cycles((long)(CPU_F*(double)x/1000000.0))//延時X微秒
#define?delay_ms(x)?__delay_cycles((long)(CPU_F*(double)x/1000.0))//延時X毫秒
//紅外遙控
//unsigned?char?const?keycode[31]={0x1A0x0E0x5D0x4C0x4D0x430x050x59
//0x190x450x420x1B0x1C0x480x440x1D0x5C0x1F0x0A0x130x100x110x0F
//0x0C0x0D0x0B0x080x090x580x470x53};??//31個按鍵的編碼
unsigned?char?code[4]={0x000x000x000x00}; //地址碼,地址反碼數據碼,數據反碼
//***************************主程序********************//
void?main(void)
{
WDTCTL=WDTPW+WDTHOLD; //關閉看門狗
BCSCTL1=CALBC1_1MHZ; //這兩句的作用,基本時鐘系統控制,數控震蕩控制,將時鐘校準1MHZ
DCOCTL=CALDCO_1MHZ;
P1DIR|=BIT0+BIT6; //P1端口的P1.0、P1.6設置為輸出方向
P1OUT|=BIT0+BIT6; //P1.0、P1.6輸出高電平
P1IE|=0X02; //P1.1中斷使能
P1IES|=BIT1; //P1.1中斷邊沿選擇,下降沿觸發
P1IFG=0; //清P1.1中斷標志
_BIS_SR(GIE); //開總中斷
while(1) //死循環
{
delay_ms(360); //延時360ms
switch(code[2])
{
????case?0x46:??????//#1號鍵
????{
???? P1OUT|=BIT0;?//LED01亮
評論
共有 條評論