b60885262 发表于 2011-5-22 17:53:08

STC89C52RD 红外解码 控制继继电器 12T如何改为1T

#include <REG52.h>


#define uint unsigned int
#define uchar unsigned char

sbit IRDATA=P3^2;        //红外接收
   
sbit K1=P3^0;//
sbit K2=P3^1;//
sbit K3=P2^0;//


bit flag;
unsigned long recode;   //接收码
uint recodehigh,recodelow; //接收码的高低16位
uchardatahongwaicode;   //定义一个4字节的数组用来存储代码
uchar   CodeTemp;   //编码字节缓存变量
uchar   i,j,k;    //延时用的循环变量

void delay1ms(uint temp)
{
uint x,y;
for(x=temp;x>0;x--)
for(y=110;y>0;y--);

}
   
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k;
   for(j=18;j>0;j--)
       for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{uchar i,j;
   for(i=2;i>0;i--)
      for(j=240;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
   for(i=10;i>0;i--)
      for(j=230;j>0;j--) ;
}




/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0      
{

flag=1;
EA=0;
for(k=0;k<10;k++)
   {Delay0_9ms();
    if (IRDATA==1)         //如果0.9ms后IRDATA=1,说明不是引导码
   {k=10;break;}
    else if(k==9)         //如果持续了10×0.9ms=9ms的低电平,说明是引导码
      {while(IRDATA==0);
         Delay4_5ms();      //跳过持续4.5ms的高电平

      for(i=0;i<4;i++)       //分别读取4个字节
         {for(j=1;j<=8;j++)      //每个字节8个bit的判断
                { while(IRDATA==0);       //等待上升沿
                  Delay0_9ms();      //从上升沿那一时刻开始延时0.9ms,再判断IRDATA
                  if(IRDATA==1)   //如果IRDATA是"1",则向右移入一位"1"
                  {Delay1ms();
                   CodeTemp=CodeTemp|0x80;
                   if(j<8) CodeTemp=CodeTemp>>1;
                  }
                  else
      if(j<8)CodeTemp=CodeTemp>>1;//如果IRDATA是"0",则向右移一位,自动补"0"
               }
            hongwaicode=CodeTemp;
            CodeTemp=0;
         }
   
       }
   }


recodehigh=hongwaicode<<8|hongwaicode;
recodelow=hongwaicode<<8|hongwaicode;
recode=recodehigh;
recode=recode<<16;
recode=recode|recodelow;
EA=1;
}


void kongzhi(unsigned long temp)
{
switch(temp)
{
case 0x00ff47b8:K2=0;delay1ms(200);K2=1;K1=~K1;break;

}

}



/**************************主程序*************************/
void main()
{

IT0=1;    //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1;    //外部中断INT0开, (1:开,      0:关    )
EA=1;    //开所有中断
while(1)
{
if(flag)
{
kongzhi(recode);
flag=0;
}
}
}

这个程序在12T单片机 STC89C52里 可以正常使用。

如何改成1T单片机STC11F04E 内使用。

b60885262 发表于 2011-5-22 19:58:43

晶体 频率11.0592M

llssr 发表于 2011-5-22 20:47:16

下载的时候设置为1T就行了不过注意程序里的参数

b60885262 发表于 2011-5-22 23:50:26

这个芯片下载时没得选择啊!

heero 发表于 2011-5-24 23:32:08

只有12t和6T

daiqingfei 发表于 2011-5-26 18:09:43

更改延时程序


void delay1ms(void)   //误差 0us
{
    unsigned char a,b;
    for(b=222;b>0;b--)
      for(a=12;a>0;a--);
}

void delay900us(void)   //误差 0us
{
    unsigned char a,b;
    for(b=186;b>0;b--)
      for(a=13;a>0;a--);
}

void delay4ms500us(void)   //误差 0.000000000000us
{
    unsigned char a,b;
    for(b=66;b>0;b--)
      for(a=203;a>0;a--);
}

daiqingfei 发表于 2011-5-26 18:12:13

回复【5楼】daiqingfei
-----------------------------------------------------------------------

发错了这是12晶振的

daiqingfei 发表于 2011-5-26 18:15:16

到百度搜索这个软件支持1T延时的
单片机小精灵v1.3最新皓禹破_解版支持STC

hepday 发表于 2011-7-3 22:14:26

回复【楼主位】b60885262
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit irdata=p3^2; //红外接收
   
sbit k1=p3^0;//
sbit k2=p3^1;//
sbit k3=p2^0;//
bit flag;
unsigned long recode;   //接收码
uint recodehigh,recodelow; //接收码的高低16位
uchardatahongwaicode;   //定义一个4字节的数组用来存储代码
uchar   codetemp;   //编码字节缓存变量
uchar   i,j,k;    //延时用的循环变量
void delay1ms(uint temp)
{
uint x,y......
-----------------------------------------------------------------------

【保留发言权!】

hy8649241 发表于 2011-7-3 22:16:14

看来楼主是想不劳而获

xxdcq 发表于 2011-8-24 11:23:05

不用解码
用我们的红外遥控码识别模块
可以解任何红外码
http://www.yofeng.com/comirctrlr.asp

huaxiling 发表于 2011-8-24 13:50:35

改定时器延时吧, 12T和1T可通用的, 因为定时器默认是12T的

afei8856 发表于 2011-11-8 10:49:54

我晕

frankwang77 发表于 2011-11-8 11:34:41

mark

BXAK 发表于 2011-11-8 12:28:28

同4楼,STC89C52只有12T和6T模式

zlj2008 发表于 2011-11-14 09:35:00

记号

l28y06 发表于 2011-11-14 20:47:09

回复【楼主位】b60885262
-----------------------------------------------------------------------
感谢分享

learn5151 发表于 2011-12-2 10:22:55

就是延时的问题

madswan 发表于 2012-2-7 14:10:47

mark

gongnn 发表于 2012-2-7 14:48:01

大家都理解错了吧。楼主是想把标准51的程序改到STC的所谓1T上去吧?
页: [1]
查看完整版本: STC89C52RD 红外解码 控制继继电器 12T如何改为1T