51单片机发射红外代码
时间: 2023-07-02 19:11:14 浏览: 260
以下是基于51单片机的红外发射代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar irsend[4]={0x00,0x00,0x00,0x00}; // 红外码
uchar ircount=0; // 发送次数计数器
void delayms(uint xms) // 延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void sendone() // 发送一个脉冲
{
P1|=0x08; // P1.3置高
_nop_();
_nop_();
P1&=0xF7; // P1.3置低
}
void sendzero() // 发送零脉冲
{
P1|=0x08; // P1.3置高
P1&=0xF7; // P1.3置低
}
void sendbyte(uchar byte) // 发送一个字节
{
uchar i;
for(i=0;i<8;i++)
{
if(byte&0x80)
sendone();
else
sendzero();
byte<<=1;
}
}
void sendir(uchar *code) // 发送红外码
{
uchar i;
for(i=0;i<4;i++)
sendbyte(code[i]);
}
void main()
{
TMOD=0x01; // 定时器0为模式1
TH0=0x4C; // 定时器0计数初值,100us
TL0=0x00;
TR0=1; // 开始计数
ET0=1; // 开启定时器0中断
EA=1; // 全局中断开启
while(1)
{
if(ircount>0) // 发送计数器大于0,则发送红外码
{
sendir(irsend);
ircount--;
delayms(50); // 延时50ms
}
}
}
void timer0() interrupt 1 // 定时器0中断处理函数
{
TH0=0x4C; // 定时器0计数初值,100us
TL0=0x00;
if(ircount==0) // 如果没有需要发送的红外码,返回
return;
if(ircount%2==0) // 发送偶数次,发头
{
sendone();
delayms(9);
sendzero();
delayms(4.5);
}
else // 发送奇数次,发尾
{
sendone();
delayms(2.25);
sendzero();
delayms(1.125);
}
}
```
这个程序可以通过 P1.3 引脚发送红外信号。红外码存储在 `irsend` 数组中,每个元素为一个字节,总共四个字节。`ircount` 为发送次数计数器,当它大于0时,程序会不断发送红外码。
在 `timer0` 中断处理函数中,根据发送次数的奇偶性,发送红外信号的头部或尾部。发送红外码的具体实现在 `sendir` 函数中,它会调用 `sendbyte` 函数发送一个字节的数据。在 `sendbyte` 函数中,会将每个字节中的每一位逐个发送出去。发送一个脉冲的函数为 `sendone`,发送零脉冲的函数为 `sendzero`。函数中的时间参数需要根据实际情况进行调整。
阅读全文