微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 大家帮看看我M50462的红外解码的程序

大家帮看看我M50462的红外解码的程序

时间:10-02 整理:3721RD 点击:
实验现象是,按1后,流水灯亮,再按次,居然变化了。
上电复位后,按1后,显示的流水灯和第一次的一样,其后也是同样变化,希望大家帮看看,调了几天。
#include <AT89x51.h>
#define SS P1
unsigned char HeardData; //定义接收到数据的高位变量
unsigned char AddData;
unsigned char CountData;
unsigned char RecvData;
bit ExeFlag;
sbit IR1=P3^3; //定义红外接收端口
void delay(unsigned i)
{
unsigned j ;
  for(j=0;j<i;j++);
}
void Timer0_IR1() interrupt 1 using 3 //定义红外定时器子程序
{
TH0=0xFF; //向定时器定时间寄存器填入高八位值
TL0=0x25; //向定时器定时间寄存器填入低八位值
AddData++; //自增变量加1   250us加1
}
void Int1_IR1() interrupt 2 //定义红外接收中断子程序
{
TH0=0xff;
TL0=0x25;
ET0=1; //打开定时器中断
TR0=1;
EX1=0;
delay(45);
if(IR1==1)
{
   TH0=0xff;
   TL0=0X25;
   ET0=0;
   TR0=0;
   EX1=1;
   return;
}
if(AddData<6) //0 //判断接收到的数据是0
{
RecvData=RecvData <<1; //将当前位向左移动1 位
RecvData=RecvData & 0xfe; //判断到0 就将当前位写0
}
if(AddData>6)//1 //判断接收到的数据是1
{
RecvData=RecvData <<1; //将当前位向左移动1 位
RecvData=RecvData | 0x01; //将当前位写1
}
CountData++; //将红外接收位计数器加1
if(CountData==9) //判断是否接收到8 位数据
{
HeardData=RecvData ; //是8 位数据时,则将数据暂存到高位变量中
RecvData=0;
}
  if(CountData==17) //判断是否接收到16 位数据
{
ET0=0; //关闭红外定时器0
TR0=0;
EX1=0; //关闭红外外部中断1
SS=0xff;  
SS=HeardData;
TH0=0xff;
TL0=0x25;
RecvData=0; //将接收到的数据清零
CountData=0; //将接收计数器清零
HeardData=0; //将接收高低数据变量清零
ExeFlag=0;
TMOD=0x01;
  EX1=1; //同意开启外部中断1
IT1=1; //设定外部中断1 为低边缘触发类型
EA=1;
AddData=0;
return; //返回
}
AddData=0;
EX1=1;
}
void main()
{
bit ExeFlag=0; //定义可执行位变量
CountData=0; //将计数器变量数值初始化
AddData=0; //将定时器计数器初始化
HeardData=0; //将高低计数器初始化
TMOD=0x01; //选择定时器0 为两个16 位定时器
TH0=0xFF; //对定时器进行计数值进行初始化
TL0=0x25; //同上,时间大约为250uS
EX1=1; //同意开启外部中断1
IT1=1; //设定外部中断1 为低边缘触发类型
EA=1; //总中断开启
while(1)
{

if(IR1==0)   
    {
      ExeFlag=1; //将可执行标志位置1
   
}  
    if(ExeFlag==0) //判断可执行标志位
     {
        EX1=1; //开启外部中断1
      }
    ExeFlag=0; //可执行标志位置0   
  }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top