- 积分
- 31
- 下载分
- 分
- 威望
- 点
- 原创币
- 点
- 下载
- 次
- 上传
- 次
- 注册时间
- 2013-11-5
- 精华
|
马上注册,获取阅读精华内容及下载权限
您需要 登录 才可以下载或查看,没有帐号?注册
x
/*
此程序为红外遥控,按遥控器上的按键后在数据管上显示相应的地址码和指令码
*/
#include "reg52.h"
#define uchar unsigned char
sbit hwx=P3^3; //中断1端口P3.3
uchar irtime,irdata[32],ircord[4]; //irtime:收集IR1838数据引脚低电平脉冲宽度的计数变量,根据此变量数值大小判断是0还是1
//irdata数组:地址码和指令码每位的存储数组,地址码16位,指令码8位,指令码反码8位,共32位,引导码丢弃没用
//ircord数组:将地址码和指令码做转后存储为字节的数组,以便查询num数组里面的值,在数码管上显示码值的十六进制
uchar code num[]={ //数码管显示所有数组
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit irok; //将位数转为字节数后的标志位
void delay(unsigned int k) //执行一次为50ms左右
{
uchar i;
unsigned int j;
i=250;
while(i)
{
j=k;
while(j)j--;
i--;
}
}
void tim0init() //定时器0初始化函数
{
TMOD=0x02;
ET0=1;
EA=1;
}
void ex1init() //中断1初始化函数
{
IT1=1;
EX1=1;
}
void tim0ir() interrupt 1 //定时器0中断函数
{
irtime++; //irtime为低电平宽度变量,每加1,时间将增加256微秒
}
void ex1ir() interrupt 2 //中断1中断函数
{
static uchar i; //i变量为局部静态变量,第二次进入函数时,其值不会被置0,而是接着上一次调用函数后的值运行
static bit startflag; //startflag变量:判断是引导码后,其值置1,表示接收码数据开始.接收32个位后,被置0,停止接收
uchar tmp;
tmp=10;
while(tmp) tmp--; //延时函数,消除干扰
if(hwx) //再次判断是干扰还是数据,hwx为0表示数据,为1表示是干扰产生的中断
{
return;
}
TH0=TL0=0;
TR0=1; //每位中断产生时,计数清零
if(startflag)
{
irdata=irtime;
irtime=0;
i++;
if(i==32) //当计满32位后,将相关变量清0,准备接收第二次按键
{
EX1=0; //关闭中断,延时400ms,消除有用数据后的干扰数据
TR0=0;
startflag=0;
irok=1; //接收完时,将irok置1,表示可以进行位到字节的转换
delay(200); //延时25为50ms左右,延时200既为400ms
EX1=1; //延时消除干扰后,打开中断,准备接收第二次按键
return;
}
}
if((irtime>=47)&&(irtime<56)) //如果irtime在47和56之间,确定为引导码,准备接收数据
{
i=0;
irtime=0;
startflag=1; //startflag置1后,下一次的中断既为接收址码开始
}
}
void irpro()
{
uchar i,j,k,value;
value=k=0; //此处需注意加赋值语句,不然第二次调用函数时,两个变量的初值有时不会是0
for(i=0;i<4;i++) //共四个字节需要转
{
for(j=0;j<8;j++) //每字节八位
{
value=value>>1;
if(irdata[k]>5) value=value|0x80;
k++;
}
ircord=value; //将位转为字节后的数据存入ircord数组
value=0;
}
irok=0; //转换结束标志
}
void irdisplay() //数码管显示函数
{
P1=0;
P2=num[ircord[0]/16]; //以16进制显示
delay(1);
P1=1;
P2=num[ircord[0]%16];
delay(1);
P1=3;
P2=num[ircord[2]/16];
delay(1);
P1=4;
P2=num[ircord[2]%16];
delay(1);
}
void main(void)
{
tim0init();
ex1init();
while(1)
{
if(irok)
{
irpro(); //位数转换为字节
}
irdisplay(); //显示码值
}
}
|
评分
-
查看全部评分
|