woxiangxin 发表于 2011-5-19 23:54:42

我以前用STC89C52RC单片机写的红外解码为什么下到STC12C5A60S2单片机中就不能用了,

我以前用STC89C52RC单片机写的红外解码为什么下到STC12C5A60S2单片机中就不能用了,

------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include"1602.h"
#include"delay.h"

sbit IR=P3^3;//红外接口标志

char code Tab="0123456789ABCDEF";
/*------------------------------------------------
                全局变量声明
------------------------------------------------*/

unsigned charirtime;//红外用全局变量
    //红外接收完成标志      红外码值处理成16进制
bit   irreceok ,                irpro_ok    ;
unsigned char IRcord;
unsigned char irdata;

unsigned char TempData;
/*------------------------------------------------
                  函数声明
------------------------------------------------*/
void Ir_work(void);
void Ircordpro(void);

/*------------------------------------------------
                  定时器0中断处理
------------------------------------------------*/

void tim0_isr (void) interrupt 1 using 1
{
irtime++;//用于计数2个下降沿之间的时间
}

/*------------------------------------------------
                  外部中断0中断处理
------------------------------------------------*/
void EX1_ISR (void) interrupt 2 //外部中断0服务函数
{
static unsigned chari;             //接收红外信号处理
static bit startflag;                //是否开始处理标志位

    if(startflag)                        
       {
      if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                            i=0;
                      irdata=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
                      irtime=0;
                      i++;
                              if(i==33)
                                  {
                                     irreceok=1;
                                   i=0;
                                      }
   }
    else
    {
            irtime=0;
            startflag=1;
             
    }

}



/*------------------------------------------------
                红外码值处理
------------------------------------------------*/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;

k=1;
for(i=0;i<4;i++)      //处理4个字节
   {
      for(j=1;j<=8;j++) //处理1个字节8位
         {
          cord=irdata;
          if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
             value|=0x80;
          if(j<8)
                  {
                       value>>=1;
                        }
         k++;
         }
   IRcord=value;
   value=0;   
   }
       irpro_ok=1;//处理完毕标志位置1
}

/*------------------------------------------------
                  键值处理
------------------------------------------------*/

void Ir_work(void)
{
       TempData = Tab/16];   //处理客户码
           TempData = Tab%16];
       TempData = '-';
           TempData = Tab/16];   //处理客户码
           TempData = Tab%16];
           TempData = '-';

           TempData = Tab/16];   //处理数据码
           TempData = Tab%16];

           TempData = '-';
           TempData = Tab/16];   //处理数据反码
           TempData = Tab%16];

       LCD_Write_String(5,1,TempData);
      if(IRcord==69)
         LCD_Write_String(14,0,"1");

           irpro_ok=0;//处理完成标志

}



/*------------------------------------------------
                定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00; //重载值
TL0=0x00; //初始化值
ET0=1;    //开中断
TR0=1;   
}
/*------------------------------------------------
                  外部中断0初始化
------------------------------------------------*/
void EX1init(void)
{
IT1 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
EX1 = 1;   //使能外部中断
EA = 1;    //开总中断
}

/*------------------------------------------------
                  主函数
------------------------------------------------*/
void main(void)
{
EX1init();            //初始化外部中断
TIM0init();         //初始化定时器

LCD_Init();         //初始化液晶
DelayMs(20);          //延时有助于稳定
LCD_Clear();          //清屏

LCD_Write_String(0,0,"www.doflye.net");
LCD_Write_String(0,1,"Code:");

while(1)//主循环
   {
    if(irreceok)      //irreceok=1,说明红外接收完毕
          {   
           Ircordpro();    //红外码值处理函数
           irreceok=0;   //方便下次红外接收
          }

    if(irpro_ok)//irpro_ok=1;说明红外处理完毕
          {
           Ir_work(); //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
          }
   }
}

fetish 发表于 2011-5-20 00:01:39

如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。

jrcsh 发表于 2011-5-20 00:08:40

回复【1楼】fetish
如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。
-----------------------------------------------------------------------

ant_2009 发表于 2011-5-20 00:31:22

mark

mengzhihu2 发表于 2011-5-20 01:23:11

STC12C5A60S2这个单片机某些指令要快一些,从而导致时序不对。。。

mook_dj 发表于 2011-5-20 08:44:11

4楼正解。
STC12老妖说是1T,STC89C是传统的12T,把一个同样的流水灯下载到它俩试试看,就知道速度不一样

2343258 发表于 2011-5-20 11:32:54

严重支持4楼!

woxiangxin 发表于 2011-5-20 13:11:58

回复【楼主位】woxiangxin
-----------------------------------------------------------------------

我是个菜鸟,程序是我在别人的程序上修改的

danceman_uk 发表于 2011-5-22 12:28:05

给你一个好的实验方法.换一个DS18B20能在89C52下面有跑的程序,换到1T的STC12就可以发现,取不出温度,只要你去慢慢去改延时代码,最终也能实现和89C52一样效果.

mingquan23 发表于 2012-3-6 09:53:13

确实阿!我之前以碰到这样的情况但是知道是速度问题改改延时就可用了阿!我的是在做DS18B20上碰到的阿!

longwu911 发表于 2012-3-6 11:31:53

楼主既然是改的别人的程序,再改一次应该不是什么难事

hewayking 发表于 2012-11-8 19:23:38

将延时扩大10倍即可

彼岸花开 发表于 2012-11-8 19:47:51

STC12系列是高速单片机,时钟比52的快的多啊,红外解码的时序很重要,所以应该是时序的问题。

gaoyichuan000 发表于 2012-11-8 21:24:06

延时扩大10-12倍即可

huazhongwang 发表于 2013-3-24 13:45:09

14楼正解
页: [1]
查看完整版本: 我以前用STC89C52RC单片机写的红外解码为什么下到STC12C5A60S2单片机中就不能用了,