×
单片机 > 单片机程序设计 > 详情

51单片机实验14:红外通信模块应用

发布时间:2024-05-18 发布时间:
|

目的:利用遥控器与单片机通信,并将遥控器按键所对应的编码在数码管上以十六进制的形式显示出来。


开发板红外传感器数据输出引脚对应的IO口为P3^2,该IO口同时为外部中断引脚,因此程序中采用下降沿触发的外部中断来判断是否接收到起始码。


51单片机中断系统的相关内容:/zixunimg/eeworldimg/blog.csdn.net/cax1165/article/details/86633086


数码管的相关内容:/zixunimg/eeworldimg/blog.csdn.net/cax1165/article/details/86557551


开发板红外模块电路图如下:

说明:程序中大量使用了如下代码片段:


err=***;

while((irin==*)&&(err>0))

{

delay(*);

err--;

}

该代码段起到延时作用(在位定义的时序图中,需要比较严格地控制高/低电平的持续时间,该代码段可以利用延时渡过某一电平持续时间,非常准确的停留在下一个电平来临的时候),并通过err递减的方式避免出现错误导致while语句死循环。


#include

#define uc unsigned char

#define ui unsigned int

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

sbit irin=P3^2;

uc code x[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};//0x76表示H,为十六进制的标志符号

uc dig[8],irve[4];

uc t;

void delay(ui i)//延时i*10微秒

{

while(i--);

}

void digdisplay()

{

uc i;

for(i=1;i<=3;i++)

{

switch(i)

{

case(1):

LSA=0;LSB=0;LSC=0;break;

case(2):

LSA=1;LSB=0;LSC=0;break;

case(3):

LSA=0;LSB=1;LSC=0;break;

}

P0=dig[i];

delay(100);

P0=0x00;

}

}

void irinit()

{

IT0=1;

EX0=1;

EA=1;

irin=1;

}

void Ir () interrupt 0

{

uc i,j;ui err;t=0;

delay(700);

if(irin==0)

{

err=1000;

while((irin==0)&&(err>0))

{

delay(1);

err--;

}

if(irin==1)

{

err=500;

while((irin==1)&&(err>0))

{

delay(1);

err--;

}

for(i=1;i<=4;i++)

{

for(j=1;j<=8;j++)

{

err=60;

while((irin==0)&&(err>0))

{

delay(1);

err--;

}

err=500;

while((irin==1)&&(err>0))

{

delay(10);

t++;err--;

if(t>30)

{

return;

}

}

irve[i]>>=1;

if(t>8)

{

irve[i]|=0x80;

}

t=0;

}

}

}

if(irve[3]!=irve[4]) return;

}

}

void main()

{

irinit();

while(1)

{

dig[1]=x[16];

dig[2]=x[irve[3]%16];

dig[3]=x[irve[3]/16];

digdisplay();

}

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析