打印

红外解码程序 求助 6121格式

[复制链接]
4108|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pcer|  楼主 | 2009-10-10 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下,51单片机用int0口,不知为什么,总调不好,求高手不吝指教!
#include"reg51.H"
unsigned char IRCommandData = 0;
unsigned char INTTime = 0;
bit IRInt;
bit IRok = 0;
sbit BUZZER = P3^7;
sbit P2_7 = P2^7;   //十位数码管选通
sbit P2_6 = P2^6;   //个位数码管选通

unsigned char code Tab[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                          0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};   //共阳极数码管

void Delay()
{
unsigned char i,j;
for(i = 0; i < 255; i++)
  for (j = 0; j < 5;j++)
   ;
}

void ISRInt(void) interrupt 0 using 1   // HS0038用中断0
{
EX0 = 0;         // Disable INT 0
TR0 = 0;         // Disable Timer 0
IRInt = 1;
INTTime = TH0;
TH0 = 0xB0;
TL0 = 0;
TR0 = 1;        // Enable Timer 0
EX0 = 1;        // Enable INT 0
BUZZER = 0;

BUZZER = 1;
}
bit IRDecode(void)
{
static unsigned char INTCount = 0;
static unsigned long IRData = 0;
unsigned char IRData1, IRData2, IRData3, IRData4;
if (IRInt)
{
  IRInt = 0;
   if((INTTime > 0xDE) && (INTTime < 0xE1))         // 0xDFE2 = 13.5 ms
  {
   IRData = 0;
   INTCount = 0;
  }
  else if ((INTTime > 0xB6) && (INTTime < 0xB9))   // 0xB7FB = 2.25 ms(data = 1)
  {
   IRData = (IRData << 1) + 1;
   INTCount++;
  }
  else if ((INTTime > 0xB2) && (INTTime < 0xB5))   // 0xB3FD = 1.125 ms(data = 0)
  {
   IRData = IRData << 1;
   INTCount++;
  }
  else if ((INTTime > 0xD6) && (INTTime < 0xD9))    // 0xD7E7 = 11.25 ms
  {
   IRData = 0;
   IRCommandData = 0xFF;    //repeat code flag
   return 1;
  }
  else
  {
   INTCount = 33;
   IRData = 0;
  }
  if (INTCount == 32)
  {
   IRData1 = (unsigned char)(IRData >> 24);
   IRData2 = (unsigned char)(IRData >> 16);
   IRData3 = (unsigned char)(IRData >> 8);
   IRData4 = (unsigned char)(IRData);
   IRData = 0;
   if (IRData4 == ~IRData3)
   {
    IRCommandData = IRData3;          //还原命令成功
    return 1;
   }
   else
    return 0;
  }
else
  return 0;
}
return 0;
}


void Display(unsigned char DisplayData)
{
P2_7 = 0;
    P2_6 = 1;
P0 = Tab[DisplayData & 0x0f];
Delay();
P2_7 = 1;
    P2_6 = 0;
P0 =Tab[DisplayData >> 4];
Delay();
}

void main()
{
unsigned char DisplayData = 0;
IRInt = 0;

EA = 0;
TR0 = 0;
TH0 = 0XB0;
TL0 = 0;
ET0 = 1;
    TMOD = 0X01;          //IT0 工作方式1
    TCON = 0X01;          //INT0 边沿触发
EX0 =1;
EA = 1;
while(1)
{
  IRok = IRDecode();
  if((IRok==1)&(IRCommandData!=0xff))
  {
  
   DisplayData = IRCommandData;
   
  }
   
  Display(DisplayData);
}
}

相关帖子

沙发
pcer|  楼主 | 2009-10-10 15:32 | 只看该作者
急用 请高手指教

使用特权

评论回复
板凳
古道热肠| | 2009-10-10 17:26 | 只看该作者
解码操作宜全在中断中完成,用脉冲下降沿触发中断,用定时时测量脉冲宽度,用引导信号进行同步,最好用状态机进行状态切换,最好考虑一下重码.

