هذا هو الكود المرسل
كود:
sbit led at RA0_bit;
sbit led_dir at trisA0_bit;
sbit sw1 at RB0_bit;
sbit sw2 at RB1_bit;
sbit sw3 at RB2_bit;
sbit sw4 at RB4_bit;
sbit sw5 at RB5_bit;
char x=0;
const char address=10;
void IR_Send(char IR_Address, char IR_COmmand);
// flashing***********************//
void flashing()
{
for(x=0;x<10;x++)
{
led=1;
delay_ms(50);
led=0;
delay_ms(50);
}
}
// main *******************************//
void main()
{
cmcon=7;
led_dir=0;// output
trisb=0xF7;
PWM1_Init(38000);// frequncy 38KHZ
PWM1_Set_Duty(127); // set duty 50%
flashing();
while(1)
{
if(sw1==1){IR_Send(address,0xAA); }
if(sw2==1){IR_Send(address,0xBB); }
if(sw3==1){IR_Send(address,0xCC); }
if(sw4==1){IR_Send(address,0xDD); }
if(sw5==1){IR_Send(address,0xFF); }
}
}
/*******************************************************************************
* Function IR_Send(char IR_Address, char IR_COmmand)
* ------------------------------------------------------------------------------
* Overview: Functions sends address and command via IR NEC protocol
* Input: Address - address of the device
* Command - command for device
* Output: Nothing
*******************************************************************************/
void IR_Send(char IR_Address, char IR_COmmand)
{
char ir_byte[4];
char bitnum;
char bytenum;
ir_byte[3] = ~IR_COmmand;
ir_byte[2] = IR_COmmand;
ir_byte[1] = ~IR_Address;
ir_byte[0] = IR_Address;
// Delay_ms(100); // precaution to be certain of some dead time before message start
PWM1_Start(); // mark
led=1;
Delay_ms(9); // 9mS mark start bit
PWM1_Stop(); // space
led=0;
Delay_us(4500); // 4.5mS space ends start bit
for(bytenum = 0; bytenum < 4; bytenum++) // 4 bytes to send
{
for(bitnum = 0; bitnum < 8; bitnum++) // 8 bits LSB first
{
PWM1_Start(); // mark
led=1;
Delay_us(560); // 560uS mark for '0' or '1'
PWM1_Stop(); // space
led=0;
if(ir_byte[bytenum] & (1 << bitnum)) // test bit <bitnum>
{
Delay_us(1680); // 1.68mS space for a '1'
}
else{
Delay_us(560); // 560uS space for a '0'
}
}
}
PWM1_Start(); // mark
led=1;
Delay_us(560); // stop bit of '1'
PWM1_Stop(); // space
led=0;
Delay_us(1680); // stop bit of 1
Delay_ms(200); // precaution to be certain of some dead time after message ends
}
============================================
طبعا هذا الكود الارسال للبروتوكول NEC
كود:
/*******************************************************************************
* Function IR_Send(char IR_Address, char IR_COmmand)
* ------------------------------------------------------------------------------
* Overview: Functions sends address and command via IR NEC protocol
* Input: Address - address of the device
* Command - command for device
* Output: Nothing
*******************************************************************************/
void IR_Send(char IR_Address, char IR_COmmand)
{
char ir_byte[4];
char bitnum;
char bytenum;
ir_byte[3] = ~IR_COmmand;
ir_byte[2] = IR_COmmand;
ir_byte[1] = ~IR_Address;
ir_byte[0] = IR_Address;
// Delay_ms(100); // precaution to be certain of some dead time before message start
PWM1_Start(); // mark
led=1;
Delay_ms(9); // 9mS mark start bit
PWM1_Stop(); // space
led=0;
Delay_us(4500); // 4.5mS space ends start bit
for(bytenum = 0; bytenum < 4; bytenum++) // 4 bytes to send
{
for(bitnum = 0; bitnum < 8; bitnum++) // 8 bits LSB first
{
PWM1_Start(); // mark
led=1;
Delay_us(560); // 560uS mark for '0' or '1'
PWM1_Stop(); // space
led=0;
if(ir_byte[bytenum] & (1 << bitnum)) // test bit <bitnum>
{
Delay_us(1680); // 1.68mS space for a '1'
}
else{
Delay_us(560); // 560uS space for a '0'
}
}
}
PWM1_Start(); // mark
led=1;
Delay_us(560); // stop bit of '1'
PWM1_Stop(); // space
led=0;
Delay_us(1680); // stop bit of 1
Delay_ms(200); // precaution to be certain of some dead time after message ends
}
============================================
طبعا مايهمنا في الكود هو هذا لانه هو الي راح نضع فيه شفرات طبعا شفرات نحن نضعها وسيقوم الكود البروتوكول NEC بارسال شفره
كود:
while(1)
{
if(sw1==1){IR_Send(address,0xAA); }
if(sw2==1){IR_Send(address,0xBB); }
if(sw3==1){IR_Send(address,0xCC); }
if(sw4==1){IR_Send(address,0xDD); }
if(sw5==1){IR_Send(address,0xFF); }
}
كما تلاحظون الداله IR_Send تحتاج الى address وهذا address خاص لكل جهاز يعني ممكن ان نضع مثلا 4 اجهزه بنفس الشفرات ولكن لكل جهاز له address وبتالي لايحدث تداخل للعلم نستطيع تكوين 255 شفره ابتداء من 1 الى 255
وبتالي لو كان لدينا 4 اجهزه يمكن عمل لكل جهاز 255 شفره ولكن لكل واحد له عنوان وبتأكيد نستطيع ان تحكم ب 255 جهاز لماذا لان البايت اقصى قيمه له هو 255
اما مثلا 0xAA فهذه تعني شفره يعني الان عندما أضغط على SW1 راح ارسل شفره 0xAA وبتالي لما يستقبلها رسيفر راح يشغلي ليد رقم 1
طبعا الشفرات وماذا تفعل بالشفرات يعني مستقبله ماهي وظيفتها عندما تستقبل الشفره فهذا يعود لكم
============================================
طبعا عندي ملاحظه
انا خليت DUTY CYCLE 50% طبعا اذا انت تريد ارسال مسافات أبعد يمكن تقليل DUTY CYCLE وتشغيل ليد ارسال بــ طاقه عاليه يعني بالضبط تشبه عمليه التشغيل البور سبلاي يعني مثلا اربط ليد ارسال مع تراتزتسور وربط معه مقاومه صغيره مثلا 10 اوم ولكن راح تكون فتره تشغيل DUTY CYCLE قليله
عموما لي موضوع بهذا الشأن يمكن البحث عنه لغرض المزيد من معلومات