用51单片机写一个红外遥控的程序
时间: 2023-03-19 12:21:48 浏览: 149
基于51单片机的红外遥控转发器程序
5星 · 资源好评率100%
以下是一个基本的红外遥控程序示例,使用51单片机和NEC红外协议。
```
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit IR_IN = P3^2; //红外接收器的接收引脚
void Delay10us() //10微秒延时函数
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Delay500us() //500微秒延时函数
{
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
Delay10us();
}
void IR_init() //红外接收器初始化函数
{
EA = 1; //开启全局中断
EX0 = 1; //开启外部中断0
IT0 = 1; //设置外部中断0为下降沿触发
}
void IR_ISR() interrupt 0 //外部中断0的中断服务程序
{
uint high_time, low_time, time_sum;
uchar i, j, code;
high_time = 0;
low_time = 0;
time_sum = 0;
TR0 = 1; //开启定时器0
while (IR_IN == 0); //等待红外信号引脚变高
high_time = TH0; //读取定时器0高8位
low_time = TL0; //读取定时器0低8位
time_sum = (high_time << 8) | low_time;
if (time_sum > 4500 && time_sum < 5500) //NEC协议起始标志码
{
for (i = 0; i < 4; i++)
{
for (j = 0; j < 8; j++)
{
TR0 = 1; //开启定时器0
while (IR_IN == 1);//等待红外信号引脚变低
high_time = TH0; //读取定时器0高8位
low_time = TL0; //读取定时器0低8位
time_sum = (high_time << 8) | low_time;
if (time_sum > 1500 && time_sum < 1700) //NEC协议1码
{
code <<= 1;
code |= 0x01;
}
else if (time_sum > 500 && time_sum < 700) //NEC协议0码
{
code
阅读全文