赤外線リモコン(家電方式)
#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) } } }