使用特权

评论回复
地板
古道热肠| | 2009-10-10 17:28 | 只看该作者
可在DIY板块找一下相关的代码,经"XWJ"和"芯行天下"的较为理想的范本.

使用特权

评论回复
5
pcer|  楼主 | 2009-10-11 10:53 | 只看该作者
谢谢

使用特权

评论回复
6
pcer|  楼主 | 2009-10-11 15:57 | 只看该作者
改过了 还是不行啊 麻烦有做过的 给看一下
#include"reg51.H"

unsigned char IRCommandData = 0;
unsigned char INTTime = 0;
bit IRInt;
bit IRok = 0;

sbit BUZZER = P3^7;
sbit P2_7 = P2^7;                        //十位数码管选通
sbit P2_6 = P2^6;                        //个位数码管选通


unsigned char code Tab[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                          0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};                        //共阳极数码管


void Delay()
{
        unsigned char i,j;
        for(i = 0; i < 50; i++)
                for (j = 0; j < 50;j++)
                        ;
}



void Display(unsigned char DisplayData)
{

        P0 = Tab[DisplayData & 0x0f];
        P2_7 = 0;
    P2_6 = 1;
        Delay();

        P0 =Tab[DisplayData >> 4];       
        P2_7 = 1;
    P2_6 = 0;
        Delay();
       

}

bit IRDecode(void)

{
        static unsigned char INTCount = 0;
        static unsigned long IRData = 0;
        unsigned char IRData1, IRData2, IRData3, IRData4;

       
                if((INTTime > 0xDe) && (INTTime < 0xE1))         // 0xDFE2 = 13.5 ms
                {
                        IRData = 0;
                        INTCount = 0;
                }
                else if ((INTTime > 0xB6) && (INTTime < 0xB9))   // 0xB7FB = 2.25 ms(data = 1)
                {
                        IRData = (IRData << 1) + 1;
                        INTCount++;
                }
                else if ((INTTime > 0xB2) && (INTTime < 0xB5))   // 0xB3FD = 1.125 ms(data = 0)
                {
                        IRData = IRData << 1;
                        INTCount++;
                }
                else if ((INTTime > 0xD6) && (INTTime < 0xD9))    // 0xD7E7 = 11.25 ms
                {
                        IRData = IRData;
                        IRCommandData = 0xFF;                                //repeat code flag
                        return 1;
                }
                else
                {
                        INTCount = 33;
                        IRData = 0;
                }

                if (INTCount == 32)
                {
                        IRData1 = (unsigned char)(IRData >> 24);
                        IRData2 = (unsigned char)(IRData >> 16);
                        IRData3 = (unsigned char)(IRData >> 8);
                        IRData4 = (unsigned char)(IRData);
                        IRData = 0;
                        if (IRData4 == ~IRData3)
                        {
                                IRCommandData = IRData3;          //还原命令成功
                                return 1;
                        }
                        else
                                return 0;
                }


        return 0 ;
}


void ISRInt(void) interrupt 0 using 1   // HS0038用中断0
{
        EX0 = 0;         // Disable INT 0
        TR0 = 0;         // Disable Timer 0
       
        INTTime = TH0;
        TH0 = 0XB0;
        TL0 = 0;
        TR0 = 1;        // Enable Timer 0
        EX0 = 1;        // Enable INT 0
        IRok = IRDecode();

       
}






       
void main()

{
        unsigned char DisplayData = 0;
        IRInt = 0;
       

        EA = 0;
        IE = 0X02;
        TH0 = 0XB0;
   TMOD = 0X01;          //IT0 工作方式1
   TCON = 0X01;          //INT0 边沿触发

        EX0 =1;       
        EA = 1;
       

        while(1)
        {
               
                if((IRok==1)&(IRCommandData!=0xff))
                {
                        DisplayData=IRCommandData;
                }
                               
                Display(DisplayData);
        }
}

使用特权

