#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管0~9 共阴极数码管
uchar table1[33]; //储存低电平
uchar table2[4]; //储存4位数据
sbit duan = P2^6;
sbit wei = P2^7;
sbit IR = P3^2;
sbit FM = P2^3;
bit IR_ok,IR_tf;
uchar IR_time;
void init_T() //外部中断0初始化
{
TMOD|=0x02; //方式2 8位自动载装
TH0 =0;
TL0 =0;
TR0 = 1;
ET0 = 1;
}
void init_0() //定时器T0初始化
{
IT0 = 1; //设置下降沿触发
EX0 = 1;
EA = 1;
}
void decode() //解码数据
{
uint i,j,k;
uchar byte,x;
k=1; //越过第0位引导码时间的解码
for(i=0;i<4;i++)
{
for(j=1;j<=8;j++)
{
x=table1[k];
if(x>6) //超过了"0"的时间但小于"1"的时间 也就是"1"
byte|=0x80;
else
byte=byte;
if(i<8)
{
byte>>=1;
}
k++; //开始分析table1[]下一位的时间
}
table2[i]=byte;
x=0;
}
// if(table2[2]=~table2[3])
IR_tf=1; //数据解码完成标志位
}
void EX0zhongduan() interrupt 0 //外部中断0中断
{
static uchar num=0;
static bit m;
if(!m)
{
m=1;
IR_time=0;
}
else if(m)
{
if((IR_time<49)&&(IR_time>=32))
num=0;
table1[num]=IR_time;
IR_time=0;
num++;
if(num==33)
{
num=0;
IR_ok=1;
m=0;
}
}
}
void T0zhongduan() interrupt 1 //定时器T0中断
{
IR_time++;
}
void display() //显示函数
{
switch(table2[2])//判断第三个数码值
{
case 0x0C:P0=table[1];break; //1 显示相应的按键值
case 0x18:P0=table[2];break; //2
case 0x5e:P0=table[3];break; //3
case 0x08:P0=table[4];break; //4
case 0x1c:P0=table[5];break; //5
case 0x5a:P0=table[6];break; //6
case 0x42:P0=table[7];break; //7
case 0x52:P0=table[8];break; //8
case 0x4a:P0=table[9];break; //9
default:break;
}
duan=1;
duan=0;
IR_tf=0; //处理完成标志
}
void main()
{
init_0();
init_T();
P0=0xf0;
wei=1;
wei=0;
while(1)
{
if(IR_ok) //数据储存完成
{
decode();
IR_ok=0;
}
if(IR_tf) //数据解码完成
{
FM=0;
display(); //数码管显示结果
}
}
}
都搞了两天了,原理也懂了,就是写不成功哇,我跟着人家正确的程序都写得一模一样了还是不行。。。