网上下载了一个参考程序,但是修改烧写进去后得不到用户码和键值,求大神指点。
STC11系列MCU
//M50560编码红外按键数值+用户码,11.0592M 设置19200
#include <STC_NEW_8051.H>
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2; //遥控接收输入脚
unsigned int CC_count= 0; //连续码计数器
unsigned char IRcoding[6]; //用来保存红外遥控的码值
/*
IRcoding[0]用户码,
IRcoding[1]用户反码
IRcoding[2]键值
IRcoding[3]键值反码
IRcoding[4]连发标志,1为连发
IRcoding[5]上次键值
*/
void send_char(unsigned char c)
{
TI=0;
SBUF=c;
while(TI==0);
TI=0;
}
void Send_out_code(void)
{
unsigned char i;
TR0=0;//停止TC0
ET0=0;//关定时器中断
EX0=0;//关外部中断0
EX1=0;
TMOD=0x21;
SCON=0x58;
TR1=0;
TH1=0xfd; //19200
TL1=0xfd;
PCON=0x80;
TR1=1;//启动TC1
// IE=0x90;
send_char('U');
send_char('s');
send_char('e');
send_char('r');
send_char(':');
i=(IRcoding[1])/16;
if(i>9) i+=0x37; else i+=0x30;
send_char(i);
i=(IRcoding[1])%16;
if(i>9) i+=0x37; else i+=0x30;
send_char(i);
send_char(0x0d);
send_char(0x0a);
TR1=0;
}
void Send_out_codea(void)
{
unsigned char i;
TR0=0;//停止TC0
ET0=0;//关定时器中断
EX0=0;//关外部中断0
EX1=0;
TMOD=0x21;
SCON=0x58;
TR1=0;
TH1=0xfd; //19200
TL1=0xfd;
PCON=0x80;
TR1=1;//启动TC1
// IE=0x90;
send_char('C');
send_char('o');
send_char('d');
send_char('e');
send_char(':');
i=(IRcoding[2])/16;
if(i>9) i+=0x37; else i+=0x30;
send_char(i);
i=(IRcoding[2])%16;
if(i>9) i+=0x37; else i+=0x30;
send_char(i);
send_char(0x0d);
send_char(0x0a);
TR1=0;
}
void DelayA(void)
{
unsigned int TempCyc;
for(TempCyc=0;TempCyc<650;TempCyc++);//3.5
}
void DelayB(void)
{
unsigned int TempCyc;
for (TempCyc=0;TempCyc<93;TempCyc++);//0.75ms
}
void INT0_Routine(void) interrupt 0
{
// unsigned char IRCode[2],IROK;
unsigned char IROK;
unsigned int TempCyc,TempCycB,TempCycA;
EX0=0;//关闭中断0
IROK=0;
DelayA();//延时等待引导码的前半部结束
DelayA();
if(!IR)//检验前半部是否过早结束,仿干扰
{
for(TempCycA=0;TempCycA<2;TempCycA++)
{
DelayA();
if(IR)//检验前半部是否过早,防干扰
{
for(TempCyc=0;TempCyc<300;TempCyc++)
if(!IR)break;//等待第一个位
if(TempCyc<300)//超时检验
{
for(TempCyc=0;TempCyc<8;TempCyc++)
{
while(!IR);//等待P32拉高,开始位的下部分
DelayB();//这里没社超时,实际应用在多功能的设计时应设超时
IRcoding[TempCycA]=IRcoding[TempCycA]>>1;
if(IR)//当延时750us后P32仍为高则当前位为1
{
IRcoding[TempCycA]=IRcoding[TempCycA]|0x80;
for(TempCycB=0;TempCycB<100;TempCycB++)
if(!IR)break;
if(TempCycB>99)
goto endchk;
}
}
}
else
goto endchk;
}
else
goto endchk;
IROK++;
}
}
endchk:
if(IROK==2)
{
Send_out_code();
Send_out_codea();
for(TempCyc=0;TempCyc<300;TempCyc++)
DelayA();
}
EX0=1;
}
void main()
{
while(1)
{
TMOD=0X01; //定时器T0,T1设置为16位定时计数模式 TMOD=00010001.
EA=1; //打开总中断
EX0=1; //打开外部中断0
IT0=1; //IT0为下降沿触发中断
TH0=0;
TL0=0; //定时器初值 1us
TR0=0;
}
}