评论回复
7
pcer|  楼主 | 2009-10-11 17:07 | 只看该作者
手头没有 示波器 麻烦大家有做过的 给指正一下啊

使用特权

评论回复
8
古道热肠| | 2009-10-12 10:52 | 只看该作者
先用代码测一下红外线脉冲的脉宽,再检查定时初始及判据是否合适.测试脉宽的代码在附件中
Ir脉冲分析.rar (1.68 KB)

使用特权

评论回复
9
pcer|  楼主 | 2009-10-23 09:02 | 只看该作者
8# 古道热肠
谢谢 古道热肠 的热情
问题已解决

使用特权

评论回复
10
贺信| | 2009-10-23 13:27 | 只看该作者
本帖最后由 贺信 于 2009-10-23 13:41 编辑

能不能分享一下你的问题解决办法呢??
那里错了呀??

使用特权

评论回复
11
贺信| | 2009-10-23 22:55 | 只看该作者
1# pcer

大哥你的晶体是多大的呀??能不能告诉一下你的程序错在那吗??也好让后来这学习一下嘛

使用特权

评论回复
12
zjswuyunbo| | 2009-10-25 08:42 | 只看该作者
呵呵,最好说下怎么解决,也不枉别人热心帮你……

使用特权

评论回复
13
贺信| | 2009-10-25 09:15 | 只看该作者
是呀!!!!LZ呢???:o

使用特权

评论回复
14
pcer|  楼主 | 2009-11-20 13:27 | 只看该作者
改了很多 具体是什么 都忘了
但要记住,各端口定义是否正确,和是否在中断中调用扫描程序

使用特权

评论回复
15
pcer|  楼主 | 2009-11-20 13:29 | 只看该作者
/**********************************************************************************************
*
*                             红外线遥控接收检测控制程序 V1.0
*
*                        红外线接收检测用的子程序
*
*        文件名        : IR_KEY.C
*        设计者        : 李东荣(EMAIL:JDLDR@21CN.COM,QQ:20475125)
************************************************************************************************
*                                   功 能 描 述
*
*        1. 红外接收头必需接在外部中断的引脚上
*        2. 该程序需要占用一个计数器
************************************************************************************************/
#include"reg51.h"
#ifdef DEBUG
sbit P2_7 = P2^7;                        //十位数码管选通
sbit P2_6 = P2^6;                        //个位数码管选通
unsigned char code Tab[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                          0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};                        //共阳极数码管
#endif
/***********************************************************************************************
                                        硬件配置
************************************************************************************************/

#define         IR_T                        0                                        //使用使用计时器号;0=使用计时器0;1=计时器1
sbit                IR_IN        =                P3^2;                                //红外线输入引脚地址

/***********************************************************************************************
                                        软件配置
************************************************************************************************/
#define        IR_USESCAN                0                                        //是否启用用户码扫描
#define        IR_USENO                0x00                                //用户码
#define        IR_FOSC                        11059200                        //CPU FOSC




/***********************************************************************************************
                                        参数设置
************************************************************************************************/
sbit                IR_EA                        =        0xAF;                        //总中断开关

