此程序hex文件在AT89s52芯片上可以运行,验证无误。但是加载到STC15L204系列上运行时无反应,可能是解码不成功!!!,两者用的是同样的程序。求高手指导!!!
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit ir=P3^3 ;//定义红外接收端口
sbit P1_6=P1^6 ; //定义电机控制端口1
sbit P3_7=P3^7 ; //定义电机控制端口2
uchar key_code=0 ;//遥控键值
uchar new_code=0 ;//有无新按键
uint buf_key_code=0 ;//键值暂存
uchar key_bit_count=0 ;//键编码脉冲计数
uint count=0 ;//定时中断次数计数
uint buf_count=0 ;//定时中断计数暂存
uchar common_code_count=0 ;//前导码脉冲计数
uchar ir_status=0 ;//脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据编码接收区
unsigned char n,n1,n2,n3,n4;
///延时子程序1 10us
void delay_10us(unsigned char y)
{
unsigned char x ;
for(x=y;x>0;x--);
}
/////初始化
void init(void)
{
ir=1 ;
//红外端口写 1
EA=1 ;
//开总中断
TMOD=0x22 ;
//定时器0跟定时器1,模式2,8 位自动装载模式
TH0=0Xd1 ;
//定时50us
TL0=0Xd1 ;
IT0=1 ;
//INT1 下降沿触发
ET0=1 ;
//允许定时器中断
EX0=1 ;
//允许外部中断
}
/***********************************************
定时器中断
***********************************************/
///定时器中断
void time0()interrupt 1
{
count++;
//定时器中断次数累加
}
/**********************************************
外部中断,红外解码程序
**********************************************/
///外部中断
void int1()interrupt 0
{
TR0=1 ;
//开定时器中断
//如果信号合法,则放入buf_count,count 清 0,对下一个脉冲信号计时
if(count>12&&count<270)
{
buf_count=count ;
count=0 ;
}
delay_10us(10);
//延时 100us 以消除下降沿跳变抖动
//INT1 引脚稳定为低电平,则表法确实是信号,count 重新计时,因上面延时了50us,故要 补偿 1 次T0中断
if(ir==0)
{
count=2 ;
}
//若收到的信号合法,则再进行信号分析
if(buf_count>12&&buf_count<270)
{
//如果之前未收到引导码
if(ir_status==0)
{
//判断是否引导码 13.5ms
if(buf_count>210&&buf_count<270)
{
ir_status=1 ;
//系统标记
buf_count=0 ;
//
}
}
///收到引导码
else if(ir_status==1)
{
//若收完26 个脉冲
if(common_code_count>=25)
{
ir_status=2 ;
//数据解码标记
common_code_count=0 ;
//系统码计算清零
buf_count=0 ;
// 中断计数暂存清0
}
else if((buf_count>40&&buf_count<70)||(buf_count>12&&buf_count<32))
{
buf_count=0 ;
common_code_count++;
//每收到一个信号自加 1
}
}
//进入数据编码接收
else if(ir_status==2)
{
//收到数据少于8 位,则将收到的数据写入buf_key_code
if(key_bit_count<8)
{
if(buf_count>40&&buf_count<70)
{
buf_count=0 ;
buf_key_code>>=1 ;
buf_key_code|=0x80 ;
//收到 1
key_bit_count++;
//数据脉冲累加
}
//收到0
else if(buf_count>12&&buf_count<32)
{
buf_count=0 ;
buf_key_code>>=1 ;
//收到0
key_bit_count++;
}
}
//若收完 8 位数据则做以下处理
else
{
ir_status=0 ;
//接收状态返回到空闲
key_code=buf_key_code ;
key_bit_count=0 ;
buf_key_code=0 ;
buf_count=0 ;
TR0=0 ;
new_code=1 ;
}
}
}
}
/*************************************
主程序
*************************************/
void main()
{
init();_//中断初始化。
while(1)
{ _
while(!new_code);
//判断是否有新按键,如果有则执行下面程序,没有则一直循环
switch(key_code%16) //判断哪个按键。
{
case 1:{ P1_6=1; P3_7=0; };break;
case 2:{P1_6=0;P3_7=1; };break;
case 3:{P1_6=1; P3_7=1; };break;
}
new_code=0; //按键标志位清"0",进入下一次循环判断。
}
}
|