赤外線リモコン(家電方式)



図は、「秋月電子」のHPより

#fuses NOBROWNOUTで、停電圧リセット機能を無効にします。、また、実行をモニタするため、RB4 にLEDを接続し、ループを回るごとに点滅させます。output_toggle(PIN_B4) は、実行の度に0,1 を反転します。
port_a=0; //赤外LED1を点灯
delay_us(12);//12μSタイマ
port_a = 0x07; //赤外LEDを消灯
delay_us(11);
これを、23回繰り返すことで 0.6m秒の断続波形を生成できます。これを組み込んだ関数が、p1() です。//
#include <16f88.h>
#fuses HS,NOWDT,PUT,NOLVP,NOPROTECT,NOBROWNOUT
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
#byte port_a=5
//赤外リモコン送信
//スタート*1、デバイスコード*2、操作コード*2、チェック*5
//RB0,RB1,Rb2の3個のスイッチの値を2bitで送信
//1bit:600μ秒、1を48KHz変調
void p1();//1を送信
void p0();//0を送信
void main()
{
int a;
port_b_pullups(true);//PORTBの内蔵プルアップ抵抗
set_tris_a(0x38);//PORTA下位3ビット出力に設定
set_tris_b(0x07); //PORTBのRB2〜RBOは入力ビットに設定
while(1){
a=10;
output_toggle(PIN_B4);//check
switch(a){
case 10:
if(input(PIN_B2)==0){
p1();//スタートビット
p0();p1();//デバイスコード
p0();p1(); //スイッチコード(電球Ll点灯、L2消灯)
p1();p0(); p1();p0();p1();//ストップビット
delay_ms(20);//…20msの送信停止時間
a=20;
break;
}
case 20:
if(input(PIN_B1)==0){ //PBS1 0Nなら次へ行きます
p1();
p0();p1();
p1();p0();//スイッチコード(電球L2点灯、Ll消灯)
p1();p0(); p1();p0();p1();
delay_ms(20);
a=30;
port_a = 0x07; //赤外LEDを消灯
break;
}
case 30://
if(input(PIN_B0)==0){// PBS0 0Nなら次へ行きます
p1();
p0();p1();
p1();p1();//スイッチコード(電球L2点灯、Ll消灯)
p1();p0(); p1();p0();p1();
delay_ms(20);
a=10;
break;
}
}//case
}//while
}
void p1()
{
int c;
for(c=0;c<23;c++){
//1周期26μS
port_a=0; //赤外LED1を点灯
delay_us(12);//12μSタイマ
port_a = 0x07; //赤外LEDを消灯
delay_us(11);
}
}
void p0()
{
port_a = 0x07;// 赤外LEDを消灯
delay_us(600);// 600タイマ
}


#include<16f88.h>
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)
#use fast_io(a)
#use fast_io(b)
//赤外線リモコン信号受信
//赤外受信素子が4.5V必要なので、単4*2の電源では実行不可
//スタート*1、デバイスコード*2、操作コード*2、チェック*5
//受信中の処理は最小限にすること
//1bit:600μ秒
void main()
{
int a,a2,a1;
set_tris_a(0x01);
set_tris_b(0xf8);
//port_b_pullups(true);
output_a(7);
output_b(7);
while(1){
output_toggle(PIN_B0);//動作チェック用
while(1){
a=0;a1=0;a2=0;
output_high(PIN_B1);
output_high(PIN_B2);
if(input(PIN_A0)==0){//スタート検出
//output_low(PIN_B1);
delay_us(300);
}
else break;
if(input(PIN_A0)==0){//確認
//output_low(PIN_B2);
delay_us(600);
}
else break;
if(input(PIN_A0)==1){//デバイスコード1
delay_us(600);
//output_low(PIN_B1);
}
else break;
if(input(PIN_A0)==0)//デバイスコード2
delay_us(600);
else break;
if(input(PIN_A0)==0){//スイッチコード1
//output_low(PIN_B2);
a2 = 2;
}
delay_us(600);
if(input(PIN_A0)==0){ //スイッチコード2
a1 = 1;
}
delay_us(600);
if(input(PIN_A0)==0){//ストップコード確認1
delay_us(600);
//output_low(PIN_B1);
}
else break;
if(input(PIN_A0)==1){//ストップコード確認2
delay_us(600);
output_low(PIN_B1);
}
else break;
if(input(PIN_A0)==0){//ストップコード確認3
delay_us(600);
output_low(PIN_B2);
}
else break;
if(input(PIN_A0)==1){//ストップコード確認4
delay_us(600);
//output_low(PIN_B2);
}
else break;
if(input(PIN_A0)==0)//ストップコード確認5
a=a2 + a1;
//output_low(PIN_B2);
else break;
a=a1+a2;
//受信修了、実行
switch(a){
case 1:
output_low(PIN_A1);
delay_ms(500);
break;
case 2:
output_low(PIN_A2);
delay_ms(500);
break;
case 3:
output_high(PIN_A1);
output_high(PIN_A2);
delay_ms(500);
break;
default:
break;
}//switch(a)
}
}
}