//****************************设置使用计数器地址*******************************//
sfr                IR_TMOD        =        0x89;                        //定时器工作方式寄存器
#if IR_T==0                                                        //使用计数器0
#define        IR_TINT                        1                                //设置计数器中断源
sfr                IR_TL                =        0x8A;                        //设置使用计数器低8位位置       
sfr                IR_TH                =        0x8C;                        //设置使用计数器高8位位置
sbit                IR_TR                =        0x8C;                        //计数启动开样地址
sbit                IR_ET                =        0xA9;                        //计时器中断许可位
sbit                IR_TF                =        0x8D;                        //计时器中断溢出位
#endif
#if (IR_T==1)                                                        //使用计数器1
#define        IR_TINT                3                                //设置计数器中断源
sfr                IR_TL                =        0x8B;                        //设置使用计数器低8位位置       
sfr                IR_TH                =        0x8D;                        //设置使用计数器高8位位置
sbit                IR_TR                =        0x8E;                        //计数启动开样地址
sbit                IR_ET                =        0xAB;                        //计时器中断许可位
sbit                IR_TF                =        0x8F;                        //计时器中断溢出位
#endif
//****************************设置时时间相关*******************************//
#if (IR_FOSC==12000000)
#define IR_Start_Time        9000                                //同步头长度(单位为机器周期)
#define IR_Exp_Time                2500                                //连发高电平的长度
#define IR_New_Time                4500                                //为新代码的时高电平长度
#define IR_C0_Time                1120                                //为0电平时的时时间长度
#define IR_C1_Time                2250                                //为1电平时的时间长度
#define IR_Warp_Time        500                                        //偏差的最大时间长度 0.5ms
#define IR_RSTOUT                10                                        //
#endif
#if (IR_FOSC==11059200)
#define IR_Start_Time        8294                                //同步头长度(单位为机器周期)
#define IR_Exp_Time                2304                                //连发高电平的长度
#define IR_New_Time                4147                                //为新代码的时高电平长度
#define IR_C0_Time                1032                                //为0电平时的时时间长度
#define IR_C1_Time                2073                                //为1电平时的时间长度
#define IR_Warp_Time        460                                        //偏差的最大时间长度 0.5ms
#define IR_RSTOUT                10                                        //
#endif
/***********************************************************************************************
                                        IRKEY全局变量声明
************************************************************************************************/
unsigned char IR_RSTNUM;
unsigned char DisplayData = 0;
unsigned char Data;

sbit J1 = P1^4;
sbit J2 = P1^5;
sbit BUZZER = P1^6;
sbit LED_Run = P2^0;                 //运行指示
sbit LED_Strong = P2^1;                                       
sbit LED_Weak = P2^2;       
sbit LED_Half = P2^3;
sbit LED_One = P2^4;
sbit LED_Tow = P2^5;                               

#ifdef BUTTON
sbit BUTTON_Run = P1^4;                     // 开关
sbit BUTTON_Strong = P1^5;
sbit BUTTON_Weak = P1^6;
sbit BUTTON_Time = P1^7;
#endif

bit On_Off = 0;
bit Strong = 1;

unsigned int Ts;
bit Tc = 1;
unsigned char Time = 0;
unsigned char T_num = 0;

//****************************按键定义部份*******************************//

/***********************************************************************************************
函数名称:        IRKEY 计数器加载子程序
函数原型:        void IR_SETT(unsigned int TS,bit ET)
函数功能:        初始化计数器的数值
输入参数:        TH        :加载到计数器的高8位值
                        TL        :加载到计数器的低8位值
                        ET        :计数器溢出时是否进入中断程序
返回参数:        无
创建日期:        2008年4月10日
修改日期:       
有关说明:       
编写作者:        李东荣(EMAIL:JDLDR@21CN.COM,QQ:20475125)
************************************************************************************************/       
void IR_SETT(unsigned int TS)
{unsigned char TH,TL;
        unsigned int TempTS;
        IR_TR=0;                                                                        //停止计数
        IR_ET=0;                                                                        //设置是否中断
        TempTS=TS;
        TempTS>>=8;
        TH=(unsigned char)(TempTS);
        TL=(unsigned char)(TS&0x00FF);
        IR_TH=TH;                                                                        //加载高8位数值
        IR_TL=TL;                                                                        //加载低8位数值
        IR_TR=1;                                                                        //开始计数
}
/***********************************************************************************************
函数名称:        IRKEY 读取计数器子程序
函数原型:        unsigned int IRKEY_ReadT(void)
函数功能:        初始化计数器的数值
输入参数:        TH        :加载到计数器的高8位值
                        TL        :加载到计数器的低8位值
                        ET        :计数器溢出时是否进入中断程序
返回参数:        无
创建日期:        2008年4月10日
修改日期:       
有关说明:       
编写作者:        李东荣(EMAIL:JDLDR@21CN.COM,QQ:20475125)
************************************************************************************************/       
unsigned int IR_ReadT(void)
{
        unsigned int TimeT;
        IR_TR=0;
        TimeT=IR_TH;
        TimeT<<=8;
        TimeT=TimeT|IR_TL;
        return(TimeT);
}
/***********************************************************************************************
函数名称:        IRKEY启动设置
函数原型:        void IRKEY_Start(void)
函数功能:        初始化及启动IR及KEY的设置
输入参数:        无
返回参数:        无
创建日期:        2008年4月10日
修改日期:       
有关说明:       
编写作者:        李东荣(EMAIL:JDLDR@21CN.COM,QQ:20475125)
************************************************************************************************/
void IR_Start(void)
{       
        EX0 = 1;
        ET0 = 0;
        IR_EA = 1;

}


