求助 STC11F04E接红外1838的接收程序
时间:10-02
整理:3721RD
点击:
我这个程序下进去不行,求指点
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint IR_time;
//uchar tab[]={0x9f,0x24,0x0d,0x99,0xff};//数码管编码
uchar TIME[33]={0};//存放33个波形时间
uchar Time_dat[4]={0};//存放4个解码完成的数据
sbit w1=P3^4;
sbit w2=P3^5;
//sbit fmq=P3^7;
bit IR_ok;
bit IR_chuli_ok;//将波型时间转换成逻辑电平的标志位
bit start; //标志位,开始计时标志位
void EX1_init(void)
{
IT1 = 1; //外部中断下降沿触发
EA = 1;
EX1 = 1;
}
void Time1_init(void)
{
TMOD |= 0x10; //定时器工作在方式2(8位自动重装)
TH1 = (65536-276)/256;
TL1 = (65536-276)%256;
ET1 = 1;
TR1 = 1;
}
void IR_chuli(void)
{ //将时间值转化为逻辑电平(转换成16进制函数)
uchar i,j;
uchar NUM = 1; //去除引导码,因为引导码存在数组下标为0的位置,即第1位,数据从第2位开始)
uchar HL_time; //定义一个时间变量,用于单个按键波形处理
uchar byte = 0x00; //定义一个字节变量,用于存储转换的16进制数
for(i=0;i<4;i++) //表示4类数据(客户码、客户反码、数据码、数据反码)
{
for(j=0;j<8;j++)
{
HL_time = TIME[NUM];
if(HL_time > 6) //((1.125+2.25)/2=1.687ms,277us*6=1.66ms,判断为1,否则为0)
byte |= 0x80;
else
byte = byte;
if(j < 7)
byte >>= 1; //因为最先处理低位数据,所以要用右移方法,将低位移7次,回到本来位置)
NUM++;
}
Time_dat = byte;
byte = 0x00;
}
if(Time_dat[2] == ~Time_dat[3]) //比较数据码与数据反码是否相等,相等,表示处理成功。
IR_chuli_ok = 1; //处理成功的标志,
}
void play(void)
{
switch(Time_dat[2])
{
case 0x45:{
w1=w2=0;
}break;
case 0x46:{
w2=w1=1;
}break;
default:break;
}
/*********************************************************
遥控器1(小)码值: 遥控器2(大)码值:
45 46 47 05 04 06 07
44 40 43 09 08 0a 0b
07 15 09 0d 0c 0e 0f
16 19 0d 15 14 16 17
0c 18 5e 19 18 1a 1b
08 1c 5a 11 10 12 13
42 52 4a 01 00 02 03
1d 1c 1e 1f
***********************************************************/
}
void main()
{
EX1_init();
Time1_init();
while(1)
{
//P0=0xff;
if(IR_ok) // 按键的键值时间存储完毕标志
{
IR_ok = 0;
IR_chuli(); //将键值时间转换成16进制处理函数。
}
if(IR_chuli_ok) //短按处理
{
IR_chuli_ok = 0;
play();
}
}
}
void EX1_(void) interrupt 2 //外部中断
{
static uchar xx = 0; // 设置记录波形的变量;计数 0 ~33(记录34个波形的时间)
if(!start) //第一个下降沿触发 表示解码开始
{
start = 1;
IR_time = 0;
}
else if(start) //第二个下降沿到第33个下降沿
{
if((IR_time < 50)&&(IR_time >= 32)) //剔除引导码(引导码为9000US,在8.8MS与13.8MS之间认为是引导码)
xx = 0;
TIME[xx] = IR_time; //存储按键码值时间(引导码存在数组的第一个位置,TIME[]为键值时间存储数组)
IR_time = 0;
xx++;
if(xx == 33)
{
xx = 0;
IR_ok = 1; //按键键值时间存储完成的标志,等于1表示完成
start = 0;
}
}
}
void Time1(void) interrupt 3 //定时器中断
{
TH1 = (65536-276)/256;
TL1 = (65536-276)%256;
IR_time++; //每经过256*(12/11.0592)us触发一次中断(约277US)
}