51单片机发送nec协议红外编码
时间: 2023-10-04 20:09:48 浏览: 330
51单片机NEC协议红外编码发射程序
在51单片机中,可以通过使用定时器和外部中断来实现NEC红外编码的发送。以下是一个简单的示例代码,你可以根据自己的需求进行修改:
```c
#include <reg51.h>
#define FREQ_OSC 12000000UL // 晶振频率
#define T_US (1.0 / FREQ_OSC * 12) // 1个机器周期所用的时间(us)
#define IR_PORT P2 // 红外发射器连接的端口
#define IR_PIN 0 // 红外发射器连接的引脚
#define IR_OUT 0 // 红外发射器输出高电平的时间(单位:us)
#define IR_HEADER_MARK 9000 // NEC协议头部的引导码的高电平时间(us)
#define IR_HEADER_SPACE 4500 // NEC协议头部的引导码的低电平时间(us)
#define IR_BIT_MARK 560 // NEC协议数据位的高电平时间(us)
#define IR_ONE_SPACE 1690 // NEC协议数据位为1的低电平时间(us)
#define IR_ZERO_SPACE 560 // NEC协议数据位为0的低电平时间(us)
#define IR_END_MARK 560 // NEC协议结束码的高电平时间(us)
unsigned char ir_data[] = {0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF};
void delay_us(unsigned int t)
{
while (t--) {
_nop_();
_nop_();
}
}
void ir_send_bit(unsigned char bit)
{
if (bit) {
IR_PORT |= (1 << IR_PIN);
delay_us(IR_OUT);
IR_PORT &= ~(1 << IR_PIN);
delay_us(IR_ONE_SPACE - IR_OUT);
} else {
IR_PORT |= (1 << IR_PIN);
delay_us(IR_OUT);
IR_PORT &= ~(1 << IR_PIN);
delay_us(IR_ZERO_SPACE - IR_OUT);
}
}
void ir_send(unsigned char *data, unsigned char len)
{
unsigned char i, j;
// 发送头部的引导码
IR_PORT &= ~(1 << IR_PIN);
delay_us(IR_HEADER_SPACE);
IR_PORT |= (1 << IR_PIN);
delay_us(IR_HEADER_MARK - IR_OUT);
IR_PORT &= ~(1 << IR_PIN);
delay_us(IR_HEADER_SPACE);
// 发送数据位
for (i = 0; i < len; i++) {
for (j = 0; j < 8; j++) {
ir_send_bit((data[i] >> j) & 0x01);
}
}
// 发送结束码
IR_PORT &= ~(1 << IR_PIN);
delay_us(IR_END_MARK);
}
void main()
{
while (1) {
ir_send(ir_data, sizeof(ir_data) / sizeof(unsigned char));
delay_ms(1000); // 发送间隔1秒钟
}
}
```
在上述代码中,我们定义了红外发射器连接的端口和引脚,并且定义了NEC协议的编码格式。然后使用`ir_send()`函数来发送红外编码,该函数会将数据位和结束码按照NEC协议的格式发送出去。
你可以将`ir_data`数组替换为你要发送的数据,然后将代码烧录进51单片机中即可。注意在使用前需要根据实际情况进行修改端口和引脚号。
阅读全文