/************************************************************************************************
函数名称:        IR扫描程序
函数原型:  unsigned char IR_Scan(void)
函数功能:        扫描IR
输入参数:        无
返回参数:        用户码
创建日期:        2009年10月19
修改日期:       
有关说明:  需用INT0调用       
编写作者
*******************************************************************************************************/
unsigned char IR_Scan(void)
{
        unsigned int Time_Width;                                //脉冲宽度
        unsigned char IR_Scan[4]={0xFF,0xFF,0xFF,0xFF};                                //存储红外编码用
        unsigned char        Index1,Index2,TMODT;                        //用于计数器
        IR_EA=0;                                                        //关中断
        if (!IR_IN)
        {
                //****************************设置计数器计数方式*******************************//
                //设置计数器计数方式为方式1
                IR_TR=0;
                IR_TF=0;
                #if        (IR_T==0)                        //使用计数器0时                               
                        TMODT=IR_TMOD;
                        TMODT=TMODT&0xF0;
                        TMODT=TMODT|0x01;
                        IR_TMOD=TMODT;
                #endif
                #if        (IR_T==1)                        //使用计数器1时
                        TMODT=IR_TMOD;
                        TMODT=TMODT&0x0F;
                        TMODT=TMODT|0x10;
                        IR_TMOD=TMODT;
                #endif
                //********************************************************************************************
                //                                                检测同步头(9ms)
                //********************************************************************************************
                IR_SETT(65535-IR_Start_Time-IR_Warp_Time);                                //设置计数为计数初值 9ms+偏差值
                while ((!IR_IN)&&(!IR_TF));
                Time_Width=IR_ReadT()-(65535-IR_Start_Time-IR_Warp_Time);
                if (!((Time_Width<(IR_Start_Time+IR_Warp_Time))&&(Time_Width>(IR_Start_Time-IR_Warp_Time))))
                {
                goto IR_SCAN_ERR;
                }

使用特权

评论回复
16
pcer|  楼主 | 2009-11-20 13:29 | 只看该作者
//********************************************************************************************
//                                                区分 连发代码 与 新代码
//********************************************************************************************
                IR_SETT(65535-IR_New_Time-IR_Warp_Time);                                //设置计数为计数初值 4.5ms+偏差值
                while ((IR_IN)&&(!IR_TF));
                Time_Width=IR_ReadT()-(65535-IR_New_Time-IR_Warp_Time);
//********************************************************************************************
//                                                连发代码处理子程序
//********************************************************************************************
                if ((Time_Width<(IR_Exp_Time+IR_Warp_Time))&&(Time_Width>(IR_Exp_Time-IR_Warp_Time)))         //在如高脉冲长约为2.5ms,则为重复按键已按下
                {
                                                                //发出重复命令
                        IR_RSTNUM++;
                        if (IR_RSTNUM>IR_RSTOUT)
                         {
                                IR_Scan[2]=0xFE;                    //重复码 返回值
                                IR_RSTNUM=0;
                        }
                        goto IR_SCAN_ERR;
                }
//********************************************************************************************
//                                                新代码处理子程序
//********************************************************************************************
                if ((Time_Width<(IR_New_Time+IR_Warp_Time))&&(Time_Width>(IR_New_Time-IR_Warp_Time)))        //在如高脉冲长约为4.5ms,则为新按键按下
                {
            //检测新的按键码
                          for(Index1=0;Index1<4;Index1++)                                //检测四个用户码
                          {
                                   for(Index2=0;Index2<8;Index2++)
                                   {
                                                IR_SETT(65535-IR_C1_Time-IR_Warp_Time);                                        //延时2.75ms
                                                 while((!IR_IN)&&(!IR_TF));
                                                if (IR_TF) goto IR_SCAN_ERR;                        //如果超时测退出
                                                while((IR_IN)&&(!IR_TF));
                                                if (IR_TF) goto IR_SCAN_ERR;                        //如果超时测退出
                                                Time_Width=IR_ReadT()-(65535-IR_C1_Time-IR_Warp_Time);
                                                if((Time_Width<(IR_C0_Time+IR_Warp_Time))&&(Time_Width>(IR_C0_Time-IR_Warp_Time)) )
                                                {       
                                                                IR_Scan[Index1]>>=1;                       
                                                }
                                                if((Time_Width<(IR_C1_Time+IR_Warp_Time))&&(Time_Width>(IR_C1_Time-IR_Warp_Time)))
                                                {
                                                                IR_Scan[Index1]>>=1;
                                                                IR_Scan[Index1]=IR_Scan[Index1]|0x80;
                                                }               
                                           }
                        }
                                IR_SETT(65535-IR_C1_Time-IR_Warp_Time);                                        //延时2.75ms        最后的结束码
                                while(!IR_TF);
                                IR_RSTNUM=0;
//********************************************************************************************
//                                                验计用户码及校验
//********************************************************************************************
                        #if (IR_USESCAN)                                                                        //用户码校验
                                if (IR_USENO!=IR_Scan[0])
                                {
                                        IR_Scan[0]=0xFF;
                                        IR_Scan[1]=0xFF;
                                        IR_Scan[2]=0xFF;
                                        IR_Scan[3]=0xFF;
                                }
                        #endif               
                }
        }
IR_SCAN_ERR:
IR_EA=1;                                                        //打开中断
return(IR_Scan[2]);       

}

