c51 红外遥控程序 注释
时间: 2024-02-11 16:09:10 浏览: 62
keil_c51红外遥控解码程序
好的,下面是一个简单的C51单片机红外遥控程序,带有注释:
```c
#include <reg52.h> // 引入STC51单片机头文件
sbit IRIN=P3^2; // 红外接收器连接的引脚
unsigned char code table[16]={0xee,0x10,0x38,0xd8,0x18,0x7a,0x5a,0x42,0x52,0x4a,0x4e,0xd2,0x1a,0x2a,0x9a,0x8a}; // 红外遥控器按键码表
void delay(unsigned int z) // 延时函数,单位:毫秒
{
unsigned int x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void init() // 模拟SPI总线初始化函数
{
IRIN=1; // 红外接收器数据线初始化为高电平
}
void main() // 主函数
{
unsigned char i,j,k; // 定义3个计数器
init(); // 初始化模拟SPI总线
while(1) // 进入循环
{
if(IRIN==0) // 如果接收到红外遥控器信号
{
delay(8); // 延时8毫秒,等待信号稳定
if(IRIN==0) // 如果信号仍然存在
{
while(IRIN==0); // 等待信号结束
for(i=0;i<16;i++) // 遍历红外遥控器按键码表
{
for(j=0;j<8;j++) // 遍历每个按键码的8个比特位
{
k=0; // 计数器清零
while((IRIN==0)&&(k<30)) // 等待低电平结束,最多等待30个循环周期
{
delay(1); // 延时1毫秒
k++; // 计数器自增
}
if(k>22) // 如果等待时间超过22个循环周期,说明这是一个1
{
j--; // 计数器自减
continue; // 继续等待下一个比特位
}
k=0; // 计数器清零
while((IRIN==1)&&(k<30)) // 等待高电平结束,最多等待30个循环周期
{
delay(1); // 延时1毫秒
k++; // 计数器自增
}
if(k<5) // 如果等待时间小于5个循环周期,说明这是一个错误的信号
{
j--; // 计数器自减
continue; // 继续等待下一个比特位
}
if(k>10) // 如果等待时间超过10个循环周期,说明这是一个0
{
table[i]&=(0xff-(1<<j)); // 对当前按键码进行与运算,将第j位变为0
}
else // 否则,说明这是一个1
{
table[i]|=(1<<j); // 对当前按键码进行或运算,将第j位变为1
}
}
}
break; // 退出循环
}
}
}
while(1) // 进入另一个循环,等待接收到红外遥控器按键信号
{
if(IRIN==0) // 如果接收到红外遥控器信号
{
delay(8); // 延时8毫秒,等待信号稳定
if(IRIN==0) // 如果信号仍然存在
{
while(IRIN==0); // 等待信号结束
for(i=0;i<16;i++) // 遍历红外遥控器按键码表
{
if(table[i]==j) // 如果接收到的信号与表中的某个按键码相等
{
// 进行相应的操作
}
}
}
}
}
}
```
以上就是一个简单的C51单片机红外遥控程序,带有注释。
阅读全文