我以前用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(); //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
}
}
} 如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。 回复【1楼】fetish
如果这个程序真的是您亲自写的话,解决起来不过是几分钟的事情。怕就怕是抄来的,恐怕几个月都解决不了。
----------------------------------------------------------------------- mark STC12C5A60S2这个单片机某些指令要快一些,从而导致时序不对。。。 4楼正解。
STC12老妖说是1T,STC89C是传统的12T,把一个同样的流水灯下载到它俩试试看,就知道速度不一样 严重支持4楼! 回复【楼主位】woxiangxin
-----------------------------------------------------------------------
我是个菜鸟,程序是我在别人的程序上修改的 给你一个好的实验方法.换一个DS18B20能在89C52下面有跑的程序,换到1T的STC12就可以发现,取不出温度,只要你去慢慢去改延时代码,最终也能实现和89C52一样效果. 确实阿!我之前以碰到这样的情况但是知道是速度问题改改延时就可用了阿!我的是在做DS18B20上碰到的阿! 楼主既然是改的别人的程序,再改一次应该不是什么难事 将延时扩大10倍即可 STC12系列是高速单片机,时钟比52的快的多啊,红外解码的时序很重要,所以应该是时序的问题。 延时扩大10-12倍即可 14楼正解
页:
[1]