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 内使用。 晶体 频率11.0592M 下载的时候设置为1T就行了不过注意程序里的参数 这个芯片下载时没得选择啊! 只有12t和6T 更改延时程序
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--);
} 回复【5楼】daiqingfei
-----------------------------------------------------------------------
发错了这是12晶振的 到百度搜索这个软件支持1T延时的
单片机小精灵v1.3最新皓禹破_解版支持STC 回复【楼主位】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......
-----------------------------------------------------------------------
【保留发言权!】 看来楼主是想不劳而获 不用解码
用我们的红外遥控码识别模块
可以解任何红外码
http://www.yofeng.com/comirctrlr.asp 改定时器延时吧, 12T和1T可通用的, 因为定时器默认是12T的 我晕 mark 同4楼,STC89C52只有12T和6T模式 记号 回复【楼主位】b60885262
-----------------------------------------------------------------------
感谢分享 就是延时的问题 mark 大家都理解错了吧。楼主是想把标准51的程序改到STC的所谓1T上去吧?
页:
[1]