/********************led显示延时*****************************/
#ifdef DEBUG

void Delay()
{
        unsigned char i,j;
        for(i = 0; i < 50; i++)
                for (j = 0; j < 50;j++)
                        ;
}


/*********************显示子程序******************************/

void Display(unsigned char DisplayData)
{

        P0 = Tab[DisplayData & 0x0f];                                                                        //P0为显示数据输入位
        P2_7 = 0;
   P2_6 = 1;
        Delay();

       
        P0 =Tab[DisplayData >> 4];       
        P2_7 = 1;
    P2_6 = 0;
        Delay();
       
}

#endif

/*****************定时器1初始化**********************/

void Time_start(void)
{
        EA = 0;
        TMOD = TMOD&0x0f;
        TMOD = TMOD|0x10;
        TH1 = 0x4c;
        TL1 = 0x00;
        ET1 = 1;
        TR1 = 1;
        EA = 1;
}
/*****************按键处理*****************************/

void Key_Scan(void)
{

        if(DisplayData==0x12)
        {
       
                On_Off =!On_Off;
               
                Ts = 0;
                T_num        = 0;
                Time = 0;
                LED_Half = 1;
                LED_One = 1;
                LED_Tow = 1;
                Strong = 1;               
       
        }

        if(DisplayData == 0x06)
        {
                        Strong = !Strong;
               
        }

               
        if(DisplayData==0x03)
        {
                T_num = 0;
                Time++;
                if(Time == 4)
                {
                Time=0;
                }
        }

        DisplayData = 0;
#ifdef BUTTON
        unsigned int i;
        if(!BUTTON_Run)
        {       
                BUZZER = 0;
                for(i=0;i<100;i++);
               
                if(!BUTTON_Run)
                {
                        On_Off=!On_Off;
                }
                while(!BUTTON_Run);
                BUZZER = 1;
        }
       
       

        if(!BUTTON_Strong)
        {
                if(On_Off == 1)
                {
                        BUZZER = 0;
                }
                for(i=0;i<100;i++);
               
                if(!BUTTON_Strong)
                {
                        Strong = 1 ;
                }
                while(!BUTTON_Strong);
                BUZZER = 1;
        }

                if(!BUTTON_Weak)
                {
                        if(On_Off == 1)
                        {
                                BUZZER = 0;
                        }
                        for(i=0;i<100;i++);
               
                        if(!BUTTON_Weak)
                        {
                                Strong = 0 ;
                        }
                        while(!BUTTON_Weak);
                        BUZZER = 1;
                }


        if(!BUTTON_Time)
        {
                if(On_Off == 1)
                {
                        BUZZER = 0;
                }
                for(i=0;i<100;i++);
               
                if(!BUTTON_Time)
                {
                        Time++ ;
                        T_num = 0;
                        if(Time==4)
                        {
                                Time=0;
                        }
                }
                while(!BUTTON_Time);
                BUZZER = 1;
        }
#endif

               

}

