黄金会员
主题
回帖0
积分7991
阅读权限40
注册时间2012-3-20
最后登录1970-1-1
在线时间 小时
|
我也在做毕业设计用到这个,参考下这段语句
#include"reg51.h"
#include"2-16.h"
#include"address.h"
uchar data psCount; //定时器计数器
uchar data i;
uchar data j;
uchar data temp;
uchar data dp[4]; //用来保存红外遥控的码值
uchar data dp2[12];//用来显示红外遥控的码值
sbit HW = P3^7;
void delay(unsigned int y);
void main()
{
//初始化
initlcd();
dp[0] = 0x0;
dp[1] = 0x0;
dp[2] = 0x0;
dp[3] = 0x0;
TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
TH1 = 0xfe; //定时500uS
TL1 = 0x33;
TCON = 0x01;
IE = 0x80;
TR1 = 1;
while(1)
{
//报文头
ET1 = 0;
psCount = 0;
while(HW == 1); //初始状态下,红外输出脚一直是高电平,等待遥控按键
ET1 = 1;
while(HW == 0);
if( psCount > 17)//0.5* 17 = 8.5ms约为9.0ms
{
ET1 = 0;
psCount = 0;
ET1 = 1;
while(HW == 1);
if(psCount > 5) //超过0.5*5 = 2.5毫米,检查一下遥控命令是不是连发,不是则执行下面的程序
{
ET1 = 0;
psCount = 0;
dp[0] = 0x0;
dp[1] = 0x0;
dp[2] = 0x0;
dp[3] = 0x0;
//数据
for(i = 0 ; i < 4; i++)
{
for(j = 0; j < 8; j++)
{
while(HW == 0);
ET1 = 0;
psCount = 0;
ET1 = 1;
while(HW == 1);
if(psCount > 2)//根据波形长度判定码值为0或1
temp = 0;
else
temp = 1;
dp |= (temp<<j);//保存键值
}
}
}
}
//停止位
while(HW == 1);
//数据显示
delay(20);
dp2[0] = dp[0]/100 + 0x30;
dp2[1] = dp[0]%100/10 + 0x30;
dp2[2] = dp[0]%10 + 0x30;
dp2[3] = dp[1]/100 + 0x30;
dp2[4] = dp[1]%100/10 + 0x30;
dp2[5] = dp[1]%10 + 0x30;
dp2[6] = dp[2]/100 + 0x30;
dp2[7] = dp[2]%100/10 + 0x30;
dp2[8] = dp[2]%10 + 0x30;
dp2[9] = dp[3]/100 + 0x30;
dp2[10] = dp[3]%100/10 + 0x30;
dp2[11] = dp[3]%10 + 0x30;
printf(dp2,12);
delay(20);
}
}
//延时子程序
void delay(unsigned int y)
{
uchar x;
for(;y!=0;y--)for(x=200;x!=0;x--);
}
//定时器1中断
void timer1() interrupt 3
{
psCount++;
TH1 = 0xfe; //定时500uS
TL1 = 0x33;
}
|
|