找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1453|回复: 0
打印 上一主题 下一主题
收起左侧

单片机红外遥控模块程序

[复制链接]
跳转到指定楼层
楼主
ID:919762 发表于 2021-8-1 18:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit lsa=P2^2;
sbit lsb=P2^3;
sbit lsc=P2^4;
sbit IRIN=P3^2;

uint jz=0,time;//jz存的是键值相对应的数值
uchar irdata[4],duan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};

void delay(uint n)          //延时一次约为0.01ms 用来判断脉冲时间
{while(n--);}

void smg(uint x)   //数码管显示
{
lsa=0;lsb=0;lsc=0;
P0=duan[x];//显示数字

}

void init()                 //初始化
{
IT0=1;//确定中断0(红外接收)的触发方式为下降沿触发
EX0=1;//打开外部中断0和总中断的允许位
EA=1;
IRIN=1;                         //相当于打开外部中断0  此处意义为红外接收器打开
}

void hhh() interrupt 0   //执行中断:进行读取信号  最后产生键值
{
uint i,j,k;
delay(700);//能进入中断函数就代表IR已经为0,此处的延时是为了判断延时的大体时间
if(IRIN==0)
{
k=1000;
while(IRIN==0&&(k>0))//检测引导码中9ms低电平
{
delay(1);
k--;
}
if(IRIN==1)//判断高电平
{
k=500;
while(IRIN==1&&(k>0))//检测引导码中4.5ms高电平
{
delay(1);
k--;
}
for(i=0;i<4;i++)        //开始读取用户码和数据和数据反码,

{
        for(j=0;j<8;j++)//每组数据有八位,故内层循环有八组,每次循环读一位
        {
         if(IRIN==0)
         {
         k=70;
         while(IRIN==0&&(k>0))//检测0.56ms的低电平
         {
         k--;
         delay(1);
         }
         }
         if(IRIN==1)//进入高电平时间,这一块比较核心,它判断了高电平持续时间的长短
         {
         time=0;
         k=500;
         while(IRIN==1&&k>0)//开始检测高电平
         {
         delay(10);
         time++;//time是以0.1ms为单位,因为dy(10);
         k--;
         }
         if(time>30) return ;
         irdata[ i]>>=1;        //移位运算,空出最高为为下一次采集做准备
         if(time>=8)//如果高电平持续时间超过0.85ms代表位是“1”
         irdata[ i]|=0x80;//或运算,给最高为置1
         time=0;//重置
         }
        }
}
}
if(irdata[2]!=~irdata[3])//irdata[2]与irdata[3]分别是数据码和数据反码 ,此操作是检验数据准确性
return;
}
switch(irdata[2])
{
case 0x16:jz=0;break;
case 0x0c:jz=1;break;
case 0x18:jz=2;break;
case 0x5e:jz=3;break;
case 0x08:jz=4;break;
case 0x1c:jz=5;break;
case 0x5a:jz=6;break;
case 0x42:jz=7;break;
case 0x52:jz=8;break;
case 0x4a:jz=9;break;
case 0x45:jz=10;break;
default:break;
}

}

void main()
{
init();//初始化
while(1)
smg(jz);//显示数值
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表