/*************************主函数***************************/

void main()

{


Time_start();
IR_Start();


        while(1)
        {
#ifdef DEBUG
                Display(Data);
#endif               
                Key_Scan();       
       
                if((Time != 0)&&(On_Off == 1))       
                {
                        switch(Time)
                        {
                               

                                case 1: LED_Half = 0;
                                                  LED_One = 1;
                                                  LED_Tow = 1;
                                                  break;

                                  case 2: LED_Half = 1;
                                                  LED_One = 0;
                                                  LED_Tow = 1;
                                                  break;

                                 case 3: LED_Half = 1;
                                                   LED_One = 1;
                                                   LED_Tow = 0;
                                                   break;
                        }

                        if((T_num  == Time)||(T_num >20))
                        {       
                                Time = 0;
                                T_num = 0;
                                On_Off = 0;

                                LED_Half = 1;
                           LED_One = 1;
                           LED_Tow = 1;
                        }
                }

                else
                {
                        LED_Half = 1;
                   LED_One = 1;
                   LED_Tow = 1;
                }

                if(On_Off == 1)
                {       
                        LED_Run = 0;
                        if(Strong == 0)
                        {
                                LED_Strong=1;
                                LED_Weak = 0;
                                if(Tc==1)
                                {
                                        J1 = 0;
                                        J2 = 1;
                                }
                                else
                                {
                                        J1 = 1;
                                        J2 = 0;
                                }
                        }
                        else
                        {
                                LED_Strong=0;
                                LED_Weak = 1;
                                J1 = 0;
                                J2 = 0;
                        }
                }
                else if(On_Off == 0)
                {
                        LED_Run = 1;
                        LED_Strong=1;
                        LED_Weak = 1;
                        J1 = 1;
                        J2 = 1;
                }               
        }
}
/***************INT0处理*******************/

ISR() interrupt 0 using 0
{
        unsigned int i;
        unsigned char TempData;
       
        if(On_Off == 1)
        {
                BUZZER = 0;       
        }
        TempData=IR_Scan();
        if(TempData != 0xff)
        {
                DisplayData = TempData;
                Data = TempData;
        }
        for(i=0;i++;i<100);
        BUZZER = 1;


}


/******************定时器1中断**************/

void Time1(void) interrupt 3 using 1
{       
        Ts++;

        ET1 = 0;
        TR1 = 0;
        TH1 = 0x4c;
        TL1 = 0x00;
        ET1 = 1;
        TR1 = 1;

        if(Ts == 36100)
                {               
                        Ts = 0;
                        Tc =!Tc;
                       
                        T_num++;
                       
                }
       
}

使用特权

评论回复
17
sheji105| | 2009-11-20 15:04 | 只看该作者
路过。。。。

使用特权

评论回复
18
古道热肠| | 2009-11-20 15:05 | 只看该作者
谢谢共享,Mark一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

49

帖子

0

粉丝